--- trunk/mkinitrd-magellan/klibc/usr/dash/arith_yylex.c 2010/07/22 07:47:49 1121 +++ trunk/mkinitrd-magellan/klibc/usr/dash/arith_yylex.c 2010/08/18 21:11:40 1122 @@ -32,31 +32,40 @@ * SUCH DAMAGE. */ +#include #include -#include "arith.h" +#include +#include "arith_yacc.h" #include "expand.h" #include "error.h" +#include "shell.h" +#include "memalloc.h" +#include "syntax.h" +#include "system.h" -extern int yylval; -extern const char *arith_buf, *arith_startbuf; +#if ARITH_BOR + 11 != ARITH_BORASS || ARITH_ASS + 11 != ARITH_EQ +#error Arithmetic tokens are out of order. +#endif + +extern const char *arith_buf; int yylex() { int value; const char *buf = arith_buf; + const char *p; for (;;) { - switch (*buf) { + value = *buf; + switch (value) { case ' ': case '\t': case '\n': buf++; continue; default: -err: - sh_error("arith: syntax error: \"%s\"", arith_startbuf); - /* NOTREACHED */ + return ARITH_BAD; case '0': case '1': case '2': @@ -67,90 +76,158 @@ case '7': case '8': case '9': - yylval = strtoll(buf, (char **) &arith_buf, 0); + yylval.val = strtoimax(buf, (char **)&arith_buf, 0); return ARITH_NUM; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + p = buf; + while (buf++, is_in_name(*buf)) + ; + yylval.name = stalloc(buf - p + 1); + *(char *)mempcpy(yylval.name, p, buf - p) = 0; + value = ARITH_VAR; + goto out; case '=': - if (*++buf != '=') { - goto err; - } - value = ARITH_EQ; + value += ARITH_ASS - '='; +checkeq: + buf++; +checkeqcur: + if (*buf != '=') + goto out; + value += 11; break; case '>': switch (*++buf) { case '=': - value = ARITH_GE; + value += ARITH_GE - '>'; break; case '>': - value = ARITH_RSHIFT; - break; + value += ARITH_RSHIFT - '>'; + goto checkeq; default: - value = ARITH_GT; + value += ARITH_GT - '>'; goto out; } break; case '<': switch (*++buf) { case '=': - value = ARITH_LE; + value += ARITH_LE - '<'; break; case '<': - value = ARITH_LSHIFT; - break; + value += ARITH_LSHIFT - '<'; + goto checkeq; default: - value = ARITH_LT; + value += ARITH_LT - '<'; goto out; } break; case '|': if (*++buf != '|') { - value = ARITH_BOR; - goto out; + value += ARITH_BOR - '|'; + goto checkeqcur; } - value = ARITH_OR; + value += ARITH_OR - '|'; break; case '&': if (*++buf != '&') { - value = ARITH_BAND; - goto out; + value += ARITH_BAND - '&'; + goto checkeqcur; } - value = ARITH_AND; + value += ARITH_AND - '&'; break; case '!': if (*++buf != '=') { - value = ARITH_NOT; + value += ARITH_NOT - '!'; goto out; } - value = ARITH_NE; + value += ARITH_NE - '!'; break; case 0: - value = 0; goto out; case '(': - value = ARITH_LPAREN; + value += ARITH_LPAREN - '('; break; case ')': - value = ARITH_RPAREN; + value += ARITH_RPAREN - ')'; break; case '*': - value = ARITH_MUL; - break; + value += ARITH_MUL - '*'; + goto checkeq; case '/': - value = ARITH_DIV; - break; + value += ARITH_DIV - '/'; + goto checkeq; case '%': - value = ARITH_REM; - break; + value += ARITH_REM - '%'; + goto checkeq; case '+': - value = ARITH_ADD; - break; + value += ARITH_ADD - '+'; + goto checkeq; case '-': - value = ARITH_SUB; - break; + value += ARITH_SUB - '-'; + goto checkeq; case '~': - value = ARITH_BNOT; + value += ARITH_BNOT - '~'; break; case '^': - value = ARITH_BXOR; + value += ARITH_BXOR - '^'; + goto checkeq; + case '?': + value += ARITH_QMARK - '?'; + break; + case ':': + value += ARITH_COLON - ':'; break; } break;