From debfcb7b90c75b32d2bd782653d9d16accab9dae Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 30 Dec 2008 23:05:24 +0000 Subject: [PATCH] added string unescaping --- lib/as3/tokenizer.lex | 108 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 2 deletions(-) diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 0da86e9..6f74483 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -129,6 +129,109 @@ void handleInclude(char*text, int len, char quotes) //BEGIN(INITIAL); keep context } +string_t string_unescape(const char*in, int l) +{ + int len=0; + const char*s = in; + const char*end = &in[l]; + char*n = (char*)malloc(l); + char*o = n; + while(s256) + syntaxerror("octal number out of range (0-255): %d", num); + o[len++] = num; + continue; + } + case 'x': case 'u': { + int max=2; + char bracket = 0; + char unicode = 0; + if(*s == 'u') { + max = 6; + unicode = 1; + } + s++; + if(s==end) syntaxerror("invalid \\u or \\x at end of string"); + if(*s == '{') { + s++; + if(s==end) syntaxerror("invalid \\u{ at end of string"); + bracket=1; + } + unsigned int num=0; + int nr = 0; + while(strchr("0123456789abcdefABCDEF", *s) && (bracket || nr < max) && s='0' && *s<='9') num |= *s - '0'; + if(*s>='a' && *s<='f') num |= *s - 'a' + 10; + if(*s>='A' && *s<='F') num |= *s - 'A' + 10; + nr++; + s++; + } + if(bracket) { + if(*s=='}' && s256) + syntaxerror("byte out of range (0-255): %d", num); + o[len++] = num; + } + break; + } + default: + syntaxerror("unknown escape sequence: \"\\%c\"", *s); + } + } + string_t out = string_new(n, len); + o[len]=0; + return out; +} + static void handleString(char*s, int len) { if(s[0]=='"') { @@ -140,8 +243,9 @@ static void handleString(char*s, int len) s++;len-=2; } else syntaxerror("String incorrectly terminated"); - s[len] = 0; - avm2_lval.string = s; + + + avm2_lval.str = string_unescape(s, len); } -- 1.7.10.4