mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 16:50:58 +00:00
Property list parsing fixes.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13364 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
6fbf6d25ab
commit
f45ff29c88
2 changed files with 58 additions and 20 deletions
|
@ -2,6 +2,9 @@
|
||||||
|
|
||||||
* Source/NSObject.m: Fix locking bug with NSZombie ... was not
|
* Source/NSObject.m: Fix locking bug with NSZombie ... was not
|
||||||
locking when adding/removing zombies.
|
locking when adding/removing zombies.
|
||||||
|
* Source/NSString.m: Fix property list parsing code to raise
|
||||||
|
exceptions on failure rather than logging messages. Also check for
|
||||||
|
extra data at end of parsed string.
|
||||||
* Tools/ctvenc.m: new tool for converting string encodings.
|
* Tools/ctvenc.m: new tool for converting string encodings.
|
||||||
|
|
||||||
2002-03-28 Manuel Guesdon <mguesdon@orange-concept.com>
|
2002-03-28 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||||
|
|
|
@ -4042,7 +4042,9 @@ static BOOL skipSpace(pldata *pld)
|
||||||
{
|
{
|
||||||
c = pld->ptr[pld->pos];
|
c = pld->ptr[pld->pos];
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
break;
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
pld->pos++;
|
pld->pos++;
|
||||||
}
|
}
|
||||||
if (pld->pos >= pld->end)
|
if (pld->pos >= pld->end)
|
||||||
|
@ -4058,7 +4060,9 @@ static BOOL skipSpace(pldata *pld)
|
||||||
{
|
{
|
||||||
c = pld->ptr[pld->pos];
|
c = pld->ptr[pld->pos];
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
pld->lin++;
|
{
|
||||||
|
pld->lin++;
|
||||||
|
}
|
||||||
else if (c == '*' && pld->pos < pld->end - 1
|
else if (c == '*' && pld->pos < pld->end - 1
|
||||||
&& pld->ptr[pld->pos+1] == '/')
|
&& pld->ptr[pld->pos+1] == '/')
|
||||||
{
|
{
|
||||||
|
@ -4074,13 +4078,19 @@ static BOOL skipSpace(pldata *pld)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return YES;
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return YES;
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
pld->lin++;
|
{
|
||||||
|
pld->lin++;
|
||||||
|
}
|
||||||
pld->pos++;
|
pld->pos++;
|
||||||
}
|
}
|
||||||
pld->err = @"reached end of string";
|
pld->err = @"reached end of string";
|
||||||
|
@ -4281,9 +4291,13 @@ static inline id parseUnquotedString(pldata *pld)
|
||||||
|
|
||||||
static id parsePlItem(pldata* pld)
|
static id parsePlItem(pldata* pld)
|
||||||
{
|
{
|
||||||
if (skipSpace(pld) == NO)
|
id result = nil;
|
||||||
return nil;
|
BOOL start = (pld->pos == 1 ? YES : NO);
|
||||||
|
|
||||||
|
if (skipSpace(pld) == NO)
|
||||||
|
{
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
switch (pld->ptr[pld->pos])
|
switch (pld->ptr[pld->pos])
|
||||||
{
|
{
|
||||||
case '{':
|
case '{':
|
||||||
|
@ -4300,7 +4314,9 @@ static id parsePlItem(pldata* pld)
|
||||||
|
|
||||||
key = parsePlItem(pld);
|
key = parsePlItem(pld);
|
||||||
if (key == nil)
|
if (key == nil)
|
||||||
return nil;
|
{
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
if (skipSpace(pld) == NO)
|
if (skipSpace(pld) == NO)
|
||||||
{
|
{
|
||||||
RELEASE(key);
|
RELEASE(key);
|
||||||
|
@ -4352,8 +4368,9 @@ static id parsePlItem(pldata* pld)
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
pld->pos++;
|
pld->pos++;
|
||||||
return dict;
|
result = dict;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case '(':
|
case '(':
|
||||||
{
|
{
|
||||||
|
@ -4399,8 +4416,9 @@ static id parsePlItem(pldata* pld)
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
pld->pos++;
|
pld->pos++;
|
||||||
return array;
|
result = array;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case '<':
|
case '<':
|
||||||
{
|
{
|
||||||
|
@ -4447,15 +4465,27 @@ static id parsePlItem(pldata* pld)
|
||||||
[data appendBytes: buf length: len];
|
[data appendBytes: buf length: len];
|
||||||
}
|
}
|
||||||
pld->pos++;
|
pld->pos++;
|
||||||
return data;
|
result = data;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case '"':
|
case '"':
|
||||||
return parseQuotedString(pld);
|
result = parseQuotedString(pld);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return parseUnquotedString(pld);
|
result = parseUnquotedString(pld);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (start == YES && result != nil)
|
||||||
|
{
|
||||||
|
if (skipSpace(pld) == YES)
|
||||||
|
{
|
||||||
|
pld->err = @"extra data after parsed string";
|
||||||
|
result = nil; // Not at end of string.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_LIBXML
|
#if HAVE_LIBXML
|
||||||
|
@ -4766,13 +4796,15 @@ GSPropertyList(NSString *string)
|
||||||
[parser doValidityChecking: YES];
|
[parser doValidityChecking: YES];
|
||||||
if ([parser parse: data] == NO || [parser parse: nil] == NO)
|
if ([parser parse: data] == NO || [parser parse: nil] == NO)
|
||||||
{
|
{
|
||||||
NSLog(@"not a property list - failed to parse as XML");
|
[NSException raise: NSGenericException
|
||||||
|
format: @"not a property list - failed to parse as XML"];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
if (![[[[parser doc] root] name] isEqualToString: @"plist"])
|
if (![[[[parser doc] root] name] isEqualToString: @"plist"])
|
||||||
{
|
{
|
||||||
NSLog(@"not a property list - because name node is %@",
|
[NSException raise: NSGenericException
|
||||||
[[[parser doc] root] name]);
|
format: @"not a property list - because name node is %@",
|
||||||
|
[[[parser doc] root] name]];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
pl = AUTORELEASE(RETAIN(nodeToObject([[[parser doc] root] children])));
|
pl = AUTORELEASE(RETAIN(nodeToObject([[[parser doc] root] children])));
|
||||||
|
@ -4788,8 +4820,9 @@ GSPropertyList(NSString *string)
|
||||||
pl = AUTORELEASE(parsePlItem(pld));
|
pl = AUTORELEASE(parsePlItem(pld));
|
||||||
if (pl == nil && _pld.err != nil)
|
if (pl == nil && _pld.err != nil)
|
||||||
{
|
{
|
||||||
NSLog(@"Parse failed at line %d (char %d) - %@",
|
[NSException raise: NSGenericException
|
||||||
_pld.lin, _pld.pos, _pld.err);
|
format: @"Parse failed at line %d (char %d) - %@",
|
||||||
|
_pld.lin, _pld.pos, _pld.err];
|
||||||
}
|
}
|
||||||
return pl;
|
return pl;
|
||||||
}
|
}
|
||||||
|
@ -4910,8 +4943,10 @@ GSPropertyListFromStringsFormat(NSString *string)
|
||||||
}
|
}
|
||||||
if (dict == nil && _pld.err != nil)
|
if (dict == nil && _pld.err != nil)
|
||||||
{
|
{
|
||||||
NSLog(@"Parse failed at line %d (char %d) - %@",
|
RELEASE(dict);
|
||||||
_pld.lin, _pld.pos, _pld.err);
|
[NSException raise: NSGenericException
|
||||||
|
format: @"Parse failed at line %d (char %d) - %@",
|
||||||
|
_pld.lin, _pld.pos, _pld.err];
|
||||||
}
|
}
|
||||||
return AUTORELEASE(dict);
|
return AUTORELEASE(dict);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue