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;
- while(strchr("0123456789abcdefABCDEF", p[nr])) {
+ char*utf8;
+ 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++;
}
- char*utf8 = getUTF8(num);
+ if(bracket && p[nr]=='}') {
+ bracket = 0;
+ nr++;
+ }
+ utf8 = getUTF8(num);
new = strlen(utf8);
-
memcpy(p, utf8, new); // do not copy the terminating zero
break;
}
continue;
}
tmp->len -= (nr-new);
- int t;
- char*to=p+new,*from=p+nr;
- while(*from) {
- *to = *from;
- to++;
- from++;
+ {
+ int t;
+ char*to=p+new,*from=p+nr;
+ while(*from) {
+ *to = *from;
+ to++;
+ from++;
+ }
}
}
}
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);}
}
\.include{S}.*\n {handleInclude(yytext, yyleng);}
\.{NAME} {s(COMMAND);c();}
-:([^.]|\.[^e]|\.e[^n]|\.en[^d]|[ \n\r\t])*\.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();}
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;
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);
result[t].text += (int)strings.buffer;
}
- fclose(fi);
+ if(fi!=stdin)
+ fclose(fi);
return result;
}