mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
Implemented method [dataUsingEncoding:allowLossyConversion:]
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@7540 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
12ab8775ea
commit
a81ad0483b
2 changed files with 101 additions and 0 deletions
|
@ -437,6 +437,66 @@ static IMP msInitImp; /* designated initialiser for mutable */
|
|||
length: aRange.length];
|
||||
}
|
||||
|
||||
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
|
||||
allowLossyConversion: (BOOL)flag
|
||||
{
|
||||
unsigned int len = [self length];
|
||||
NSStringEncoding defEnc = [NSString defaultCStringEncoding];
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
return [NSData data];
|
||||
}
|
||||
|
||||
if (encoding == NSUnicodeStringEncoding)
|
||||
{
|
||||
int t;
|
||||
unichar *buff;
|
||||
|
||||
buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), 2*len+2);
|
||||
buff[0] = 0xFEFF;
|
||||
t = encode_strtoustr(buff+1, _contents_chars, len, defEnc);
|
||||
return [NSData dataWithBytesNoCopy: buff length: t+2];
|
||||
}
|
||||
else if ((encoding == defEnc)
|
||||
||((defEnc == NSASCIIStringEncoding)
|
||||
&& ((encoding == NSISOLatin1StringEncoding)
|
||||
|| (encoding == NSISOLatin2StringEncoding)
|
||||
|| (encoding == NSNEXTSTEPStringEncoding)
|
||||
|| (encoding == NSNonLossyASCIIStringEncoding))))
|
||||
{
|
||||
unsigned char *buff;
|
||||
|
||||
buff = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), len+1);
|
||||
memcpy(buff, _contents_chars, len);
|
||||
buff[len] = '\0';
|
||||
return [NSData dataWithBytesNoCopy: buff length: len];
|
||||
}
|
||||
else
|
||||
{
|
||||
int t;
|
||||
unichar *ubuff;
|
||||
unsigned char *buff;
|
||||
|
||||
ubuff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), 2*len);
|
||||
t = encode_strtoustr(ubuff, _contents_chars, len, defEnc);
|
||||
buff = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), t+1);
|
||||
if (flag)
|
||||
t = encode_ustrtostr(buff, ubuff, t, encoding);
|
||||
else
|
||||
t = encode_ustrtostr_strict(buff, ubuff, t, encoding);
|
||||
buff[t] = '\0';
|
||||
NSZoneFree(NSDefaultMallocZone(), ubuff);
|
||||
if (!t)
|
||||
{
|
||||
NSZoneFree(NSDefaultMallocZone(), buff);
|
||||
return nil;
|
||||
}
|
||||
return [NSData dataWithBytesNoCopy: buff length: t];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSStringEncoding) fastestEncoding
|
||||
{
|
||||
if (([NSString defaultCStringEncoding] == NSASCIIStringEncoding)
|
||||
|
|
|
@ -317,6 +317,47 @@
|
|||
return _count;
|
||||
}
|
||||
|
||||
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
|
||||
allowLossyConversion: (BOOL)flag
|
||||
{
|
||||
unsigned int len = [self length];
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
return [NSData data];
|
||||
}
|
||||
|
||||
if (encoding == NSUnicodeStringEncoding)
|
||||
{
|
||||
unichar *buff;
|
||||
|
||||
buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), 2*len+2);
|
||||
buff[0] = 0xFEFF;
|
||||
memcpy(buff+1, _contents_chars, 2*len);
|
||||
return [NSData dataWithBytesNoCopy: buff length: 2*len+2];
|
||||
}
|
||||
else
|
||||
{
|
||||
int t;
|
||||
unsigned char *buff;
|
||||
|
||||
buff = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), len+1);
|
||||
// FIXME: Here should the lossy flag be used
|
||||
if (flag)
|
||||
t = encode_ustrtostr(buff, _contents_chars, len, encoding);
|
||||
else
|
||||
t = encode_ustrtostr_strict(buff, _contents_chars, len, encoding);
|
||||
buff[t] = '\0';
|
||||
if (!t)
|
||||
{
|
||||
NSZoneFree(NSDefaultMallocZone(), buff);
|
||||
return nil;
|
||||
}
|
||||
return [NSData dataWithBytesNoCopy: buff length: t];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSStringEncoding) fastestEncoding
|
||||
{
|
||||
return NSUnicodeStringEncoding;
|
||||
|
|
Loading…
Reference in a new issue