56 lines
1.2 KiB
C
56 lines
1.2 KiB
C
#include <compiler/fzl_reader.h>
|
|
#include <compiler/internals/reader.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
|
|
// Move cursor forward
|
|
size_t move(fzl_reader_t *reader, size_t len)
|
|
{
|
|
if (!reader)
|
|
return 0;
|
|
|
|
return reader->position += len;
|
|
}
|
|
|
|
// Add single-char token
|
|
fzl_token_t *rd_single(fzl_reader_t *reader, fzl_toktype_t type)
|
|
{
|
|
fzl_file_loc l;
|
|
bool ok = fzl_linked_getpos(reader->linked, reader->position, &l);
|
|
if (!ok)
|
|
{
|
|
snprintf(last_err, sizeof(last_err), "failed to locate line:col");
|
|
return NULL;
|
|
}
|
|
|
|
move(reader, 1);
|
|
return fzl_mktoken(type, l.line, l.col, "", 0, l.filename);
|
|
}
|
|
|
|
// Add double-char token
|
|
fzl_token_t *rd_double(fzl_reader_t *reader, fzl_toktype_t type)
|
|
{
|
|
fzl_file_loc l;
|
|
bool ok = fzl_linked_getpos(reader->linked, reader->position, &l);
|
|
if (!ok)
|
|
{
|
|
snprintf(last_err, sizeof(last_err), "failed to locate line:col");
|
|
return NULL;
|
|
}
|
|
|
|
move(reader, 2);
|
|
return fzl_mktoken(type, l.line, l.col, "", 0, l.filename);
|
|
}
|
|
|
|
// Skip symbols until '\n' or EOF
|
|
void rd_comment(fzl_reader_t *reader)
|
|
{
|
|
move(reader, 2);
|
|
|
|
while (reader->position < reader->size)
|
|
{
|
|
if (reader->source[reader->position++] == '\n')
|
|
break;
|
|
}
|
|
}
|