mirror of
https://github.com/gnustep/libs-base.git
synced 2025-06-01 09:02:01 +00:00
Fix problem with getting cstring into buffer ... was failing when it shouldn't
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@23114 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
5e5cca4bca
commit
5ee536df00
2 changed files with 48 additions and 17 deletions
|
@ -1,6 +1,7 @@
|
||||||
2006-06-29 Richard Frith-Macdonald <rfm@gnu.org>
|
2006-06-29 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Source/Tools/gdnc.m: Don't try to trap SIGPROF
|
* Source/Tools/gdnc.m: Don't try to trap SIGPROF
|
||||||
|
* Source/GSString.m: fix bug getting Cstring.
|
||||||
|
|
||||||
2006-06-27 Richard Frith-Macdonald <rfm@gnu.org>
|
2006-06-27 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -1704,6 +1704,10 @@ static inline BOOL
|
||||||
getCStringE_c(GSStr self, char *buffer, unsigned int maxLength,
|
getCStringE_c(GSStr self, char *buffer, unsigned int maxLength,
|
||||||
NSStringEncoding enc)
|
NSStringEncoding enc)
|
||||||
{
|
{
|
||||||
|
if (buffer == 0)
|
||||||
|
{
|
||||||
|
return NO; // Can't fit in here
|
||||||
|
}
|
||||||
if (enc == NSUnicodeStringEncoding)
|
if (enc == NSUnicodeStringEncoding)
|
||||||
{
|
{
|
||||||
if (maxLength >= sizeof(unichar))
|
if (maxLength >= sizeof(unichar))
|
||||||
|
@ -1745,7 +1749,43 @@ getCStringE_c(GSStr self, char *buffer, unsigned int maxLength,
|
||||||
}
|
}
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
else if (enc == NSASCIIStringEncoding
|
|
||||||
|
if (enc == NSUTF8StringEncoding
|
||||||
|
&& GSIsByteEncoding(internalEncoding))
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maybe we actually contain ascii data, which can be
|
||||||
|
* copied out directly as a utf-8 string.
|
||||||
|
*/
|
||||||
|
if (bytes > self->_count)
|
||||||
|
{
|
||||||
|
bytes = self->_count;
|
||||||
|
}
|
||||||
|
for (i = 0; i < bytes; i++)
|
||||||
|
{
|
||||||
|
unsigned char c = self->_contents.c[i];
|
||||||
|
|
||||||
|
if (c > 127)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffer[i] = c;
|
||||||
|
}
|
||||||
|
if (i == bytes)
|
||||||
|
{
|
||||||
|
buffer[bytes] = '\0';
|
||||||
|
if (bytes < self->_count)
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
// Fall through to perform conversion to unicode and back
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enc == NSASCIIStringEncoding
|
||||||
&& GSIsByteEncoding(internalEncoding))
|
&& GSIsByteEncoding(internalEncoding))
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
@ -1791,18 +1831,16 @@ getCStringE_c(GSStr self, char *buffer, unsigned int maxLength,
|
||||||
format: @"Can't convert to Unicode string."];
|
format: @"Can't convert to Unicode string."];
|
||||||
}
|
}
|
||||||
if (GSFromUnicode((unsigned char**)&c, &bytes, u, l, enc,
|
if (GSFromUnicode((unsigned char**)&c, &bytes, u, l, enc,
|
||||||
NSDefaultMallocZone(), GSUniTerminate|GSUniStrict) == NO)
|
0, GSUniTerminate|GSUniStrict) == NO)
|
||||||
{
|
{
|
||||||
NSZoneFree(NSDefaultMallocZone(), u);
|
c = 0; // Unable to convert
|
||||||
[NSException raise: NSCharacterConversionException
|
|
||||||
format: @"Can't convert from Unicode string."];
|
|
||||||
}
|
}
|
||||||
NSZoneFree(NSDefaultMallocZone(), u);
|
NSZoneFree(NSDefaultMallocZone(), u);
|
||||||
if (c == (unsigned char*)buffer)
|
if (c == (unsigned char*)buffer)
|
||||||
{
|
{
|
||||||
return YES; // Fitted in original buffer
|
return YES; // Fitted in original buffer
|
||||||
}
|
}
|
||||||
else
|
else if (c != 0)
|
||||||
{
|
{
|
||||||
NSZoneFree(NSDefaultMallocZone(), c);
|
NSZoneFree(NSDefaultMallocZone(), c);
|
||||||
}
|
}
|
||||||
|
@ -1898,19 +1936,11 @@ getCStringE_u(GSStr self, char *buffer, unsigned int maxLength,
|
||||||
|
|
||||||
if (GSFromUnicode((unsigned char**)&c, &maxLength,
|
if (GSFromUnicode((unsigned char**)&c, &maxLength,
|
||||||
self->_contents.u, self->_count, enc,
|
self->_contents.u, self->_count, enc,
|
||||||
NSDefaultMallocZone(), GSUniTerminate|GSUniStrict) == NO)
|
0, GSUniTerminate|GSUniStrict) == NO)
|
||||||
{
|
{
|
||||||
[NSException raise: NSCharacterConversionException
|
return NO;
|
||||||
format: @"Can't convert to/from Unicode string."];
|
|
||||||
}
|
|
||||||
if (c == (unsigned char*)buffer)
|
|
||||||
{
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSZoneFree(NSDefaultMallocZone(), c);
|
|
||||||
}
|
}
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue