added ringbuffer routines.
[swftools.git] / src / parser.lex
index f29926f..57c7056 100644 (file)
@@ -29,6 +29,30 @@ static void count(char*text, int len, int condition)
 
 static char*prefix = 0;
 
+static void unescapeString(string_t * tmp)
+{
+    char *p, *p1;
+    /* fixme - this routine expects the string to be
+       null-terminated */
+
+    for (p1=tmp->str; (p=strchr(p1, '\\')); p1 = p+1) 
+    {
+       switch(p[1])
+       {
+           case '\\': p[1] = '\\'; tmp->len--; break;
+           case '"': p[1] = '"'; tmp->len--; break;
+           case 'b': p[1] = '\b'; tmp->len--; break;
+           case 'f': p[1] = '\f'; tmp->len--; break;
+           case 'n': p[1] = '\n'; tmp->len--; break;
+           case 'r': p[1] = '\r'; tmp->len--; break;
+           case 't': p[1] = '\t'; tmp->len--; break;
+           default:
+               continue;
+       }
+       strcpy(p, p+1);
+    }
+}
+
 static void store(enum type_t type, int line, int column, char*text, int length)
 {
     struct token_t token;
@@ -46,6 +70,7 @@ static void store(enum type_t type, int line, int column, char*text, int length)
        break;
        case STRING:
            string_set2(&tmp, text+1, length-2);
+           unescapeString(&tmp);
            token.text = (char*)mem_putstring(&strings, tmp);
        break;
        case TWIP: 
@@ -128,11 +153,10 @@ RVALUE     \"{STRING}\"|([^ \n\r\t]+)
 {NAME}                      {s(IDENTIFIER);c();}
 "["                        {c();BEGIN(BINARY);}
 {S}                        {c();}
-.                          {char c,c1=0;
+.                          {char c,c1=yytext[0];
                             printf("Syntax error in line %d, %d: %s", line, column, yytext);
                             while(1) {
                                 c=input();
-                                if(!c1) c1=c;
                                 if(c=='\n' || c==EOF) 
                                     break;
                                printf("%c", c);