-
-static int mpeek(struct compile_state *state, int index)
-{
- struct token *tk;
- int rescan;
- tk = &state->token[index + 1];
- if (tk->tok == -1) {
- do {
- raw_next_token(state, state->file, tk);
- } while(tk->tok == TOK_SPACE);
- }
- do {
- rescan = 0;
- if ((tk->tok == TOK_EOF) &&
- (state->file != state->macro_file) &&
- (state->file->prev)) {
- struct file_state *file = state->file;
- state->file = file->prev;
- /* file->basename is used keep it */
- if (file->report_dir != file->dirname) {
- xfree(file->report_dir);
- }
- xfree(file->dirname);
- xfree(file->buf);
- xfree(file);
- next_token(state, tk);
- rescan = 1;
- }
- else if (tk->ident && tk->ident->sym_define) {
- rescan = compile_macro(state, &state->file, tk);
- if (rescan) {
- next_token(state, tk);
- }
-
- }
- } while(rescan);
- /* Don't show the token on the next line */
- if (state->macro_line < state->macro_file->line) {
- return TOK_EOF;
- }
- return tk->tok;
-}
-
-static void meat(struct compile_state *state, int index, int tok)
-{
- int i;
- int next_tok;
- next_tok = mpeek(state, index);
- if (next_tok != tok) {
- check_tok(state, &state->token[index + 1], tok);
- }
-
- /* Free the old token value */
- if (state->token[index].str_len) {
- memset((void *)(state->token[index].val.str), -1,
- state->token[index].str_len);
- xfree(state->token[index].val.str);
- }
- for(i = index; i < sizeof(state->token)/sizeof(state->token[0]) - 1; i++) {
- state->token[i] = state->token[i + 1];
- }
- memset(&state->token[i], 0, sizeof(state->token[i]));
- state->token[i].tok = -1;
-}
-
-static int mpeek_raw(struct compile_state *state, int index)
-{
- struct token *tk;
- int rescan;
- tk = &state->token[index + 1];
- if (tk->tok == -1) {
- do {
- raw_next_token(state, state->file, tk);
- } while(tk->tok == TOK_SPACE);
- }
- do {
- rescan = 0;
- if ((tk->tok == TOK_EOF) &&
- (state->file != state->macro_file) &&
- (state->file->prev)) {
- struct file_state *file = state->file;
- state->file = file->prev;
- /* file->basename is used keep it */
- if (file->report_dir != file->dirname) {
- xfree(file->report_dir);
- }
- xfree(file->dirname);
- xfree(file->buf);
- xfree(file);
- next_token(state, tk);
- rescan = 1;
- }
- } while(rescan);
- /* Don't show the token on the next line */
- if (state->macro_line < state->macro_file->line) {
- return TOK_EOF;
- }
- return tk->tok;
-}
-
-static void meat_raw(struct compile_state *state, int index, int tok)
-{
- int next_tok;
- int i;
- next_tok = mpeek_raw(state, index);
- if (next_tok != tok) {
- check_tok(state, &state->token[index + 1], tok);
- }
-
- /* Free the old token value */
- if (state->token[index].str_len) {
- memset((void *)(state->token[index].val.str), -1,
- state->token[index].str_len);
- xfree(state->token[index].val.str);
- }
- for(i = index; i < sizeof(state->token)/sizeof(state->token[0]) - 1; i++) {
- state->token[i] = state->token[i + 1];
- }
- memset(&state->token[i], 0, sizeof(state->token[i]));
- state->token[i].tok = -1;
-}
-
-static long_t mcexpr(struct compile_state *state, int index);
-
-static long_t mprimary_expr(struct compile_state *state, int index)
-{
- long_t val;
- int tok;
- tok = mpeek(state, index);
- switch(tok) {
- case TOK_LPAREN:
- meat(state, index, TOK_LPAREN);
- val = mcexpr(state, index);
- meat(state, index, TOK_RPAREN);
- break;
- case TOK_LIT_INT:
- {
- long lval;
- char *end;
- meat(state, index, TOK_LIT_INT);
- errno = 0;
- lval = strtol(state->token[index].val.str, &end, 0);
- if ((lval > LONG_T_MAX) || (lval < LONG_T_MIN) ||
- (((lval == LONG_MIN) || (lval == LONG_MAX)) &&
- (errno == ERANGE))) {
- error(state, 0, "Integer constant to large");
- }
- val = lval;
- break;
- }
- default:
- meat(state, index, TOK_LIT_INT);
- val = 0;
- }
- return val;
-}
-static long_t munary_expr(struct compile_state *state, int index)
-{
- long_t val;
- int tok;
- tok = mpeek(state, index);
- if ((tok == TOK_IDENT) &&
- (state->token[index + 1].ident == state->i_defined)) {
- tok = TOK_DEFINED;
- }
- switch(tok) {
- case TOK_PLUS:
- meat(state, index, TOK_PLUS);
- val = munary_expr(state, index);
- val = + val;
- break;
- case TOK_MINUS:
- meat(state, index, TOK_MINUS);
- val = munary_expr(state, index);
- val = - val;
- break;
- case TOK_TILDE:
- meat(state, index, TOK_BANG);
- val = munary_expr(state, index);
- val = ~ val;
- break;
- case TOK_BANG:
- meat(state, index, TOK_BANG);
- val = munary_expr(state, index);
- val = ! val;
- break;
- case TOK_DEFINED:
- {
- struct hash_entry *ident;
- int parens;
- meat(state, index, TOK_IDENT);
- parens = 0;
- if (mpeek_raw(state, index) == TOK_LPAREN) {
- meat(state, index, TOK_LPAREN);
- parens = 1;
- }
- meat_raw(state, index, TOK_IDENT);
- ident = state->token[index].ident;
- val = ident->sym_define != 0;
- if (parens) {
- meat(state, index, TOK_RPAREN);
- }
- break;
- }
- default:
- val = mprimary_expr(state, index);
- break;
- }
- return val;
-
-}
-static long_t mmul_expr(struct compile_state *state, int index)
-{
- long_t val;
- int done;
- val = munary_expr(state, index);
- do {
- long_t right;
- done = 0;
- switch(mpeek(state, index)) {
- case TOK_STAR:
- meat(state, index, TOK_STAR);
- right = munary_expr(state, index);
- val = val * right;
- break;
- case TOK_DIV:
- meat(state, index, TOK_DIV);
- right = munary_expr(state, index);
- val = val / right;
- break;
- case TOK_MOD:
- meat(state, index, TOK_MOD);
- right = munary_expr(state, index);
- val = val % right;
- break;
- default:
- done = 1;
- break;
- }
- } while(!done);
-
- return val;
-}
-
-static long_t madd_expr(struct compile_state *state, int index)
-{
- long_t val;
- int done;
- val = mmul_expr(state, index);
- do {
- long_t right;
- done = 0;
- switch(mpeek(state, index)) {
- case TOK_PLUS:
- meat(state, index, TOK_PLUS);
- right = mmul_expr(state, index);
- val = val + right;
- break;
- case TOK_MINUS:
- meat(state, index, TOK_MINUS);
- right = mmul_expr(state, index);
- val = val - right;
- break;
- default:
- done = 1;
- break;
- }
- } while(!done);
-
- return val;
-}
-
-static long_t mshift_expr(struct compile_state *state, int index)
-{
- long_t val;
- int done;
- val = madd_expr(state, index);
- do {
- long_t right;
- done = 0;
- switch(mpeek(state, index)) {
- case TOK_SL:
- meat(state, index, TOK_SL);
- right = madd_expr(state, index);
- val = val << right;
- break;
- case TOK_SR:
- meat(state, index, TOK_SR);
- right = madd_expr(state, index);
- val = val >> right;
- break;
- default:
- done = 1;
- break;
- }
- } while(!done);
-
- return val;
-}
-
-static long_t mrel_expr(struct compile_state *state, int index)
-{
- long_t val;
- int done;
- val = mshift_expr(state, index);
- do {
- long_t right;
- done = 0;
- switch(mpeek(state, index)) {
- case TOK_LESS:
- meat(state, index, TOK_LESS);
- right = mshift_expr(state, index);
- val = val < right;
- break;
- case TOK_MORE:
- meat(state, index, TOK_MORE);
- right = mshift_expr(state, index);
- val = val > right;
- break;
- case TOK_LESSEQ:
- meat(state, index, TOK_LESSEQ);
- right = mshift_expr(state, index);
- val = val <= right;
- break;
- case TOK_MOREEQ:
- meat(state, index, TOK_MOREEQ);
- right = mshift_expr(state, index);
- val = val >= right;
- break;
- default:
- done = 1;
- break;
- }
- } while(!done);
- return val;
-}
-
-static long_t meq_expr(struct compile_state *state, int index)
-{
- long_t val;
- int done;
- val = mrel_expr(state, index);
- do {
- long_t right;
- done = 0;
- switch(mpeek(state, index)) {
- case TOK_EQEQ:
- meat(state, index, TOK_EQEQ);
- right = mrel_expr(state, index);
- val = val == right;
- break;
- case TOK_NOTEQ:
- meat(state, index, TOK_NOTEQ);
- right = mrel_expr(state, index);
- val = val != right;
- break;
- default:
- done = 1;
- break;
- }
- } while(!done);
- return val;
-}
-
-static long_t mand_expr(struct compile_state *state, int index)
-{
- long_t val;
- val = meq_expr(state, index);
- while (mpeek(state, index) == TOK_AND) {
- long_t right;
- meat(state, index, TOK_AND);
- right = meq_expr(state, index);
- val = val & right;
- }
- return val;
-}
-
-static long_t mxor_expr(struct compile_state *state, int index)
-{
- long_t val;
- val = mand_expr(state, index);
- while (mpeek(state, index) == TOK_XOR) {
- long_t right;
- meat(state, index, TOK_XOR);
- right = mand_expr(state, index);
- val = val ^ right;
- }
- return val;
-}
-
-static long_t mor_expr(struct compile_state *state, int index)
-{
- long_t val;
- val = mxor_expr(state, index);
- while (mpeek(state, index) == TOK_OR) {
- long_t right;
- meat(state, index, TOK_OR);
- right = mxor_expr(state, index);
- val = val | right;
- }
- return val;
-}
-
-static long_t mland_expr(struct compile_state *state, int index)
-{
- long_t val;
- val = mor_expr(state, index);
- while (mpeek(state, index) == TOK_LOGAND) {
- long_t right;
- meat(state, index, TOK_LOGAND);
- right = mor_expr(state, index);
- val = val && right;
- }
- return val;
-}
-static long_t mlor_expr(struct compile_state *state, int index)
-{
- long_t val;
- val = mland_expr(state, index);
- while (mpeek(state, index) == TOK_LOGOR) {
- long_t right;
- meat(state, index, TOK_LOGOR);
- right = mland_expr(state, index);
- val = val || right;
- }
- return val;
-}
-
-static long_t mcexpr(struct compile_state *state, int index)
-{
- return mlor_expr(state, index);
-}
-