aboutsummaryrefslogtreecommitdiff
path: root/tools/re2c/scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/re2c/scanner.c')
-rw-r--r--tools/re2c/scanner.c748
1 files changed, 748 insertions, 0 deletions
diff --git a/tools/re2c/scanner.c b/tools/re2c/scanner.c
new file mode 100644
index 0000000..034c935
--- /dev/null
+++ b/tools/re2c/scanner.c
@@ -0,0 +1,748 @@
+/* Generated by re2c 0.9.1-C on Sun Oct 9 22:15:58 2005
+ */
+#line 1 "scanner.re"
+#include <stdlib.h>
+#include <string.h>
+#include "tools/re2c/scanner.h"
+#include "tools/re2c/parse.h"
+#include "tools/re2c/globals.h"
+#include "tools/re2c/parser.h"
+
+#ifndef MAX
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#endif
+
+#define BSIZE 8192
+
+#define YYCTYPE unsigned char
+#define YYCURSOR cursor
+#define YYLIMIT s->lim
+#define YYMARKER s->ptr
+#define YYFILL(n) {cursor = fill(s, cursor);}
+
+#define RETURN(i) {s->cur = cursor; return i;}
+
+static unsigned char *fill(Scanner*, unsigned char*);
+
+void
+Scanner_init(Scanner *s, FILE *i)
+{
+ s->in = i;
+ s->bot = s->tok = s->ptr = s->cur = s->pos = s->lim = s->top =
+ s->eof = NULL;
+ s->tchar = s->tline = 0;
+ s->cline = 1;
+}
+
+static unsigned char *
+fill(Scanner *s, unsigned char *cursor)
+{
+ if(!s->eof){
+ unsigned int cnt = s->tok - s->bot;
+ if(cnt){
+ memcpy(s->bot, s->tok, s->lim - s->tok);
+ s->tok = s->bot;
+ s->ptr -= cnt;
+ cursor -= cnt;
+ s->pos -= cnt;
+ s->lim -= cnt;
+ }
+ if((s->top - s->lim) < BSIZE){
+ unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE) + 1);
+ memcpy(buf, s->tok, s->lim - s->tok);
+ s->tok = buf;
+ s->ptr = &buf[s->ptr - s->bot];
+ cursor = &buf[cursor - s->bot];
+ s->pos = &buf[s->pos - s->bot];
+ s->lim = &buf[s->lim - s->bot];
+ s->top = &s->lim[BSIZE];
+ if (s->bot)
+ free(s->bot);
+ s->bot = buf;
+ }
+ if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){
+ s->eof = &s->lim[cnt]; *s->eof++ = '\0';
+ }
+ s->lim += cnt;
+ }
+ return cursor;
+}
+
+#line 79 "scanner.re"
+
+
+int
+Scanner_echo(Scanner *s, FILE *out)
+{
+ unsigned char *cursor = s->cur;
+ int ignore_eoc = 0;
+
+ /* Catch EOF */
+ if (s->eof && cursor == s->eof)
+ return 0;
+
+ s->tok = cursor;
+echo:
+
+#line 87 "scanner.c"
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ goto yy0;
+ ++YYCURSOR;
+yy0:
+ if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
+ yych = *YYCURSOR;
+ if(yych <= ')'){
+ if(yych <= '\000') goto yy7;
+ if(yych == '\n') goto yy5;
+ goto yy9;
+ } else {
+ if(yych <= '*') goto yy4;
+ if(yych != '/') goto yy9;
+ goto yy2;
+ }
+yy2: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '*') goto yy12;
+ goto yy3;
+yy3:
+#line 117 "scanner.re"
+{ goto echo; }
+#line 112 "scanner.c"
+yy4: yych = *++YYCURSOR;
+ if(yych == '/') goto yy10;
+ goto yy3;
+yy5: yych = *++YYCURSOR;
+ goto yy6;
+yy6:
+#line 112 "scanner.re"
+{ fwrite(s->tok, 1, cursor - s->tok, out);
+ s->tok = s->pos = cursor; s->cline++; oline++;
+ goto echo; }
+#line 123 "scanner.c"
+yy7: yych = *++YYCURSOR;
+ goto yy8;
+yy8:
+#line 115 "scanner.re"
+{ fwrite(s->tok, 1, cursor - s->tok - 1, out); /* -1 so we don't write out the \0 */
+ if(cursor == s->eof) { RETURN(0); } }
+#line 130 "scanner.c"
+yy9: yych = *++YYCURSOR;
+ goto yy3;
+yy10: yych = *++YYCURSOR;
+ goto yy11;
+yy11:
+#line 103 "scanner.re"
+{
+ if (ignore_eoc) {
+ ignore_eoc = 0;
+ } else {
+ fwrite(s->tok, 1, cursor - s->tok, out);
+ }
+ s->tok = s->pos = cursor;
+ goto echo;
+ }
+#line 146 "scanner.c"
+yy12: yych = *++YYCURSOR;
+ if(yych == '!') goto yy14;
+ goto yy13;
+yy13: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 0: goto yy3;
+ }
+yy14: yych = *++YYCURSOR;
+ if(yych == 'm') goto yy15;
+ if(yych == 'r') goto yy16;
+ goto yy13;
+yy15: yych = *++YYCURSOR;
+ if(yych == 'a') goto yy21;
+ goto yy13;
+yy16: yych = *++YYCURSOR;
+ if(yych != 'e') goto yy13;
+ goto yy17;
+yy17: yych = *++YYCURSOR;
+ if(yych != '2') goto yy13;
+ goto yy18;
+yy18: yych = *++YYCURSOR;
+ if(yych != 'c') goto yy13;
+ goto yy19;
+yy19: yych = *++YYCURSOR;
+ goto yy20;
+yy20:
+#line 94 "scanner.re"
+{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out);
+ s->tok = cursor;
+ RETURN(1); }
+#line 177 "scanner.c"
+yy21: yych = *++YYCURSOR;
+ if(yych != 'x') goto yy13;
+ goto yy22;
+yy22: yych = *++YYCURSOR;
+ if(yych != ':') goto yy13;
+ goto yy23;
+yy23: yych = *++YYCURSOR;
+ if(yych != 'r') goto yy13;
+ goto yy24;
+yy24: yych = *++YYCURSOR;
+ if(yych != 'e') goto yy13;
+ goto yy25;
+yy25: yych = *++YYCURSOR;
+ if(yych != '2') goto yy13;
+ goto yy26;
+yy26: yych = *++YYCURSOR;
+ if(yych != 'c') goto yy13;
+ goto yy27;
+yy27: yych = *++YYCURSOR;
+ goto yy28;
+yy28:
+#line 97 "scanner.re"
+{
+ fprintf(out, "#define YYMAXFILL %u\n", maxFill);
+ s->tok = s->pos = cursor;
+ ignore_eoc = 1;
+ goto echo;
+ }
+#line 206 "scanner.c"
+}
+#line 118 "scanner.re"
+
+}
+
+
+int
+Scanner_scan(Scanner *s)
+{
+ unsigned char *cursor = s->cur;
+ unsigned int depth;
+
+scan:
+ s->tchar = cursor - s->pos;
+ s->tline = s->cline;
+ s->tok = cursor;
+
+#line 224 "scanner.c"
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ goto yy29;
+ ++YYCURSOR;
+yy29:
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '/'){
+ if(yych <= '"'){
+ if(yych <= '\n'){
+ if(yych <= '\b') goto yy53;
+ if(yych <= '\t') goto yy47;
+ goto yy49;
+ } else {
+ if(yych == ' ') goto yy47;
+ if(yych <= '!') goto yy53;
+ goto yy37;
+ }
+ } else {
+ if(yych <= '*'){
+ if(yych <= '&') goto yy53;
+ if(yych <= '\'') goto yy39;
+ if(yych <= ')') goto yy43;
+ goto yy35;
+ } else {
+ if(yych <= '+') goto yy44;
+ if(yych <= '-') goto yy53;
+ if(yych <= '.') goto yy51;
+ goto yy33;
+ }
+ }
+ } else {
+ if(yych <= '@'){
+ if(yych <= '<'){
+ if(yych == ';') goto yy43;
+ goto yy53;
+ } else {
+ if(yych <= '=') goto yy43;
+ if(yych == '?') goto yy44;
+ goto yy53;
+ }
+ } else {
+ if(yych <= '`'){
+ if(yych <= 'Z') goto yy45;
+ if(yych <= '[') goto yy41;
+ if(yych <= '\\') goto yy43;
+ goto yy53;
+ } else {
+ if(yych <= 'z') goto yy45;
+ if(yych <= '{') goto yy31;
+ if(yych <= '|') goto yy43;
+ goto yy53;
+ }
+ }
+ }
+yy31: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych <= '/') goto yy32;
+ if(yych <= '9') goto yy84;
+ goto yy32;
+yy32:
+#line 133 "scanner.re"
+{ depth = 1;
+ goto code;
+ }
+#line 291 "scanner.c"
+yy33: yych = *++YYCURSOR;
+ if(yych == '*') goto yy82;
+ goto yy34;
+yy34:
+#line 163 "scanner.re"
+{ RETURN(*s->tok); }
+#line 298 "scanner.c"
+yy35: yych = *++YYCURSOR;
+ if(yych == '/') goto yy80;
+ goto yy36;
+yy36:
+#line 165 "scanner.re"
+{ yylval.op = *s->tok;
+ RETURN(CLOSE); }
+#line 306 "scanner.c"
+yy37: yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych != '\n') goto yy76;
+ goto yy38;
+yy38:
+#line 150 "scanner.re"
+{ Scanner_fatal(s, "unterminated string constant (missing \")"); }
+#line 314 "scanner.c"
+yy39: yyaccept = 2;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych != '\n') goto yy71;
+ goto yy40;
+yy40:
+#line 151 "scanner.re"
+{ Scanner_fatal(s, "unterminated string constant (missing ')"); }
+#line 322 "scanner.c"
+yy41: yyaccept = 3;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '\n') goto yy42;
+ if(yych == '^') goto yy62;
+ goto yy60;
+yy42:
+#line 161 "scanner.re"
+{ Scanner_fatal(s, "unterminated range (missing ])"); }
+#line 331 "scanner.c"
+yy43: yych = *++YYCURSOR;
+ goto yy34;
+yy44: yych = *++YYCURSOR;
+ goto yy36;
+yy45: yych = *++YYCURSOR;
+ goto yy58;
+yy46:
+#line 180 "scanner.re"
+{ SubStr substr;
+ s->cur = cursor;
+ substr = Scanner_token(s);
+ yylval.symbol = Symbol_find(&substr);
+ return ID; }
+#line 345 "scanner.c"
+yy47: yych = *++YYCURSOR;
+ goto yy56;
+yy48:
+#line 186 "scanner.re"
+{ goto scan; }
+#line 351 "scanner.c"
+yy49: yych = *++YYCURSOR;
+ goto yy50;
+yy50:
+#line 188 "scanner.re"
+{ if(cursor == s->eof) RETURN(0);
+ s->pos = cursor; s->cline++;
+ goto scan;
+ }
+#line 360 "scanner.c"
+yy51: yych = *++YYCURSOR;
+ goto yy52;
+yy52:
+#line 193 "scanner.re"
+{ s->cur = cursor;
+ yylval.regexp = mkDot();
+ return RANGE;
+ }
+#line 369 "scanner.c"
+yy53: yych = *++YYCURSOR;
+ goto yy54;
+yy54:
+#line 198 "scanner.re"
+{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok);
+ goto scan;
+ }
+#line 377 "scanner.c"
+yy55: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy56;
+yy56: if(yych == '\t') goto yy55;
+ if(yych == ' ') goto yy55;
+ goto yy48;
+yy57: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy58;
+yy58: if(yych <= '@'){
+ if(yych <= '/') goto yy46;
+ if(yych <= '9') goto yy57;
+ goto yy46;
+ } else {
+ if(yych <= 'Z') goto yy57;
+ if(yych <= '`') goto yy46;
+ if(yych <= 'z') goto yy57;
+ goto yy46;
+ }
+yy59: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy60;
+yy60: if(yych <= '['){
+ if(yych != '\n') goto yy59;
+ goto yy61;
+ } else {
+ if(yych <= '\\') goto yy64;
+ if(yych <= ']') goto yy65;
+ goto yy59;
+ }
+yy61: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 0: goto yy32;
+ case 1: goto yy38;
+ case 2: goto yy40;
+ case 3: goto yy42;
+ }
+yy62: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy63;
+yy63: if(yych <= '['){
+ if(yych == '\n') goto yy61;
+ goto yy62;
+ } else {
+ if(yych <= '\\') goto yy67;
+ if(yych <= ']') goto yy68;
+ goto yy62;
+ }
+yy64: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy61;
+ goto yy59;
+yy65: yych = *++YYCURSOR;
+ goto yy66;
+yy66:
+#line 157 "scanner.re"
+{ s->cur = cursor;
+ yylval.regexp = ranToRE(Scanner_token(s));
+ return RANGE; }
+#line 442 "scanner.c"
+yy67: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy61;
+ goto yy62;
+yy68: yych = *++YYCURSOR;
+ goto yy69;
+yy69:
+#line 153 "scanner.re"
+{ s->cur = cursor;
+ yylval.regexp = invToRE(Scanner_token(s));
+ return RANGE; }
+#line 455 "scanner.c"
+yy70: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy71;
+yy71: if(yych <= '&'){
+ if(yych == '\n') goto yy61;
+ goto yy70;
+ } else {
+ if(yych <= '\'') goto yy73;
+ if(yych != '\\') goto yy70;
+ goto yy72;
+ }
+yy72: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy61;
+ goto yy70;
+yy73: yych = *++YYCURSOR;
+ goto yy74;
+yy74:
+#line 146 "scanner.re"
+{ s->cur = cursor;
+ yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s));
+ return STRING; }
+#line 480 "scanner.c"
+yy75: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy76;
+yy76: if(yych <= '!'){
+ if(yych == '\n') goto yy61;
+ goto yy75;
+ } else {
+ if(yych <= '"') goto yy78;
+ if(yych != '\\') goto yy75;
+ goto yy77;
+ }
+yy77: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy61;
+ goto yy75;
+yy78: yych = *++YYCURSOR;
+ goto yy79;
+yy79:
+#line 142 "scanner.re"
+{ s->cur = cursor;
+ yylval.regexp = strToRE(Scanner_token(s));
+ return STRING; }
+#line 505 "scanner.c"
+yy80: yych = *++YYCURSOR;
+ goto yy81;
+yy81:
+#line 139 "scanner.re"
+{ s->tok = cursor;
+ RETURN(0); }
+#line 512 "scanner.c"
+yy82: yych = *++YYCURSOR;
+ goto yy83;
+yy83:
+#line 136 "scanner.re"
+{ depth = 1;
+ goto comment; }
+#line 519 "scanner.c"
+yy84: ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ goto yy85;
+yy85: if(yych <= '/'){
+ if(yych == ',') goto yy88;
+ goto yy61;
+ } else {
+ if(yych <= '9') goto yy84;
+ if(yych != '}') goto yy61;
+ goto yy86;
+ }
+yy86: yych = *++YYCURSOR;
+ goto yy87;
+yy87:
+#line 168 "scanner.re"
+{ yylval.extop.minsize = atoi((char *)s->tok+1);
+ yylval.extop.maxsize = atoi((char *)s->tok+1);
+ RETURN(CLOSESIZE); }
+#line 539 "scanner.c"
+yy88: yych = *++YYCURSOR;
+ if(yych != '}') goto yy92;
+ goto yy89;
+yy89: yych = *++YYCURSOR;
+ goto yy90;
+yy90:
+#line 176 "scanner.re"
+{ yylval.extop.minsize = atoi((char *)s->tok+1);
+ yylval.extop.maxsize = -1;
+ RETURN(CLOSESIZE); }
+#line 550 "scanner.c"
+yy91: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy92;
+yy92: if(yych <= '/') goto yy61;
+ if(yych <= '9') goto yy91;
+ if(yych != '}') goto yy61;
+ goto yy93;
+yy93: yych = *++YYCURSOR;
+ goto yy94;
+yy94:
+#line 172 "scanner.re"
+{ yylval.extop.minsize = atoi((char *)s->tok+1);
+ yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)s->tok, ',')+1));
+ RETURN(CLOSESIZE); }
+#line 566 "scanner.c"
+}
+#line 201 "scanner.re"
+
+
+code:
+
+#line 573 "scanner.c"
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ goto yy95;
+ ++YYCURSOR;
+yy95:
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '&'){
+ if(yych <= '\n'){
+ if(yych <= '\t') goto yy103;
+ goto yy101;
+ } else {
+ if(yych == '"') goto yy105;
+ goto yy103;
+ }
+ } else {
+ if(yych <= '{'){
+ if(yych <= '\'') goto yy106;
+ if(yych <= 'z') goto yy103;
+ goto yy99;
+ } else {
+ if(yych != '}') goto yy103;
+ goto yy97;
+ }
+ }
+yy97: yych = *++YYCURSOR;
+ goto yy98;
+yy98:
+#line 205 "scanner.re"
+{ if(--depth == 0){
+ s->cur = cursor;
+ yylval.token = Token_new(Scanner_token(s), s->tline);
+ return CODE;
+ }
+ goto code; }
+#line 610 "scanner.c"
+yy99: yych = *++YYCURSOR;
+ goto yy100;
+yy100:
+#line 211 "scanner.re"
+{ ++depth;
+ goto code; }
+#line 617 "scanner.c"
+yy101: yych = *++YYCURSOR;
+ goto yy102;
+yy102:
+#line 213 "scanner.re"
+{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'");
+ s->pos = cursor; s->cline++;
+ goto code;
+ }
+#line 626 "scanner.c"
+yy103: yych = *++YYCURSOR;
+ goto yy104;
+yy104:
+#line 217 "scanner.re"
+{ goto code; }
+#line 632 "scanner.c"
+yy105: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '\n') goto yy104;
+ goto yy112;
+yy106: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '\n') goto yy104;
+ goto yy108;
+yy107: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy108;
+yy108: if(yych <= '&'){
+ if(yych != '\n') goto yy107;
+ goto yy109;
+ } else {
+ if(yych <= '\'') goto yy103;
+ if(yych == '\\') goto yy110;
+ goto yy107;
+ }
+yy109: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 0: goto yy104;
+ }
+yy110: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy109;
+ goto yy107;
+yy111: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy112;
+yy112: if(yych <= '!'){
+ if(yych == '\n') goto yy109;
+ goto yy111;
+ } else {
+ if(yych <= '"') goto yy103;
+ if(yych != '\\') goto yy111;
+ goto yy113;
+ }
+yy113: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yych == '\n') goto yy109;
+ goto yy111;
+}
+#line 218 "scanner.re"
+
+
+comment:
+
+#line 685 "scanner.c"
+{
+ YYCTYPE yych;
+ goto yy114;
+ ++YYCURSOR;
+yy114:
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= ')'){
+ if(yych == '\n') goto yy119;
+ goto yy121;
+ } else {
+ if(yych <= '*') goto yy116;
+ if(yych == '/') goto yy118;
+ goto yy121;
+ }
+yy116: yych = *++YYCURSOR;
+ if(yych == '/') goto yy124;
+ goto yy117;
+yy117:
+#line 232 "scanner.re"
+{ goto comment; }
+#line 707 "scanner.c"
+yy118: yych = *++YYCURSOR;
+ if(yych == '*') goto yy122;
+ goto yy117;
+yy119: yych = *++YYCURSOR;
+ goto yy120;
+yy120:
+#line 228 "scanner.re"
+{ if(cursor == s->eof) RETURN(0);
+ s->tok = s->pos = cursor; s->cline++;
+ goto comment;
+ }
+#line 719 "scanner.c"
+yy121: yych = *++YYCURSOR;
+ goto yy117;
+yy122: yych = *++YYCURSOR;
+ goto yy123;
+yy123:
+#line 226 "scanner.re"
+{ ++depth;
+ goto comment; }
+#line 728 "scanner.c"
+yy124: yych = *++YYCURSOR;
+ goto yy125;
+yy125:
+#line 222 "scanner.re"
+{ if(--depth == 0)
+ goto scan;
+ else
+ goto comment; }
+#line 737 "scanner.c"
+}
+#line 233 "scanner.re"
+
+}
+
+void
+Scanner_fatal(Scanner *s, const char *msg)
+{
+ fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg);
+ exit(1);
+}