mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
updates
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@14420 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
eeb07474d3
commit
dadcd7f022
5 changed files with 234 additions and 198 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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_))
|
||||
|
||||
|
|
155
Source/Unicode.m
155
Source/Unicode.m
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue