103 lines
2.1 KiB
C
103 lines
2.1 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("--- 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);
|
|
}
|