#include #ifndef lint #if 0 static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #else __IDSTRING(yyrcsid, "$NetBSD: skeleton.c,v 1.14 1997/10/20 03:41:16 lukem Exp $"); #endif #endif #include #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) #define YYPREFIX "yy" #line 40 "expr.y" #if __GNUC__ >= 3 && __GNUC_MINOR__ >= 4 || __GNUC__ >= 4 #define USED __attribute__ ((used)) #elif defined __GNUC__ #define USED __attribute__ ((unused)) #else #define USED #endif #if defined (S42) static const char sccsid[] USED = "@(#)expr_s42.sl 1.28 (gritter) 5/29/05"; static int sus = 0; #elif defined (SU3) static const char sccsid[] USED = "@(#)expr_su3.sl 1.28 (gritter) 5/29/05"; static int sus = 3; #elif defined (SUS) static const char sccsid[] USED = "@(#)expr_sus.sl 1.28 (gritter) 5/29/05"; static int sus = 1; #else static const char sccsid[] USED = "@(#)expr.sl 1.28 (gritter) 5/29/05"; static int sus = 0; #endif /* expression command */ #include #include #include #include #include #include #include #include #include #include #include "atoll.h" #define EQL(x,y) !strcmp(x,y) #define NUMSZ 25 static char **Av; static int Ac; static int Argi; static int mb_cur_max; static char *progname; extern int sysv3; static char *Mstring[1]; int yylex(void); static char *_rel(int op, register char *r1, register char *r2); static char *_arith(int op, char *r1, char *r2); static char *_conj(int op, char *r1, char *r2); static char *match(char *s, char *p); static int ematch(char *s, register char *p); static void errxx(int c); static int yyerror(const char *s); static int numeric(const char *s); static int chars(const char *s, const char *end); static void *srealloc(void *, size_t); static void *smalloc(size_t); static char *numpr(int64_t val); static char *substr(char *, const char *, const char *); static char *length(const char *); static char *eindex(const char *, const char *); #if defined (SUS) || defined (SU3) || defined (S42) #include static int nbra; #else /* !SUS, !SU3, !S42 */ #include #endif /* !SUS, !SU3, !S42 */ #line 116 "expr.y" typedef union { char *val; } YYSTYPE; #line 97 "y.tab.c" #define OR 257 #define AND 258 #define ADD 259 #define SUBT 260 #define MULT 261 #define DIV 262 #define REM 263 #define EQ 264 #define GT 265 #define GEQ 266 #define LT 267 #define LEQ 268 #define NEQ 269 #define A_STRING 270 #define SUBSTR 271 #define LENGTH 272 #define INDEX 273 #define NOARG 274 #define MATCH 275 #define MCH 276 #define YYERRCODE 256 short yylhs[] = { -1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; short yylen[] = { 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 1, }; short yydefred[] = { 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 20, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 18, }; short yydgoto[] = { 7, 8, }; short yysindex[] = { 294, 0, 294, 294, 294, 294, 294, 0, -252, -40, 0, -40, -40, 193, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 294, -40, 0, 0, 0, -233, -215, -206, -206, -275, -275, -275, -197, -197, -197, -197, -197, -197, 0, 0, }; short yyrindex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 258, 37, 56, -20, -1, 18, 75, 94, 113, 132, 151, 170, 0, 0, }; short yygindex[] = { 0, 461, }; #define YYTABLESIZE 569 short yytable[] = { 6, 28, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 13, 13, 27, 0, 28, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 14, 14, 0, 0, 28, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 18, 19, 20, 15, 15, 0, 28, 16, 17, 18, 19, 20, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 11, 11, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 1, 2, 3, 4, 32, 5, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 4, 4, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 3, 3, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 5, 5, 6, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 9, 10, 11, 12, 13, 0, 28, 29, 0, 30, 31, 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 0, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 5, }; short yycheck[] = { 40, 276, -1, -1, -1, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, -1, -1, 40, 41, 274, -1, 276, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, -1, -1, 40, 41, -1, -1, 276, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 261, 262, 263, 40, 41, -1, 276, 259, 260, 261, 262, 263, -1, -1, -1, 276, -1, -1, -1, -1, -1, -1, 40, 41, 276, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 41, 275, 276, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, 259, 260, 40, 41, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, 259, 260, 40, 41, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, 40, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, -1, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, -1, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, -1, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, -1, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 257, 258, -1, -1, -1, -1, -1, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 2, 3, 4, 5, 6, -1, 276, 9, -1, 11, 12, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, 271, 272, 273, 274, 275, 257, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, 271, 272, 273, -1, 275, }; #define YYFINAL 7 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 276 #if YYDEBUG char *yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,"'('","')'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"OR","AND","ADD","SUBT", "MULT","DIV","REM","EQ","GT","GEQ","LT","LEQ","NEQ","A_STRING","SUBSTR", "LENGTH","INDEX","NOARG","MATCH","MCH", }; char *yyrule[] = { "$accept : expression", "expression : expr NOARG", "expr : '(' expr ')'", "expr : expr OR expr", "expr : expr AND expr", "expr : expr EQ expr", "expr : expr GT expr", "expr : expr GEQ expr", "expr : expr LT expr", "expr : expr LEQ expr", "expr : expr NEQ expr", "expr : expr ADD expr", "expr : expr SUBT expr", "expr : expr MULT expr", "expr : expr DIV expr", "expr : expr REM expr", "expr : expr MCH expr", "expr : MATCH expr expr", "expr : SUBSTR expr expr expr", "expr : LENGTH expr", "expr : INDEX expr expr", "expr : A_STRING", }; #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; #line 174 "expr.y" int main(int argc, char **argv) { extern int yyparse(void); Ac = argc; Argi = 1; Av = argv; progname = basename(argv[0]); if (getenv("SYSV3") != NULL) sysv3 = 1; setlocale(LC_COLLATE, ""); setlocale(LC_CTYPE, ""); mb_cur_max = MB_CUR_MAX; if (Av[1] && Av[1][0] == '-' && Av[1][1] == '-' && Av[1][2] == '\0') Argi++; yyparse(); /*NOTREACHED*/ return 0; } static const char *operators[] = { "|", "&", "+", "-", "*", "/", "%", ":", "=", "==", "<", "<=", ">", ">=", "!=", "match", "substr", "length", "index", "\0" }; static int op[] = { OR, AND, ADD, SUBT, MULT, DIV, REM, MCH, EQ, EQ, LT, LEQ, GT, GEQ, NEQ, MATCH, SUBSTR, LENGTH, INDEX }; int yylex(void) { register char *p; register int i; if(Argi >= Ac) return NOARG; p = Av[Argi++]; if((*p == '(' || *p == ')') && p[1] == '\0') return (int)*p; for(i = 0; *operators[i]; ++i) if(EQL(operators[i], p)) return op[i]; yylval.val = p; return A_STRING; } static char * _rel(int op, register char *r1, register char *r2) { register int64_t i; if (numeric(r1) && numeric(r2)) i = atoll(r1) - atoll(r2); else i = strcoll(r1, r2); switch(op) { case EQ: i = i==0; break; case GT: i = i>0; break; case GEQ: i = i>=0; break; case LT: i = i<0; break; case LEQ: i = i<=0; break; case NEQ: i = i!=0; break; } return i? "1": "0"; } static char * _arith(int op, char *r1, char *r2) { int64_t i1, i2; register char *rv; if (!numeric(r1) || !numeric(r2)) yyerror("non-numeric argument"); i1 = atoll(r1); i2 = atoll(r2); switch(op) { case ADD: i1 = i1 + i2; break; case SUBT: i1 = i1 - i2; break; case MULT: i1 = i1 * i2; break; case DIV: if (i2 == 0) yyerror("division by zero"); i1 = i1 / i2; break; case REM: i1 = i1 % i2; break; } rv = numpr(i1); return rv; } static char * _conj(int op, char *r1, char *r2) { register char *rv = NULL; switch(op) { case OR: if(EQL(r1, "0") || EQL(r1, "")) if(EQL(r2, "0") || EQL(r2, "")) rv = "0"; else rv = r2; else rv = r1; break; case AND: if(EQL(r1, "0") || EQL(r1, "")) rv = "0"; else if(EQL(r2, "0") || EQL(r2, "")) rv = "0"; else rv = r1; break; } return rv; } static char * match(char *s, char *p) { register char *rv; int gotcha; gotcha = ematch(s, p); if(nbra) { if (gotcha) { rv = smalloc(strlen(Mstring[0])+1); strcpy(rv, Mstring[0]); } else rv = ""; } else rv = numpr(gotcha); return rv; } #if defined (SUS) || defined (SU3) || defined (S42) static int ematch(char *s, register char *p) { regex_t re; register int num; regmatch_t bralist[2]; int reflags = 0, val; #ifdef REG_ANGLES reflags |= REG_ANGLES; #endif #if defined (SU3) && defined (REG_AVOIDNULL) reflags |= REG_AVOIDNULL; #endif if ((num = regcomp(&re, p, reflags)) != 0) errxx(0); nbra = re.re_nsub; if (regexec(&re, s, 2, bralist, 0) == 0 && bralist[0].rm_so == 0) { if (re.re_nsub >= 1) { num = bralist[1].rm_eo - bralist[1].rm_so; Mstring[0] = srealloc(Mstring[0], num + 1); strncpy(Mstring[0], s + bralist[1].rm_so, num); Mstring[0][num] = '\0'; } val = chars(s, &s[bralist[0].rm_eo]); } else val = 0; regfree(&re); return val; } #else /* !SUS, !SU3, !S42 */ static int ematch(char *s, register char *p) { char *expbuf; register int num, val; if ((expbuf = compile(p, NULL, NULL)) == NULL) errxx(regerrno); if(nbra > 1) yyerror("Too many '\\('s"); if(advance(s, expbuf)) { if(nbra == 1) { p = braslist[0]; num = braelist[0] ? braelist[0] - p : 0; Mstring[0] = srealloc(Mstring[0], num + 1); strncpy(Mstring[0], p, num); Mstring[0][num] = '\0'; } val = chars(s, loc2); } else val = 0; free(expbuf); return(val); } #endif /* !SUS, !SU3, !S42 */ /*ARGSUSED*/ static void errxx(int c) { yyerror("RE error"); } static int yyerror(const char *s) { fprintf(stderr, "%s: %s\n", progname, s); exit(2); } static int numeric(const char *s) { if (*s == '-') s++; if (!isdigit(*s & 0377)) return 0; do s++; while (isdigit(*s & 0377)); return (*s == '\0'); } static int chars(const char *s, const char *end) { int count = 0, n; wchar_t wc; if (mb_cur_max > 1) { while (s < end) { if ((n = mbtowc(&wc, s, MB_LEN_MAX)) >= 0) count++; s += n > 0 ? n : 1; } } else count = end - s; return count; } static void * srealloc(void *vp, size_t nbytes) { void *p; if ((p = realloc(vp, nbytes)) == NULL) { write(2, "no memory\n", 10); exit(077); } return p; } static void * smalloc(size_t nbytes) { return srealloc(NULL, nbytes); } static char * numpr(int64_t val) { char *rv; int ret; rv = smalloc(NUMSZ); ret = snprintf(rv, NUMSZ, "%lld", (long long)val); if (ret < 0 || ret >= NUMSZ) { rv = srealloc(rv, ret + 1); ret = snprintf(rv, ret, "%lld", (long long)val); if (ret < 0) yyerror("illegal number"); } return rv; } #define next(wc, s, n) (mb_cur_max > 1 && *(s) & 0200 ? \ ((n) = mbtowc(&(wc), (s), mb_cur_max), \ (n) = ((n) > 0 ? (n) : (n) < 0 ? illseq() : 1)) :\ ((wc) = *(s) & 0377, (n) = 1)) static int illseq(void) { yyerror("illegal byte sequence"); /*NOTREACHED*/ return 0; } static char * substr(char *v, const char *s, const char *w) { long si, wi; char *res; wchar_t wc; int n; #ifndef S42 if (sysv3 == 0) yyerror("syntax error"); #endif si = atoll(s); wi = atoll(w); while (--si) if (*v) { next(wc, v, n); v += n; } res = v; while (wi--) if (*v) { next(wc, v, n); v += n; } *v = '\0'; return res; } static char * length(const char *s) { long i = 0; char *rv; wchar_t wc; int n; #ifndef S42 if (sysv3 == 0) yyerror("syntax error"); #endif while (*s) { next(wc, s, n); s += n; ++i; } rv = numpr(i); return rv; } static char * eindex(const char *s, const char *t) { long i, j, x; char *rv; wchar_t ws, wt; int ns, nt; #ifndef S42 if (sysv3 == 0) yyerror("syntax error"); #endif for (i = 0, x = 0; s[i]; x++, i += ns) { next(ws, &s[i], ns); for (j = 0; t[j]; j += nt) { next(wt, &t[j], nt); if (ws == wt) { rv = numpr(++x); return rv; } } } return "0"; } #line 715 "y.tab.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ int yyparse __P((void)); static int yygrowstack __P((void)); static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL) return -1; yyss = newss; yyssp = newss + i; if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab int yyparse() { int yym, yyn, yystate; #if YYDEBUG char *yys; if ((yys = getenv("YYDEBUG")) != NULL) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate]) != 0) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; goto yynewerror; yynewerror: yyerror("syntax error"); goto yyerrlab; yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 1: #line 139 "expr.y" { if (sus && numeric(yyvsp[-1].val)) { int64_t n; n = atoll(yyvsp[-1].val); printf("%lld\n", n); exit(n == 0); } else puts(yyvsp[-1].val); exit((!strcmp(yyvsp[-1].val,"0")||!strcmp(yyvsp[-1].val,"\0"))? 1: 0); } break; case 2: #line 152 "expr.y" { yyval.val = yyvsp[-1].val; } break; case 3: #line 153 "expr.y" { yyval.val = _conj(OR, yyvsp[-2].val, yyvsp[0].val); } break; case 4: #line 154 "expr.y" { yyval.val = _conj(AND, yyvsp[-2].val, yyvsp[0].val); } break; case 5: #line 155 "expr.y" { yyval.val = _rel(EQ, yyvsp[-2].val, yyvsp[0].val); } break; case 6: #line 156 "expr.y" { yyval.val = _rel(GT, yyvsp[-2].val, yyvsp[0].val); } break; case 7: #line 157 "expr.y" { yyval.val = _rel(GEQ, yyvsp[-2].val, yyvsp[0].val); } break; case 8: #line 158 "expr.y" { yyval.val = _rel(LT, yyvsp[-2].val, yyvsp[0].val); } break; case 9: #line 159 "expr.y" { yyval.val = _rel(LEQ, yyvsp[-2].val, yyvsp[0].val); } break; case 10: #line 160 "expr.y" { yyval.val = _rel(NEQ, yyvsp[-2].val, yyvsp[0].val); } break; case 11: #line 161 "expr.y" { yyval.val = _arith(ADD, yyvsp[-2].val, yyvsp[0].val); } break; case 12: #line 162 "expr.y" { yyval.val = _arith(SUBT, yyvsp[-2].val, yyvsp[0].val); } break; case 13: #line 163 "expr.y" { yyval.val = _arith(MULT, yyvsp[-2].val, yyvsp[0].val); } break; case 14: #line 164 "expr.y" { yyval.val = _arith(DIV, yyvsp[-2].val, yyvsp[0].val); } break; case 15: #line 165 "expr.y" { yyval.val = _arith(REM, yyvsp[-2].val, yyvsp[0].val); } break; case 16: #line 166 "expr.y" { yyval.val = match(yyvsp[-2].val, yyvsp[0].val); } break; case 17: #line 167 "expr.y" { yyval.val = match(yyvsp[-1].val, yyvsp[0].val); } break; case 18: #line 168 "expr.y" { yyval.val = substr(yyvsp[-2].val, yyvsp[-1].val, yyvsp[0].val); } break; case 19: #line 169 "expr.y" { yyval.val = length(yyvsp[0].val); } break; case 20: #line 170 "expr.y" { yyval.val = eindex(yyvsp[-1].val, yyvsp[0].val); } break; #line 970 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); }