gecko-dev/lib/libi18n/nscstr.c

172 строки
4.4 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "intlpriv.h"
#include "libi18n.h"
/* Private Function */
PRIVATE void
INTL_CompoundStrAddSeg_p(
INTL_CompoundStr* This,
INTL_Encoding_ID inencoding,
unsigned char* intext);
PRIVATE INTL_CompoundStr* INTL_CompoundStrNewSeg_p(INTL_Encoding_ID inencoding, unsigned char* intext);
/*
Not Support Function - Too Complex to Implement!!! Believe it or not.
INTL_CompoundStrComp : We currently dont implement this funciton. If we decide to implement it. We should use the following algorithm
(1) Compare each segment. If all match, return 0.
(2) Convert both string to Unicode and them compare. If it equal in Unicode, return 0
(3) If they are not the same in Unicode, we have to pick one sorting sequence to decide wheather it should return 1 or -1.
The problem is which sorting order should we follow ? We need to decide :
(a) the sorting order in one script,
(b) the sorting order between scripts
*/
/* Implementation */
PUBLIC INTL_CompoundStr* INTL_CompoundStrFromStr(INTL_Encoding_ID inencoding, unsigned char* intext)
{
return INTL_CompoundStrNewSeg_p(inencoding, intext);
}
#define TMPLEN 256
PUBLIC INTL_CompoundStr*
INTL_CompoundStrFromUnicode(INTL_Unicode* inunicode, uint32 inunicodelen)
{
INTL_Encoding_ID encoding;
unsigned char TMP[TMPLEN];
INTL_UnicodeToStrIterator iterator;
if((iterator = INTL_UnicodeToStrIteratorCreate(inunicode,
inunicodelen,
&encoding,
&TMP[0], TMPLEN))!=NULL)
{
INTL_CompoundStr *This;
This = INTL_CompoundStrNewSeg_p(encoding, &TMP[0]);
if(This != NULL)
{
while(INTL_UnicodeToStrIterate(iterator, &encoding, &TMP[0], TMPLEN))
INTL_CompoundStrAddSeg_p(This, encoding, &TMP[0]);
}
INTL_UnicodeToStrIteratorDestroy(iterator);
return This;
}
return NULL;
}
PUBLIC INTL_CompoundStrIterator
INTL_CompoundStrFirstStr(INTL_CompoundStr* This, INTL_Encoding_ID *outencoding, unsigned char** outtext)
{
if(This == NULL)
return NULL;
else
{
*outencoding = This->encoding;
*outtext = This->text;
return ((INTL_CompoundStrIterator)This);
}
}
PUBLIC INTL_CompoundStrIterator
INTL_CompoundStrNextStr(INTL_CompoundStrIterator iterator, INTL_Encoding_ID *outencoding, unsigned char** outtext)
{
INTL_CompoundStr* This = (INTL_CompoundStr*)iterator;
return INTL_CompoundStrFirstStr(
This->next,
outencoding, outtext);
}
PUBLIC void
INTL_CompoundStrDestroy(INTL_CompoundStr* This)
{
INTL_CompoundStr* Next;
for(; (This != NULL); This=Next)
{
if(This->next)
Next=This->next;
else
Next=NULL;
XP_FREE(This->text);
XP_FREE(This);
}
}
PUBLIC INTL_CompoundStr*
INTL_CompoundStrClone(INTL_CompoundStr* s2)
{
if(s2 != NULL)
{
INTL_CompoundStr* This;
This=INTL_CompoundStrNewSeg_p(s2->encoding, s2->text);
This->next=INTL_CompoundStrClone(s2->next);
return This;
}
return NULL;
}
PRIVATE
void
INTL_CompoundStrCat_p(INTL_CompoundStr* s1, INTL_CompoundStr* s2)
{
if(s1->next != NULL)
INTL_CompoundStrCat_p(s1->next, s2);
else
s1->next = INTL_CompoundStrClone(s2);
}
PUBLIC void
INTL_CompoundStrCat(INTL_CompoundStr* s1, INTL_CompoundStr* s2)
{
if((s2 != NULL) && (s2->text[0]))
INTL_CompoundStrCat_p(s1, s2);
}
PRIVATE
INTL_CompoundStr*
INTL_CompoundStrNewSeg_p(INTL_Encoding_ID inencoding, unsigned char* intext)
{
INTL_CompoundStr *This;
This = XP_ALLOC(sizeof(INTL_CompoundStr));
if(This != NULL)
{
char *p_text=0;
StrAllocCopy(p_text, (char*)intext);
This->text = (unsigned char*)p_text;
This->next = NULL;
This->encoding = inencoding;
}
return This;
}
PRIVATE
void
INTL_CompoundStrAddSeg_p(
INTL_CompoundStr* This,
INTL_Encoding_ID inencoding,
unsigned char* intext)
{
if(*intext)
{
for(;This->next;This=This->next)
;
This->next = INTL_CompoundStrNewSeg_p(inencoding,intext);
}
}