apfl/src/main.c

75 lines
1.5 KiB
C
Raw Normal View History

2021-12-10 20:22:16 +00:00
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include "apfl.h"
static bool
repl_source_reader(void *context, char *buf, size_t *len, bool need)
{
(void)context;
printf(need ? "... " : "> ");
fflush(stdout);
size_t maxlen = *len;
if (fgets(buf, maxlen, stdin) == NULL) {
if (feof(stdin)) {
*len = 0;
return true;
} else {
return false;
}
}
*len = strlen(buf);
return true;
}
int
main(int argc, const char **argv)
{
(void)argc;
(void)argv;
int rv = 0;
apfl_tokenizer_ptr tokenizer = NULL;
if (!(tokenizer = apfl_tokenizer_new(repl_source_reader, NULL))) {
fprintf(stderr, "Failed initializing tokenizer\n");
goto exit;
}
while (true) {
struct apfl_error err;
struct apfl_token token;
switch (apfl_tokenizer_next(tokenizer, false)) {
case APFL_PARSE_OK:
token = apfl_tokenizer_get_token(tokenizer);
apfl_token_print(token, stdout);
apfl_token_deinit(&token);
break;
case APFL_PARSE_EOF:
goto exit;
case APFL_PARSE_ERROR:
err = apfl_tokenizer_get_error(tokenizer);
apfl_error_print(err, stderr);
if (APFL_ERROR_IS_FATAL(err)) {
rv = 1;
goto exit;
}
break;
}
}
exit:
apfl_tokenizer_destroy(tokenizer);
return rv;
}