#include "collection.h" #include "parse.h" #include #include #include #include #include #include char* read_textfile(const char* filename) { FILE* fp = fopen(filename, "r"); if (!fp) { goto couldnt_read_file; } if (fseek(fp, 0, SEEK_END) != 0) { goto couldnt_read_file; } long file_size = ftell(fp); if (file_size < 0) { goto couldnt_read_file; } if (fseek(fp, 0, SEEK_SET) != 0) { goto couldnt_read_file; } char* buffer = malloc(file_size + 1); assert(buffer); if (fread(buffer, sizeof(char), file_size, fp) != (size_t)file_size) { goto couldnt_read_file; } buffer[file_size] = '\0'; return buffer; couldnt_read_file: fprintf(stderr, "error: couldn't read file '%s': %s\n", filename, strerror(errno)); return nullptr; } int main(int argc, char* argv[]) { if (argc < 2) { fprintf(stderr, "error: no filename\n"); return EXIT_FAILURE; } char* filename = argv[1]; char* text = read_textfile(filename); if (!text) { return EXIT_FAILURE; } printf("--- text ---\n%s\n", text); SourceIter source_chars; source_iter_init(&source_chars, text); LslIter lsl_chars; lsl_iter_init(&lsl_chars, &source_chars); Arena tok_arena; arena_init(&tok_arena, strlen(text) * 4); Lexer lexer; lexer_init(&lexer, &lsl_chars, &tok_arena); Preproc preproc; preproc_init(&preproc, &lexer); printf("--- tokens ---\n"); int line = 1; int col = 1; Tok tok; while ((tok = preproc_next(&preproc)).ty != Tok_Eof) { // printf("%s\t%s\n", tokty_str(tok.ty), tok.text); while (line < tok.line) { printf("\n"); line += 1; col = 1; } while (col < tok.col) { printf(" "); col += 1; } printf("%s", tok.text); line = tok.line; col = tok.col + strlen(tok.text); } fputs("\n", stdout); preproc_deinit(&preproc); free(text); arena_deinit(&tok_arena); }