larpcc/main.c
2026-09-19 03:02:59 +02:00

86 lines
1.7 KiB
C

#include "collection.h"
#include "parse.h"
#include <assert.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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("%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);
Tok tok;
while ((tok = preproc_next(&preproc)).ty != Tok_Eof) {
printf("%s\t%s\n", tokty_str(tok.ty), tok.text);
}
preproc_deinit(&preproc);
free(text);
arena_deinit(&tok_arena);
}