Files
K1NG-Driver/includes/tomlc17-R260618/test/scankey/scankey.c
T
2026-07-30 13:18:41 +02:00

128 lines
2.6 KiB
C

#include "../../src/tomlc17.c"
#include <stdlib.h>
const char **g_argv = 0;
int g_argc = 0;
static void usage() {
fprintf(stderr, "Usage: %s fname\n", g_argv[0]);
exit(1);
}
static void printspecial(const char *p, int n) {
for (int i = 0; i < n; i++, p++) {
int ch = (*p == '\n') ? '_' : *p;
putchar(ch);
}
}
static void printtok(char *content, const token_t tok) {
// clang-format off
#define CASESTR(x) case TOK_ ## x: s = #x; break
// clang-format on
char *s = 0;
switch (tok.toktyp) {
CASESTR(DOT);
CASESTR(EQUAL);
CASESTR(COMMA);
CASESTR(LBRACK);
CASESTR(LLBRACK);
CASESTR(RBRACK);
CASESTR(RRBRACK);
CASESTR(LBRACE);
CASESTR(RBRACE);
CASESTR(STRING);
CASESTR(MLSTRING);
CASESTR(LITSTRING);
CASESTR(MLLITSTRING);
CASESTR(TIME);
CASESTR(DATE);
CASESTR(DATETIME);
CASESTR(DATETIMETZ);
CASESTR(INTEGER);
CASESTR(FLOAT);
CASESTR(BOOL);
CASESTR(LIT);
CASESTR(ENDL);
CASESTR(FIN);
}
printf("%s %ld %d ", s, tok.str.ptr - content, tok.str.len);
printspecial(tok.str.ptr, tok.str.len);
printf("\n");
}
static char *readfile(const char *fname, int *ret_len) {
FILE *fp = fopen(fname, "r");
if (!fp) {
perror("fopen");
exit(1);
}
// Seek to the end of the file to determine its size
if (fseek(fp, 0, SEEK_END) != 0) {
perror("fseek");
exit(1);
}
long file_size = ftell(fp);
if (file_size == -1) {
perror("ftell");
exit(1);
}
rewind(fp); // Go back to the beginning of the file
// Allocate memory for the file content, plus one for the null terminator
char *content = malloc(file_size + 1);
if (!content) {
perror("out of memory");
exit(1);
}
// Read the file into the buffer
size_t read_size = fread(content, 1, file_size, fp);
if (read_size != (size_t)file_size) {
perror("fread");
exit(1);
}
content[file_size] = '\0'; // Null-terminate the string
fclose(fp);
*ret_len = file_size;
return content;
}
int main(int argc, const char *argv[]) {
g_argc = argc;
g_argv = argv;
if (argc != 2) {
usage();
}
int len;
char *content = readfile(argv[1], &len);
char errbuf[200];
scanner_t scanner;
scanner_t *sp = &scanner;
scan_init(sp, content, len, errbuf, sizeof(errbuf));
for (;;) {
(void)scan_value; // silent compiler
token_t tok;
if (scan_key(sp, &tok)) {
break;
}
if (tok.toktyp == TOK_FIN) {
break;
}
printtok(content, tok);
}
if (sp->errmsg) {
printf("ERROR: %s (line %d)\n", sp->errmsg, sp->lineno);
exit(1);
}
free(content);
return 0;
}