From 060df65e30e03ec3bad9f418a65c18d05bf8a06d Mon Sep 17 00:00:00 2001 From: richard Date: Thu, 11 Feb 1999 11:05:17 +0000 Subject: [PATCH] Property list bugfix git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3690 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 +++ Source/NSString.m | 105 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 93 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 94a80a99f..64cb99894 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Feb 11 9:51:00 1999 Richard Frith-Macdonald + + * Source/NSString.m: Fixed error in property-list parsing - was not + taking into account octal and hexadecimal escape sequences. + Thu Feb 11 9:51:00 1999 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-dealloc]) invalidate timer so we can't diff --git a/Source/NSString.m b/Source/NSString.m index 70da09352..cfa588ffa 100644 --- a/Source/NSString.m +++ b/Source/NSString.m @@ -2970,8 +2970,9 @@ static BOOL skipSpace(pldata *pld) static inline id parseQuotedString(pldata* pld) { unsigned start = ++pld->pos; - BOOL escaped = NO; + unsigned escaped = 0; unsigned shrink = 0; + BOOL hex = NO; NSString *obj; while (pld->pos < pld->end) @@ -2980,13 +2981,44 @@ static inline id parseQuotedString(pldata* pld) if (escaped) { - escaped = NO; + if (escaped == 1 && c == '0') + { + escaped = 2; + hex = NO; + } + else if (escaped > 1) + { + if (escaped == 2 && c == 'x') + { + hex = YES; + shrink++; + escaped++; + } + else if (hex && (*hexdigitsImp)(hexdigits, cMemberSel, c)) + { + shrink++; + escaped++; + } + else if (c >= '0' && c <= '7') + { + shrink++; + escaped++; + } + else + { + escaped = 0; + } + } + else + { + escaped = 0; + } } else { if (c == '\\') { - escaped = YES; + escaped = 1; shrink++; } else if (c == '"') @@ -3009,29 +3041,68 @@ static inline id parseQuotedString(pldata* pld) unsigned j; unsigned k; + escaped = 0; + hex = NO; for (j = start, k = 0; j < pld->pos; j++) { - chars[k] = pld->ptr[j]; + unichar c = pld->ptr[j]; + if (escaped) { - escaped = NO; - switch (chars[k]) + if (escaped == 1 && c == '0') { - case 'a' : chars[k] = '\a'; break; - case 'b' : chars[k] = '\b'; break; - case 't' : chars[k] = '\t'; break; - case 'r' : chars[k] = '\r'; break; - case 'n' : chars[k] = '\n'; break; - case 'v' : chars[k] = '\v'; break; - case 'f' : chars[k] = '\f'; break; - default: break; + chars[k] = 0; + hex = NO; + escaped++; + } + else if (escaped > 1) + { + if (escaped == 2 && c == 'x') + { + hex = YES; + escaped++; + } + else if (hex && (*hexdigitsImp)(hexdigits, cMemberSel, c)) + { + chars[k] <<= 4; + chars[k] |= char2num(c); + escaped++; + } + else if (c >= '0' && c <= '7') + { + chars[k] <<= 3; + chars[k] |= (c - '0'); + escaped++; + } + else + { + escaped = 0; + chars[++k] = c; + k++; + } + } + else + { + escaped = 0; + switch (c) + { + case 'a' : chars[k] = '\a'; break; + case 'b' : chars[k] = '\b'; break; + case 't' : chars[k] = '\t'; break; + case 'r' : chars[k] = '\r'; break; + case 'n' : chars[k] = '\n'; break; + case 'v' : chars[k] = '\v'; break; + case 'f' : chars[k] = '\f'; break; + default : chars[k] = c; break; + } + k++; } - k++; } else { - if (chars[k] == '\\') - escaped = YES; + chars[k] = c; + if (c == '\\') + escaped = 1; else k++; }