From: helly Date: Sun, 22 Apr 2007 18:35:24 +0000 (+0000) Subject: - Add line info to header X-Git-Tag: 0.13.6~185 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56c525600d0775f8eb4338d608776f8757006ddf;p=re2c - Add line info to header --- diff --git a/re2c/code.cc b/re2c/code.cc index ea5dc4cd..828f4aa9 100644 --- a/re2c/code.cc +++ b/re2c/code.cc @@ -1708,7 +1708,9 @@ void genHeader(std::ostream &o, uint ind, const RegExpMap& specMap) o.write(ctime(&now), 24); } o << " */\n"; - //TODO: o << headerFileInfo; + o << headerFileInfo; + o << "\n"; + // now the type(s) o << indent(ind++) << "enum " << mapCodeName["YYCONDTYPE"] << " {\n"; for(RegExpMap::const_iterator it = specMap.begin(); it != specMap.end(); ++it) { diff --git a/re2c/globals.h b/re2c/globals.h index ab296274..21dc7d7d 100644 --- a/re2c/globals.h +++ b/re2c/globals.h @@ -14,6 +14,7 @@ namespace re2c extern file_info sourceFileInfo; extern file_info outputFileInfo; +extern file_info headerFileInfo; extern bool bFlag; extern bool cFlag; diff --git a/re2c/main.cc b/re2c/main.cc index 6cf79237..e0980836 100644 --- a/re2c/main.cc +++ b/re2c/main.cc @@ -20,6 +20,7 @@ namespace re2c file_info sourceFileInfo; file_info outputFileInfo; +file_info headerFileInfo; bool bFlag = false; bool cFlag = false; @@ -350,6 +351,7 @@ int main(int argc, char *argv[]) cerr << "re2c: error: cannot open " << headerFileName << "\n"; return 1; } + headerFileInfo = file_info(headerFileName, &header); } Scanner scanner(source, output); sourceFileInfo = file_info(sourceFileName, &scanner); diff --git a/re2c/run_tests.sh.in b/re2c/run_tests.sh.in index d2d3e89c..2bf517eb 100644 --- a/re2c/run_tests.sh.in +++ b/re2c/run_tests.sh.in @@ -28,6 +28,7 @@ for x in @top_srcdir@/test/*.re `find @top_srcdir@/lessons -name '*.re'|sort`; d rm $headers if ${diff} ${x%.re}.h $typname > $typdiff; then echo "Passed header test." + rm $typname else echo "Failed: ${x%.re}.h ${x%.re}.h.temp differ." result=1 diff --git a/re2c/test/condition_05.cgitcondition_05.cgit.h.c b/re2c/test/condition_05.cgitcondition_05.cgit.h.c new file mode 100755 index 00000000..de63c6e3 --- /dev/null +++ b/re2c/test/condition_05.cgitcondition_05.cgit.h.c @@ -0,0 +1,139 @@ +/* Generated by re2c */ +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +char scan(Scanner *s) +{ + int state = 1; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; + + { + unsigned char yych; + static void *yyctable[2] = { + &&yyc_comment, + &&yyc_normal, + }; + goto *yyctable[state]; +/* *********************************** */ +yyc_comment: + + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych != '*') goto yy4; + ++s->cur; + if((yych = *s->cur) == '/') goto yy5; +yy3: + { + goto yyc_comment; + } +yy4: + yych = *++s->cur; + goto yy3; +yy5: + ++s->cur; + { + continue; + } +/* *********************************** */ +yyc_normal: + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych != '/') goto yy11; + ++s->cur; + if((yych = *s->cur) == '*') goto yy12; +yy10: + { + fputc(*s->tok, stdout); + continue; + } +yy11: + yych = *++s->cur; + goto yy10; +yy12: + ++s->cur; + { + goto yyc_comment; + } + } + + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +} diff --git a/re2c/test/condition_05.cgitcondition_05.cgit.h.h b/re2c/test/condition_05.cgitcondition_05.cgit.h.h new file mode 100755 index 00000000..9cda0d78 --- /dev/null +++ b/re2c/test/condition_05.cgitcondition_05.cgit.h.h @@ -0,0 +1,6 @@ +/* Generated by re2c */ + +enum YYCONDTYPE { + comment, + normal, +} diff --git a/re2c/test/condition_05.cgitcondition_05.cgit.h.re b/re2c/test/condition_05.cgitcondition_05.cgit.h.re new file mode 100755 index 00000000..7c702fa2 --- /dev/null +++ b/re2c/test/condition_05.cgitcondition_05.cgit.h.re @@ -0,0 +1,118 @@ +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +char scan(Scanner *s) +{ + int state = 1; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; +/*!re2c + +re2c:define:YYCTYPE = "unsigned char"; +re2c:define:YYCURSOR = s->cur; +re2c:define:YYLIMIT = s->lim; +re2c:define:YYMARKER = s->ptr; +re2c:define:YYFILL = "{ if(fill(s, 2) >= 0) break; }"; +re2c:define:YYCONDITION = state; +re2c:yyfill:parameter = 0; +re2c:indent:top = 2; + + "/*" + { + goto yyc_comment; + } + [^] + { + fputc(*s->tok, stdout); + continue; + } + "*" "/" + { + continue; + } + [^] + { + goto yyc_comment; + } + +*/ + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +} diff --git a/re2c/test/condition_05.cgtcondition_05.cgt.h.h b/re2c/test/condition_05.cgtcondition_05.cgt.h.h index 767b013c..9c472d7a 100755 --- a/re2c/test/condition_05.cgtcondition_05.cgt.h.h +++ b/re2c/test/condition_05.cgtcondition_05.cgt.h.h @@ -1,4 +1,6 @@ /* Generated by re2c */ +#line 3 "condition_05.cgt.h" + enum YYCONDTYPE { comment, normal,