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:
Richard Frith-Macdonald 2002-04-05 17:44:44 +00:00
parent 622cacf55f
commit f8723cda3f
2 changed files with 58 additions and 20 deletions

View file

@ -2,6 +2,9 @@
* Source/NSObject.m: Fix locking bug with NSZombie ... was not
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.
2002-03-28 Manuel Guesdon <mguesdon@orange-concept.com>

View file

@ -4042,7 +4042,9 @@ static BOOL skipSpace(pldata *pld)
{
c = pld->ptr[pld->pos];
if (c == '\n')
break;
{
break;
}
pld->pos++;
}
if (pld->pos >= pld->end)
@ -4058,7 +4060,9 @@ static BOOL skipSpace(pldata *pld)
{
c = pld->ptr[pld->pos];
if (c == '\n')
pld->lin++;
{
pld->lin++;
}
else if (c == '*' && pld->pos < pld->end - 1
&& pld->ptr[pld->pos+1] == '/')
{
@ -4074,13 +4078,19 @@ static BOOL skipSpace(pldata *pld)
}
}
else
return YES;
{
return YES;
}
}
else
return YES;
{
return YES;
}
}
if (c == '\n')
pld->lin++;
{
pld->lin++;
}
pld->pos++;
}
pld->err = @"reached end of string";
@ -4281,9 +4291,13 @@ static inline id parseUnquotedString(pldata *pld)
static id parsePlItem(pldata* pld)
{
if (skipSpace(pld) == NO)
return nil;
id result = nil;
BOOL start = (pld->pos == 1 ? YES : NO);
if (skipSpace(pld) == NO)
{
return nil;
}
switch (pld->ptr[pld->pos])
{
case '{':
@ -4300,7 +4314,9 @@ static id parsePlItem(pldata* pld)
key = parsePlItem(pld);
if (key == nil)
return nil;
{
return nil;
}
if (skipSpace(pld) == NO)
{
RELEASE(key);
@ -4352,8 +4368,9 @@ static id parsePlItem(pldata* pld)
return nil;
}
pld->pos++;
return dict;
result = dict;
}
break;
case '(':
{
@ -4399,8 +4416,9 @@ static id parsePlItem(pldata* pld)
return nil;
}
pld->pos++;
return array;
result = array;
}
break;
case '<':
{
@ -4447,15 +4465,27 @@ static id parsePlItem(pldata* pld)
[data appendBytes: buf length: len];
}
pld->pos++;
return data;
result = data;
}
break;
case '"':
return parseQuotedString(pld);
result = parseQuotedString(pld);
break;
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
@ -4766,13 +4796,15 @@ GSPropertyList(NSString *string)
[parser doValidityChecking: YES];
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;
}
if (![[[[parser doc] root] name] isEqualToString: @"plist"])
{
NSLog(@"not a property list - because name node is %@",
[[[parser doc] root] name]);
[NSException raise: NSGenericException
format: @"not a property list - because name node is %@",
[[[parser doc] root] name]];
return nil;
}
pl = AUTORELEASE(RETAIN(nodeToObject([[[parser doc] root] children])));
@ -4788,8 +4820,9 @@ GSPropertyList(NSString *string)
pl = AUTORELEASE(parsePlItem(pld));
if (pl == nil && _pld.err != nil)
{
NSLog(@"Parse failed at line %d (char %d) - %@",
_pld.lin, _pld.pos, _pld.err);
[NSException raise: NSGenericException
format: @"Parse failed at line %d (char %d) - %@",
_pld.lin, _pld.pos, _pld.err];
}
return pl;
}
@ -4910,8 +4943,10 @@ GSPropertyListFromStringsFormat(NSString *string)
}
if (dict == nil && _pld.err != nil)
{
NSLog(@"Parse failed at line %d (char %d) - %@",
_pld.lin, _pld.pos, _pld.err);
RELEASE(dict);
[NSException raise: NSGenericException
format: @"Parse failed at line %d (char %d) - %@",
_pld.lin, _pld.pos, _pld.err];
}
return AUTORELEASE(dict);
}