Compare commits
2 Commits
10d6876de4
...
118a25055c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
118a25055c | ||
|
|
e7d3bca4d7 |
83
src/main.c
83
src/main.c
@@ -11,42 +11,67 @@
|
|||||||
|
|
||||||
#include <alisp/alisp.h>
|
#include <alisp/alisp.h>
|
||||||
|
|
||||||
const char *TOKEN_DELIM = "\n ";
|
void usage(FILE *fp)
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
{
|
||||||
sym_table_t table = {0};
|
fprintf(fp, "Usage: alisp [OPTIONS...] FILE\n"
|
||||||
sym_table_init(&table);
|
"Options:\n"
|
||||||
|
"\t--help Print this usage and exit.\n"
|
||||||
|
"File:\n"
|
||||||
|
"\t<filename> Read and interpret this file from filesystem.\n"
|
||||||
|
"\t-- Read and interpret from stdin using an EOF.\n");
|
||||||
|
}
|
||||||
|
|
||||||
char filename[] = "./lorem.txt";
|
int main(int argc, char *argv[])
|
||||||
FILE *fp = fopen(filename, "r");
|
{
|
||||||
|
int ret = 0;
|
||||||
|
if (argc == 1)
|
||||||
|
{
|
||||||
|
usage(stderr);
|
||||||
|
ret = 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
else if (argc != 2)
|
||||||
|
{
|
||||||
|
TODO("alisp doesn't support multiple files currently.");
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fp = NULL;
|
||||||
stream_t stream = {0};
|
stream_t stream = {0};
|
||||||
stream_init_file(&stream, filename, fp);
|
if (strncmp(argv[1], "--", 2) == 0)
|
||||||
|
|
||||||
for (u64 token_no = 1; !stream_eoc(&stream); ++token_no)
|
|
||||||
{
|
{
|
||||||
// Skip forward any delimiters
|
stream_err_t err = stream_init_pipe(&stream, "stdin", stdin);
|
||||||
stream_while(&stream, TOKEN_DELIM);
|
if (err)
|
||||||
// Get the token (up until delimiter)
|
{
|
||||||
sv_t token = stream_till(&stream, TOKEN_DELIM);
|
fprintf(stderr, "ERROR: %s from `%s`\n", stream_err_to_cstr(err),
|
||||||
char *interned = sym_table_find(&table, token);
|
argv[1]);
|
||||||
printf("%s[%lu] => `%s`\n", stream.name, token_no, interned);
|
ret = 1;
|
||||||
}
|
goto end;
|
||||||
|
}
|
||||||
printf("\nTable count=%lu\n", table.count);
|
}
|
||||||
for (u64 i = 0, j = 0; i < table.capacity; ++i)
|
else if (strncmp(argv[1], "--help", 6) == 0)
|
||||||
{
|
{
|
||||||
sv_t token = VEC_GET(&table.entries, i, sv_t);
|
usage(stdout);
|
||||||
if (!token.data)
|
goto end;
|
||||||
continue;
|
}
|
||||||
printf("[%lu]@[%lu] => `" PR_SV "`\n", j, i, SV_FMT(token));
|
else
|
||||||
++j;
|
{
|
||||||
|
fp = fopen(argv[1], "rb");
|
||||||
|
stream_err_t err = stream_init_file(&stream, argv[1], fp);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: %s from `%s`\n", stream_err_to_cstr(err),
|
||||||
|
argv[1]);
|
||||||
|
ret = 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG("[INFO]: Initialised stream for `%s`\n", stream.name);
|
||||||
|
end:
|
||||||
|
if (fp)
|
||||||
|
fclose(fp);
|
||||||
stream_stop(&stream);
|
stream_stop(&stream);
|
||||||
fclose(fp);
|
return ret;
|
||||||
sym_table_cleanup(&table);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copyright (C) 2025, 2026 Aryadev Chavali
|
/* Copyright (C) 2025, 2026 Aryadev Chavali
|
||||||
|
|||||||
@@ -192,10 +192,9 @@ bool stream_chunk(stream_t *stream)
|
|||||||
|
|
||||||
char stream_next(stream_t *stream)
|
char stream_next(stream_t *stream)
|
||||||
{
|
{
|
||||||
char c = stream_peek(stream);
|
if (stream_peek(stream) != '\0')
|
||||||
if (c != '\0')
|
|
||||||
++stream->position;
|
++stream->position;
|
||||||
return c;
|
return stream_peek(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
char stream_peek(stream_t *stream)
|
char stream_peek(stream_t *stream)
|
||||||
|
|||||||
Reference in New Issue
Block a user