зеркало из https://github.com/mozilla/gecko-dev.git
172 строки
4.4 KiB
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);
|
|
}
|
|
}
|