Some encoding fixes for strings.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@9563 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2001-04-12 09:11:31 +00:00
parent 9f5d519eca
commit 6ad0dbad23
4 changed files with 109 additions and 53 deletions

View file

@ -1,3 +1,18 @@
2001-04-12 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSString.m: For efficiency, use _DefaultStringEncoding
throughout, rather than calling +defaultCStringEncoding. This is
safe since the documentation explicitly states that the encoding
cannot be changed programmatically ... so we don't have to worry
about someone adding a category to change that.
When converting data to/from strings, optimise to simple cString
stuff if the specified encoding is the defautl encoding.
Tidied some stuff to conform better to coding standards.
* Source/Unicode.m GetDefEncoding(): prohibit UTF8 from being the
default cString encoding ... the default cString encoding must
consist of 7 or 8 bit characters, and must contain ASCII as a
subset. We really should think of a generalised test for that.
2001-04-11 Nicola Pero <nicola@brainstorm.co.uk> 2001-04-11 Nicola Pero <nicola@brainstorm.co.uk>
* Source/NSString.m ([-initWithData:encoding:]): When working with * Source/NSString.m ([-initWithData:encoding:]): When working with

View file

@ -167,6 +167,22 @@
<p> <p>
Returns the encoding used for any method accepting a C string. Returns the encoding used for any method accepting a C string.
This value is determined automatically from the programs
environment and cannot be changed programmatically.
</p>
<p>
You should <em>NOT</em> override this method in an attempt to
change the encoding being used.
</p>
<p>
In GNUstep, this encoding is determined by the initial value
of the <code>GNUSTEP_STRING_ENCODING</code> environment
variable. If this is not defined,
<code>NSISOLatin1StringEncoding</code> is assumed.
</p> </p>

View file

@ -229,8 +229,8 @@ pathSepMember(unichar c)
static inline gsu32 static inline gsu32
surrogatePairValue(unichar high, unichar low) surrogatePairValue(unichar high, unichar low)
{ {
return ((high - (unichar)0xD800) * (unichar)400) + return ((high - (unichar)0xD800) * (unichar)400)
((low - (unichar)0xDC00) + (unichar)10000); + ((low - (unichar)0xDC00) + (unichar)10000);
} }
@ -1021,7 +1021,8 @@ handle_printf_atsign (FILE *stream,
- (id) initWithData: (NSData*)data - (id) initWithData: (NSData*)data
encoding: (NSStringEncoding)encoding encoding: (NSStringEncoding)encoding
{ {
if (encoding == NSASCIIStringEncoding) if (encoding == NSASCIIStringEncoding
|| encoding == _DefaultStringEncoding)
{ {
unsigned len = [data length]; unsigned len = [data length];
@ -1126,14 +1127,14 @@ handle_printf_atsign (FILE *stream,
test = [d bytes]; test = [d bytes];
if ((test != NULL) && (len > 1) if ((test != NULL) && (len > 1)
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped))) && ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
{ {
/* somebody set up us the BOM! */ /* somebody set up us the BOM! */
enc = NSUnicodeStringEncoding; enc = NSUnicodeStringEncoding;
} }
else else
{ {
enc = [NSString defaultCStringEncoding]; enc = _DefaultStringEncoding;
} }
return [self initWithData: d encoding: enc]; return [self initWithData: d encoding: enc];
} }
@ -1153,13 +1154,13 @@ handle_printf_atsign (FILE *stream,
test = [d bytes]; test = [d bytes];
if ((test != NULL) && (len > 1) if ((test != NULL) && (len > 1)
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped))) && ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
{ {
enc = NSUnicodeStringEncoding; enc = NSUnicodeStringEncoding;
} }
else else
{ {
enc = [NSString defaultCStringEncoding]; enc = _DefaultStringEncoding;
} }
return [self initWithData: d encoding: enc]; return [self initWithData: d encoding: enc];
} }
@ -1215,11 +1216,12 @@ handle_printf_atsign (FILE *stream,
- (NSString*) stringByAppendingFormat: (NSString*)format,... - (NSString*) stringByAppendingFormat: (NSString*)format,...
{ {
va_list ap; va_list ap;
id ret; id ret;
va_start(ap, format); va_start(ap, format);
ret = [self stringByAppendingString: ret = [self stringByAppendingString:
[NSString stringWithFormat: format arguments: ap]]; [NSString stringWithFormat: format arguments: ap]];
va_end(ap); va_end(ap);
return ret; return ret;
} }
@ -1243,26 +1245,27 @@ handle_printf_atsign (FILE *stream,
- (NSArray*) componentsSeparatedByString: (NSString*)separator - (NSArray*) componentsSeparatedByString: (NSString*)separator
{ {
NSRange search, complete; NSRange search;
NSRange found; NSRange complete;
NSRange found;
NSMutableArray *array = [NSMutableArray array]; NSMutableArray *array = [NSMutableArray array];
search = NSMakeRange (0, [self length]); search = NSMakeRange (0, [self length]);
complete = search; complete = search;
found = [self rangeOfString: separator]; found = [self rangeOfString: separator];
while (found.length) while (found.length != 0)
{ {
NSRange current; NSRange current;
current = NSMakeRange (search.location, current = NSMakeRange (search.location,
found.location - search.location); found.location - search.location);
[array addObject: [self substringWithRange: current]]; [array addObject: [self substringWithRange: current]];
search = NSMakeRange (found.location + found.length, search = NSMakeRange (found.location + found.length,
complete.length - found.location - found.length); complete.length - found.location - found.length);
found = [self rangeOfString: separator found = [self rangeOfString: separator
options: 0 options: 0
range: search]; range: search];
} }
// Add the last search string range // Add the last search string range
[array addObject: [self substringWithRange: search]]; [array addObject: [self substringWithRange: search]];
@ -1308,18 +1311,20 @@ handle_printf_atsign (FILE *stream,
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
{ {
NSRange all = NSMakeRange(0, [self length]); NSRange all = NSMakeRange(0, [self length]);
return [self rangeOfCharacterFromSet: aSet return [self rangeOfCharacterFromSet: aSet
options: 0 options: 0
range: all]; range: all];
} }
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
options: (unsigned)mask options: (unsigned)mask
{ {
NSRange all = NSMakeRange(0, [self length]); NSRange all = NSMakeRange(0, [self length]);
return [self rangeOfCharacterFromSet: aSet return [self rangeOfCharacterFromSet: aSet
options: mask options: mask
range: all]; range: all];
} }
/* xxx FIXME */ /* xxx FIXME */
@ -1327,8 +1332,11 @@ handle_printf_atsign (FILE *stream,
options: (unsigned)mask options: (unsigned)mask
range: (NSRange)aRange range: (NSRange)aRange
{ {
int i, start, stop, step; int i;
NSRange range; int start;
int stop;
int step;
NSRange range;
unichar (*cImp)(id, SEL, unsigned); unichar (*cImp)(id, SEL, unsigned);
BOOL (*mImp)(id, SEL, unichar); BOOL (*mImp)(id, SEL, unichar);
@ -1353,6 +1361,7 @@ handle_printf_atsign (FILE *stream,
for (i = start; i != stop; i += step) for (i = start; i != stop; i += step)
{ {
unichar letter = (unichar)(*cImp)(self, caiSel, i); unichar letter = (unichar)(*cImp)(self, caiSel, i);
if ((*mImp)(aSet, cMemberSel, letter)) if ((*mImp)(aSet, cMemberSel, letter))
{ {
range = NSMakeRange(i, 1); range = NSMakeRange(i, 1);
@ -1365,19 +1374,21 @@ handle_printf_atsign (FILE *stream,
- (NSRange) rangeOfString: (NSString*)string - (NSRange) rangeOfString: (NSString*)string
{ {
NSRange all = NSMakeRange(0, [self length]); NSRange all = NSMakeRange(0, [self length]);
return [self rangeOfString: string return [self rangeOfString: string
options: 0 options: 0
range: all]; range: all];
} }
- (NSRange) rangeOfString: (NSString*)string - (NSRange) rangeOfString: (NSString*)string
options: (unsigned)mask options: (unsigned)mask
{ {
NSRange all = NSMakeRange(0, [self length]); NSRange all = NSMakeRange(0, [self length]);
return [self rangeOfString: string return [self rangeOfString: string
options: mask options: mask
range: all]; range: all];
} }
- (NSRange) rangeOfString: (NSString *) aString - (NSRange) rangeOfString: (NSString *) aString
@ -1391,18 +1402,18 @@ handle_printf_atsign (FILE *stream,
- (unsigned int) indexOfString: (NSString *)substring - (unsigned int) indexOfString: (NSString *)substring
{ {
NSRange range = {0, [self length]}; NSRange range = {0, [self length]};
range = [self rangeOfString:substring options:0 range:range]; range = [self rangeOfString: substring options: 0 range: range];
return range.length ? range.location : NSNotFound; return range.length ? range.location : NSNotFound;
} }
- (unsigned int) indexOfString: (NSString*)substring fromIndex: (unsigned)index - (unsigned int) indexOfString: (NSString*)substring fromIndex: (unsigned)index
{ {
NSRange range = {index, [self length]-index}; NSRange range = {index, [self length] - index};
range = [self rangeOfString:substring options:0 range:range]; range = [self rangeOfString: substring options: 0 range: range];
return range.length ? range.location : NSNotFound; return range.length ? range.location : NSNotFound;
} }
// Determining Composed Character Sequences // Determining Composed Character Sequences
@ -1462,14 +1473,16 @@ handle_printf_atsign (FILE *stream,
- (BOOL) hasPrefix: (NSString*)aString - (BOOL) hasPrefix: (NSString*)aString
{ {
NSRange range; NSRange range;
range = [self rangeOfString: aString options: NSAnchoredSearch]; range = [self rangeOfString: aString options: NSAnchoredSearch];
return (range.length > 0) ? YES : NO; return (range.length > 0) ? YES : NO;
} }
- (BOOL) hasSuffix: (NSString*)aString - (BOOL) hasSuffix: (NSString*)aString
{ {
NSRange range; NSRange range;
range = [self rangeOfString: aString range = [self rangeOfString: aString
options: NSAnchoredSearch | NSBackwardsSearch]; options: NSAnchoredSearch | NSBackwardsSearch];
return (range.length > 0) ? YES : NO; return (range.length > 0) ? YES : NO;
@ -1518,8 +1531,10 @@ handle_printf_atsign (FILE *stream,
int len = [self length]; int len = [self length];
if (len > NSHashStringLength) if (len > NSHashStringLength)
len = NSHashStringLength; {
if (len) len = NSHashStringLength;
}
if (len > 0)
{ {
unichar buf[len * MAXDEC + 1]; unichar buf[len * MAXDEC + 1];
GSeqStruct s = { buf, len, len * MAXDEC, 0 }; GSeqStruct s = { buf, len, len * MAXDEC, 0 };
@ -1738,10 +1753,10 @@ handle_printf_atsign (FILE *stream,
default: default:
start--; start--;
break; break;
}; }
if (done) if (done)
break; break;
}; }
if (start == 0) if (start == 0)
{ {
thischar = (*caiImp)(self, caiSel, start); thischar = (*caiImp)(self, caiSel, start);
@ -1755,7 +1770,7 @@ handle_printf_atsign (FILE *stream,
break; break;
default: default:
break; break;
}; }
} }
else else
start++; start++;
@ -1769,6 +1784,7 @@ handle_printf_atsign (FILE *stream,
while (end < len) while (end < len)
{ {
BOOL done = NO; BOOL done = NO;
thischar = (*caiImp)(self, caiSel, end); thischar = (*caiImp)(self, caiSel, end);
switch (thischar) switch (thischar)
{ {
@ -1780,11 +1796,11 @@ handle_printf_atsign (FILE *stream,
break; break;
default: default:
break; break;
}; }
end++; end++;
if (done) if (done)
break; break;
}; }
if (end < len) if (end < len)
{ {
if ((*caiImp)(self, caiSel, end) == (unichar)0x000D) if ((*caiImp)(self, caiSel, end) == (unichar)0x000D)
@ -1928,7 +1944,7 @@ handle_printf_atsign (FILE *stream,
NSMutableData *m; NSMutableData *m;
d = [self dataUsingEncoding: _DefaultStringEncoding d = [self dataUsingEncoding: _DefaultStringEncoding
allowLossyConversion: NO]; allowLossyConversion: NO];
if (d == nil) if (d == nil)
{ {
[NSException raise: NSCharacterConversionException [NSException raise: NSCharacterConversionException
@ -2098,7 +2114,8 @@ handle_printf_atsign (FILE *stream,
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding
{ {
id d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; id d = [self dataUsingEncoding: encoding allowLossyConversion: NO];
return d ? YES : NO;
return d != nil ? YES : NO;
} }
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
@ -3020,17 +3037,23 @@ handle_printf_atsign (FILE *stream,
- (BOOL) writeToFile: (NSString*)filename - (BOOL) writeToFile: (NSString*)filename
atomically: (BOOL)useAuxiliaryFile atomically: (BOOL)useAuxiliaryFile
{ {
id d; id d = [self dataUsingEncoding: _DefaultStringEncoding];
if (!(d = [self dataUsingEncoding: [NSString defaultCStringEncoding]]))
d = [self dataUsingEncoding: NSUnicodeStringEncoding]; if (d == nil)
{
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
}
return [d writeToFile: filename atomically: useAuxiliaryFile]; return [d writeToFile: filename atomically: useAuxiliaryFile];
} }
- (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)atomically - (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)atomically
{ {
id d; id d = [self dataUsingEncoding: _DefaultStringEncoding];
if (!(d = [self dataUsingEncoding: [NSString defaultCStringEncoding]]))
d = [self dataUsingEncoding: NSUnicodeStringEncoding]; if (d == nil)
{
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
}
return [d writeToURL: anURL atomically: atomically]; return [d writeToURL: anURL atomically: atomically];
} }
@ -3198,7 +3221,8 @@ handle_printf_atsign (FILE *stream,
length: count length: count
freeWhenDone: YES]; freeWhenDone: YES];
} }
else if (enc == NSASCIIStringEncoding) else if (enc == NSASCIIStringEncoding
|| enc == _DefaultStringEncoding)
{ {
unsigned char *chars; unsigned char *chars;

View file

@ -198,6 +198,7 @@ GetDefEncoding()
{ {
ret = str_encoding_table[count].enc; ret = str_encoding_table[count].enc;
if ((ret == NSUnicodeStringEncoding) if ((ret == NSUnicodeStringEncoding)
|| (ret == NSUTF8StringEncoding)
|| (ret == NSSymbolStringEncoding)) || (ret == NSSymbolStringEncoding))
{ {
fprintf(stderr, "WARNING: %s - encoding not supported as " fprintf(stderr, "WARNING: %s - encoding not supported as "