X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fparser.lex;h=fb0fa621cc593c0e1aa81e7153fa91a7dc7c5fd8;hb=a8db3c675450432aa07f9817d3688ab33651fed9;hp=43e50fee33ad982aab19a919834b3b2cb801d9ba;hpb=e82d0f958e0db1d1a5f815cb7fc2a183c14bfff9;p=swftools.git diff --git a/src/parser.lex b/src/parser.lex index 43e50fe..fb0fa62 100644 --- a/src/parser.lex +++ b/src/parser.lex @@ -99,19 +99,29 @@ static void unescapeString(string_t * tmp) case 'n': p[0] = '\n'; break; case 'r': p[0] = '\r'; break; case 't': p[0] = '\t'; break; - case 'x': { + case 'x': case 'u': { + int max=4; int num=0; char*utf8; - while(strchr("0123456789abcdefABCDEF", p[nr])) { + char bracket = 0; + if(p[1] == 'u') + max = 6; + if(p[2] == '{') { + bracket = 1;nr++;max++; + } + while(strchr("0123456789abcdefABCDEF", p[nr]) && (bracket || nr < max)) { num <<= 4; if(p[nr]>='0' && p[nr]<='9') num |= p[nr] - '0'; if(p[nr]>='a' && p[nr]<='f') num |= p[nr] - 'a' + 10; if(p[nr]>='A' && p[nr]<='F') num |= p[nr] - 'A' + 10; nr++; } + if(bracket && p[nr]=='}') { + bracket = 0; + nr++; + } utf8 = getUTF8(num); new = strlen(utf8); - memcpy(p, utf8, new); // do not copy the terminating zero break; } @@ -226,9 +236,14 @@ void handleInclude(char*text, int len) fprintf(stderr, "Couldn't open %s\n", text); exit(1); } - yy_switch_to_buffer( - yy_create_buffer( yyin, YY_BUF_SIZE ) ); + yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ) ); + +#ifdef INITIAL BEGIN(INITIAL); +#else + // best guess + BEGIN(0); +#endif } #define c() {count(yytext, yyleng, YY_START);} @@ -244,7 +259,6 @@ NUMBER -?[0-9]+(\.[0-9]*)? PERCENT {NUMBER}% STRING (\\.|[^\\"\n])* S [ \n\r\t] -NS [^ \n\r\t] RVALUE \"{STRING}\"|([^ \n\r\t]+) %% @@ -266,7 +280,7 @@ RVALUE \"{STRING}\"|([^ \n\r\t]+) } \.include{S}.*\n {handleInclude(yytext, yyleng);} \.{NAME} {s(COMMAND);c();} -:({NS}|{S}[^.]|{S}\.[^e]|{S}\.e[^n]|{S}\.en[^d])*{S}\.end {s(RAWDATA);c();} +:([^.]|\.[^e]|\.e[^n]|\.en[^d]|\.end[^ \n\r\t]|[ \n\r\t])*\.end {s(RAWDATA);c();} {NAME} {s(IDENTIFIER);c();} "[" {c();BEGIN(BINARY);} {S} {c();} @@ -312,10 +326,19 @@ void freeTokens(struct token_t*file) struct token_t* generateTokens(char*filename) { - FILE*fi = fopen(filename, "rb"); + FILE*fi; int t; struct token_t*result; int num; + + if(!filename) + return 0; + + if(!strcmp(filename,"-")) + fi = stdin; + else + fi = fopen(filename, "rb"); + if(!fi) { printf("Couldn't find file %s\n", filename); return 0; @@ -330,7 +353,12 @@ struct token_t* generateTokens(char*filename) column=1; yylex(); +#ifdef YY_CURRENT_BUFFER + // some newer flex versions require it like this: + yy_delete_buffer(YY_CURRENT_BUFFER); +#else yy_delete_buffer(yy_current_buffer); +#endif result = (struct token_t*)tokens.buffer; num = tokens.pos/sizeof(struct token_t); @@ -340,7 +368,8 @@ struct token_t* generateTokens(char*filename) result[t].text += (int)strings.buffer; } - fclose(fi); + if(fi!=stdin) + fclose(fi); return result; }