-static void token(struct compile_state *state, int index)
-{
- struct file_state *file;
- struct token *tk;
- int rescan;
-
- tk = &state->token[index];
- next_token(state, tk);
- do {
- rescan = 0;
- file = state->file;
- if (tk->tok == TOK_EOF && file->prev) {
- state->file = file->prev;
- /* file->basename is used keep it */
- xfree(file->dirname);
- xfree(file->buf);
- xfree(file);
- next_token(state, tk);
- rescan = 1;
- }
- else if (tk->tok == TOK_MACRO) {
- preprocess(state, index);
- rescan = 1;
- }
- else if (tk->ident && tk->ident->sym_define) {
- rescan = compile_macro(state, &state->file, tk);
- if (rescan) {
- next_token(state, tk);
- }
- }
- else if (if_eat(state)) {
- next_token(state, tk);
- rescan = 1;
- }
- } while(rescan);
-}
-
-static int peek(struct compile_state *state)
-{
- if (state->token[1].tok == -1) {
- token(state, 1);
- }
- return state->token[1].tok;
-}
-
-static int peek2(struct compile_state *state)
-{
- if (state->token[1].tok == -1) {
- token(state, 1);
- }
- if (state->token[2].tok == -1) {
- token(state, 2);
- }
- return state->token[2].tok;
-}
-
-static void eat(struct compile_state *state, int tok)
-{
- int i;
- peek(state);
- check_tok(state, &state->token[1], tok);
-
- /* Free the old token value */
- if (state->token[0].str_len) {
- xfree((void *)(state->token[0].val.str));
- }
- for(i = 0; 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 void compile_file(struct compile_state *state, const char *filename, int local)
-{
- char cwd[MAX_CWD_SIZE];
- const char *subdir, *base;
- int subdir_len;
- struct file_state *file;
- char *basename;
- file = xmalloc(sizeof(*file), "file_state");
-
- base = strrchr(filename, '/');
- subdir = filename;
- if (base != 0) {
- subdir_len = base - filename;
- base++;
- }
- else {
- base = filename;
- subdir_len = 0;
- }
- basename = xmalloc(strlen(base) +1, "basename");
- strcpy(basename, base);
- file->basename = basename;
-
- if (getcwd(cwd, sizeof(cwd)) == 0) {
- die("cwd buffer to small");
- }
- if (subdir[0] == '/') {
- file->dirname = xmalloc(subdir_len + 1, "dirname");
- memcpy(file->dirname, subdir, subdir_len);
- file->dirname[subdir_len] = '\0';
- }
- else {
- const char *dir;
- int dirlen;
- const char **path;
- /* Find the appropriate directory... */
- dir = 0;
- if (!state->file && exists(cwd, filename)) {
- dir = cwd;
- }
- if (local && state->file && exists(state->file->dirname, filename)) {
- dir = state->file->dirname;
- }
- for(path = state->compiler->include_paths; !dir && *path; path++) {
- if (exists(*path, filename)) {
- dir = *path;
- }
- }
- if (!dir) {
- error(state, 0, "Cannot find `%s'\n", filename);
- }
- dirlen = strlen(dir);
- file->dirname = xmalloc(dirlen + 1 + subdir_len + 1, "dirname");
- memcpy(file->dirname, dir, dirlen);
- file->dirname[dirlen] = '/';
- memcpy(file->dirname + dirlen + 1, subdir, subdir_len);
- file->dirname[dirlen + 1 + subdir_len] = '\0';
- }
- file->buf = slurp_file(file->dirname, file->basename, &file->size);
-
- file->pos = file->buf;
- file->line_start = file->pos;
- file->line = 1;
-
- file->report_line = 1;
- file->report_name = file->basename;
- file->report_dir = file->dirname;
-
- file->prev = state->file;
- state->file = file;
-
- process_trigraphs(state);
- splice_lines(state);
-}
-