git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@14420 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2002-09-08 08:53:35 +00:00
parent eeb07474d3
commit dadcd7f022
5 changed files with 234 additions and 198 deletions

View file

@ -1,3 +1,11 @@
2002-09-08 Richard Frith-Macdonald <rfm@gnu.org>
* Headers/gnustep/base/GSIArray.h: Minor optimisation
* Headers/gnustep/unicode/gsm0338.h: Correct unicode to gsm table
* Source/Unicode.m: Correct gsm conversion and optimise unicode to
8-bit charaacter conversion for other character sets. Also correct
lossy/non-lossy conversion using iconv.
2002-08-30 Adam Fedor <fedor@gnu.org>
* Version: 1.5.0

View file

@ -278,7 +278,7 @@ GSIArrayInsertionPosition(GSIArray array, GSIArrayItem item,
/*
* Binary search for an item equal to the one to be inserted.
*/
for (index = upper/2; upper != lower; index = lower+(upper-lower)/2)
for (index = upper/2; upper != lower; index = (upper+lower)/2)
{
NSComparisonResult comparison;

View file

@ -138,134 +138,134 @@ unichar GSM0338_char_to_uni_table[] =
_ucc_ GSM0338_uni_to_char_table[] =
{
{0x0080,0x80},
{0x0081,0x81},
{0x0082,0x82},
{0x0083,0x83},
{0x0084,0x84},
{0x0085,0x85},
{0x0086,0x86},
{0x0087,0x87},
{0x0088,0x88},
{0x0089,0x89},
{0x008A,0x8A},
{0x008B,0x8B},
{0x008C,0x8C},
{0x008D,0x8D},
{0x008E,0x8E},
{0x008F,0x8F},
{0x0090,0x90},
{0x0091,0x91},
{0x0092,0x92},
{0x0093,0x93},
{0x0094,0x94},
{0x0095,0x95},
{0x0096,0x96},
{0x0097,0x97},
{0x0098,0x98},
{0x0099,0x99},
{0x009A,0x9A},
{0x009B,0x9B},
{0x009C,0x9C},
{0x009D,0x9D},
{0x009E,0x9E},
{0x009F,0x9F},
{0x00A0,0xA0},
{0x00A4,0xA4},
{0x00A7,0xA7},
{0x00A8,0xA8},
{0x00AD,0xAD},
{0x00B0,0xB0},
{0x00B4,0xB4},
{0x00B8,0xB8},
{0x00C1,0xC1},
{0x00C2,0xC2},
{0x00C4,0xC4},
{0x00C7,0xC7},
{0x00C9,0xC9},
{0x00CB,0xCB},
{0x00CD,0xCD},
{0x00CE,0xCE},
{0x00D3,0xD3},
{0x00D4,0xD4},
{0x00D6,0xD6},
{0x00D7,0xD7},
{0x00DA,0xDA},
{0x00DC,0xDC},
{0x00DD,0xDD},
{0x00DF,0xDF},
{0x00E1,0xE1},
{0x00E2,0xE2},
{0x00E4,0xE4},
{0x00E7,0xE7},
{0x00E9,0xE9},
{0x00EB,0xEB},
{0x00ED,0xED},
{0x00EE,0xEE},
{0x00F3,0xF3},
{0x00F4,0xF4},
{0x00F6,0xF6},
{0x00F7,0xF7},
{0x00FA,0xFA},
{0x00FC,0xFC},
{0x00FD,0xFD},
{0x0102,0xC3},
{0x0103,0xE3},
{0x0104,0xA1},
{0x0105,0xB1},
{0x0106,0xC6},
{0x0107,0xE6},
{0x010C,0xC8},
{0x010D,0xE8},
{0x010E,0xCF},
{0x010F,0xEF},
{0x0110,0xD0},
{0x0111,0xF0},
{0x0118,0xCA},
{0x0119,0xEA},
{0x011A,0xCC},
{0x011B,0xEC},
{0x0139,0xC5},
{0x013A,0xE5},
{0x013D,0xA5},
{0x013E,0xB5},
{0x0141,0xA3},
{0x0142,0xB3},
{0x0143,0xD1},
{0x0144,0xF1},
{0x0147,0xD2},
{0x0148,0xF2},
{0x0150,0xD5},
{0x0151,0xF5},
{0x0154,0xC0},
{0x0155,0xE0},
{0x0158,0xD8},
{0x0159,0xF8},
{0x015A,0xA6},
{0x015B,0xB6},
{0x015E,0xAA},
{0x015F,0xBA},
{0x0160,0xA9},
{0x0161,0xB9},
{0x0162,0xDE},
{0x0163,0xFE},
{0x0164,0xAB},
{0x0165,0xBB},
{0x016E,0xD9},
{0x016F,0xF9},
{0x0170,0xDB},
{0x0171,0xFB},
{0x0179,0xAC},
{0x017A,0xBC},
{0x017B,0xAF},
{0x017C,0xBF},
{0x017D,0xAE},
{0x017E,0xBE},
{0x02C7,0xB7},
{0x02D8,0xA2},
{0x02D9,0xFF},
{0x02DB,0xB2},
{0x02DD,0xBD}
{0x000A,0x0A,},
{0x000D,0x0D,},
{0x0020,0x20,},
{0x0021,0x21,},
{0x0022,0x22,},
{0x0023,0x23,},
{0x0024,0x02,},
{0x0025,0x25,},
{0x0026,0x26,},
{0x0027,0x27,},
{0x0028,0x28,},
{0x0029,0x29,},
{0x002A,0x2A,},
{0x002B,0x2B,},
{0x002C,0x2C,},
{0x002D,0x2D,},
{0x002E,0x2E,},
{0x002F,0x2F,},
{0x0030,0x30,},
{0x0031,0x31,},
{0x0032,0x32,},
{0x0033,0x33,},
{0x0034,0x34,},
{0x0035,0x35,},
{0x0036,0x36,},
{0x0037,0x37,},
{0x0038,0x38,},
{0x0039,0x39,},
{0x003A,0x3A,},
{0x003B,0x3B,},
{0x003C,0x3C,},
{0x003D,0x3D,},
{0x003E,0x3E,},
{0x003F,0x3F,},
{0x0040,0x00,},
{0x0041,0x41,},
{0x0042,0x42,},
{0x0043,0x43,},
{0x0044,0x44,},
{0x0045,0x45,},
{0x0046,0x46,},
{0x0047,0x47,},
{0x0048,0x48,},
{0x0049,0x49,},
{0x004A,0x4A,},
{0x004B,0x4B,},
{0x004C,0x4C,},
{0x004D,0x4D,},
{0x004E,0x4E,},
{0x004F,0x4F,},
{0x0050,0x50,},
{0x0051,0x51,},
{0x0052,0x52,},
{0x0053,0x53,},
{0x0054,0x54,},
{0x0055,0x55,},
{0x0056,0x56,},
{0x0057,0x57,},
{0x0058,0x58,},
{0x0059,0x59,},
{0x005A,0x5A,},
{0x005F,0x11,},
{0x0061,0x61,},
{0x0062,0x62,},
{0x0063,0x63,},
{0x0064,0x64,},
{0x0065,0x65,},
{0x0066,0x66,},
{0x0067,0x67,},
{0x0068,0x68,},
{0x0069,0x69,},
{0x006A,0x6A,},
{0x006B,0x6B,},
{0x006C,0x6C,},
{0x006D,0x6D,},
{0x006E,0x6E,},
{0x006F,0x6F,},
{0x0070,0x70,},
{0x0071,0x71,},
{0x0072,0x72,},
{0x0073,0x73,},
{0x0074,0x74,},
{0x0075,0x75,},
{0x0076,0x76,},
{0x0077,0x77,},
{0x0078,0x78,},
{0x0079,0x79,},
{0x007A,0x7A,},
{0x00A0,0x1B,},
{0x00A1,0x40,},
{0x00A3,0x01,},
{0x00A4,0x24,},
{0x00A5,0x03,},
{0x00A7,0x5F,},
{0x00BF,0x60,},
{0x00C4,0x5B,},
{0x00C5,0x0E,},
{0x00C6,0x1C,},
{0x00C9,0x1F,},
{0x00D1,0x5D,},
{0x00D6,0x5C,},
{0x00D8,0x0B,},
{0x00DC,0x5E,},
{0x00DF,0x1E,},
{0x00E0,0x7F,},
{0x00E4,0x7B,},
{0x00E5,0x0F,},
{0x00E6,0x1D,},
{0x00E7,0x09,},
{0x00E8,0x04,},
{0x00E9,0x05,},
{0x00EC,0x07,},
{0x00F1,0x7D,},
{0x00F2,0x08,},
{0x00F6,0x7C,},
{0x00F8,0x0C,},
{0x00F9,0x06,},
{0x00FC,0x7E,},
{0x0393,0x13,},
{0x0394,0x10,},
{0x0398,0x19,},
{0x039B,0x14,},
{0x039E,0x1A,},
{0x03A0,0x16,},
{0x03A3,0x18,},
{0x03A6,0x12,},
{0x03A8,0x17,},
{0x03A9,0x15,}
};
#define GSM0338_tsize (sizeof(GSM0338_uni_to_char_table)/sizeof(_ucc_))

View file

@ -1036,6 +1036,32 @@ else \
bsize = grow; \
}
static inline int chop(unichar c, _ucc_ *table, int hi)
{
int lo = 0;
while (hi > lo)
{
int i = (hi + lo) / 2;
unichar from = table[i].from;
if (from < c)
{
lo = i + 1;
}
else if (from > c)
{
hi = i;
}
else
{
return i; // Found
}
}
return -1; // Not found
}
/**
* Function to convert from 16-bit unicode to 8-bit character data.
* <p>The dst argument is a pointer to a pointer to a buffer in which the
@ -1266,23 +1292,15 @@ tables:
}
else
{
int res;
int i = 0;
int i = chop(u, table, tsize);
while ((res = u - table[i].from) > 0)
{
if (++i >= tsize)
{
break;
}
}
if (res > 0)
if (i < 0)
{
ptr[dpos++] = '*';
}
else
{
ptr[dpos++] = table[--i].to;
ptr[dpos++] = table[i].to;
}
}
}
@ -1308,19 +1326,15 @@ tables:
}
else
{
int res;
int i = 0;
int i = chop(u, table, tsize);
while ((res = u - table[i].from) > 0)
if (i < 0)
{
if (++i >= tsize)
{
result = NO;
spos = slen;
break;
}
result = NO;
spos = slen;
break;
}
ptr[dpos++] = table[--i].to;
ptr[dpos++] = table[i].to;
}
}
}
@ -1330,8 +1344,7 @@ tables:
while (spos < slen)
{
unichar u = src[spos++];
int res;
int i = 0;
int i;
if (swapped == YES)
{
@ -1343,38 +1356,29 @@ tables:
GROW();
}
while ((res = u - GSM0338_uni_to_char_table[i].from) > 0)
i = chop(u, GSM0338_uni_to_char_table, GSM0338_tsize);
if (i >= 0)
{
if (++i >= GSM0338_tsize)
{
break;
}
}
if (res == 0)
{
ptr[dpos] = GSM0338_uni_to_char_table[--i].to;
ptr[dpos] = GSM0338_uni_to_char_table[i].to;
}
else
{
if (strict == YES)
i = chop(u, GSM0338_escapes, GSM0338_esize);
if (i >= 0)
{
ptr[dpos++] = 0x1b;
if (dpos >= bsize)
{
GROW();
}
ptr[dpos] = GSM0338_escapes[i].to;
}
else if (strict == YES)
{
result = NO;
break;
}
for (i = 0; i < GSM0338_esize; i++)
{
if (GSM0338_escapes[i].from == u)
{
ptr[dpos++] = 0x1b;
if (dpos >= bsize)
{
GROW();
}
ptr[dpos] = GSM0338_escapes[i].to;
break;
}
}
if (i == GSM0338_esize)
else
{
ptr[dpos] = '*';
}
@ -1418,37 +1422,50 @@ tables:
}
rval = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
dpos = bsize - outbytesleft;
if (rval == (size_t)-1)
if (rval != 0)
{
if (errno == E2BIG)
if (rval == (size_t)-1)
{
unsigned old = bsize;
if (errno == E2BIG)
{
unsigned old = bsize;
GROW();
outbuf = (char*)&ptr[dpos];
outbytesleft += (bsize - old);
}
else if (errno == EILSEQ)
{
if (strict == YES)
GROW();
outbuf = (char*)&ptr[dpos];
outbytesleft += (bsize - old);
}
else if (errno == EILSEQ)
{
if (strict == YES)
{
result = NO;
break;
}
/*
* If we are allowing lossy conversion, we replace any
* unconvertable character with an asterisk.
*/
if (outbytesleft > 0)
{
*outbuf++ = '*';
outbytesleft--;
inbuf += sizeof(unichar);
inbytesleft -= sizeof(unichar);
}
}
else
{
result = NO;
break;
}
/*
* If we are allowing lossy conversion, we replace any
* unconvertable character with an asterisk.
*/
if (outbytesleft > 0)
{
*outbuf++ = '*';
outbytesleft--;
inbuf += sizeof(unichar);
inbytesleft -= sizeof(unichar);
}
}
else
else if (strict == YES)
{
/*
* A positive return from iconv indicates some
* irreversible (ie lossy) conversions took place,
* so if we are doing strict conversions we must fail.
*/
result = NO;
break;
}

View file

@ -1,4 +1,5 @@
#include <Foundation/NSString.h>
#include <Foundation/NSData.h>
#include <Foundation/NSException.h>
// Fri Oct 23 02:58:47 MET DST 1998 dave@turbocat.de
@ -34,6 +35,15 @@ int main()
NSMutableString *f1 = [NSMutableString stringWithString: @"ab"];
NSStringEncoding *encs;
{
unichar buf[] = { '\243' };
NSString *str = [NSString stringWithCharacters: buf
length: sizeof(buf)/sizeof(unichar)];
NSData *gsm = [str dataUsingEncoding: NSGSM0338StringEncoding];
NSLog(@"GSM: %*.*s", [gsm length], [gsm length], [gsm bytes]);
return 0;
}
NS_DURING
[fo replaceCharactersInRange: [fo rangeOfString: @"xx"] withString: us1];
NS_HANDLER
@ -104,6 +114,7 @@ int main()
while (*encs != 0)
printf("Encoding %x\n", *encs++);
}
[arp release];
exit(0);
}