static int _parser_scan(State * state) { int ret; TokenCode code; char const * string; if(state->token != NULL) token_delete(state->token); if((ret = _scan_skip_meta(state)) != 0 || state->token == NULL) return ret; code = token_get_code(state->token); string = token_get_string(state->token); if(code == AS_CODE_WORD) { if(string != NULL && string[0] == '$') token_set_code(state->token, AS_CODE_IMMEDIATE); } else if(code == AS_CODE_OPERATOR_MODULO) { /* FIXME ugly workaround */ if((ret = _scan_skip_meta(state)) != 0) return ret; if(_parser_is_code(state, AS_CODE_WORD)) token_set_code(state->token, AS_CODE_REGISTER); } return 0; }
/* sign */ static int _sign(State * state) /* ( "+" | "-" ) */ { #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif state->negative = (token_get_code(state->token) == AS_CODE_OPERATOR_MINUS) ? 1 : 0; return _parser_scan(state); }
/* cpp_callback_quote */ static int _cpp_callback_quote(Parser * parser, Token * token, int c, void * data) { CppParser * cp = data; int escape = 0; char * str = NULL; size_t len = 0; char * p; if(c == '\'') token_set_code(token, CPP_CODE_SQUOTE); else if(c == '"') token_set_code(token, CPP_CODE_DQUOTE); else return 1; DEBUG_CALLBACK(); while((p = realloc(str, len + 3)) != NULL) { str = p; str[len++] = c; if((c = parser_scan_filter(parser)) == EOF || c == '\n') break; if(escape) escape = 0; else if(c == str[0]) break; else if(c == '\\') escape = 1; } if(p == NULL) /* there was an error with realloc() */ { error_set_code(1, "%s", strerror(errno)); free(str); return -1; } else if(c == str[0]) /* the quoted string is properly closed */ { str[len++] = str[0]; parser_scan_filter(parser); } /* XXX else we should probably issue a warning */ str[len] = '\0'; /* XXX keep code earlier, may fail */ _cpp_token_set(cp, token, token_get_code(token), str); free(str); return 0; }
static void _do_print_token(FILE * fp, Token * token) { CppCode code; code = token_get_code(token); #ifdef DEBUG fprintf(stderr, "DEBUG: \"%s\" (%d)\n", token_get_string(token), code); #else if(code != CPP_CODE_META_ERROR && code != CPP_CODE_META_WARNING) { fputs(token_get_string(token), fp); return; } fprintf(stderr, "%s%s%s%s%u%s%s\n", code == CPP_CODE_META_ERROR ? "Error" : "Warning", " in ", token_get_filename(token), ":", token_get_line(token), ": ", token_get_string(token)); #endif }
static int _scan_skip_meta(State * state) { int ret = 0; TokenCode code; while(cpp_scan(state->cpp, &state->token) == 0) { if(state->token == NULL) return ret; if((code = token_get_code(state->token)) < AS_CODE_META_FIRST || code > AS_CODE_META_LAST) return ret; if(code == AS_CODE_META_ERROR) ret |= _parser_error(state, "%s", token_get_string( state->token)); else if(code == AS_CODE_META_WARNING) _parser_warning(state, "%s", token_get_string( state->token)); token_delete(state->token); } return 1; }
/* parser_is_code */ static int _parser_is_code(State * state, TokenCode code) { if(state->token == NULL) return 0; return token_get_code(state->token) == code; }