commit 41c64bbaebc015b042cd43f14bf2407e17fe48a9
parent 18d88480bc4da10e9c224d951f7d7510bb542d1a
Author: citbl <citbl@citbl.org>
Date: Sun, 10 May 2026 16:58:08 +1000
reformat
Diffstat:
| M | .clang-format | | | 4 | ++-- |
| M | src/common.h | | | 136 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | src/lexer.c | | | 172 | +++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | src/main.c | | | 28 | ++++++++++++++-------------- |
| M | src/utils.c | | | 68 | ++++++++++++++++++++++++++++++++++---------------------------------- |
5 files changed, 203 insertions(+), 205 deletions(-)
diff --git a/.clang-format b/.clang-format
@@ -1,6 +1,6 @@
BasedOnStyle: Webkit
-IndentWidth: 8
-ContinuationIndentWidth: 8
+IndentWidth: 4
+ContinuationIndentWidth: 4
UseTab: AlignWithSpaces
PointerAlignment: Right
diff --git a/src/common.h b/src/common.h
@@ -6,91 +6,91 @@
#include <stddef.h>
typedef enum Token_Type {
- NOTYETSET = 9,
- IDENT,
- KEYWORD,
- SYMBOL,
- PLUS,
- MIN,
- STAR,
- SLASH,
- BACKSLASH,
- PERCENT,
- LBRACE,
- RBRACE,
- LPAREN,
- RPAREN,
- EQ_EQ,
- BANG_EQ,
- EQ_GT,
- LT_EQ,
- LT_DASH,
- DASH_GT,
- EQ,
- BANG,
- LIT_STRING,
- LIT_DECIMAL,
- LIT_INT,
- LIT_BOOL,
- LIT_VOID,
+ NOTYETSET = 9,
+ IDENT,
+ KEYWORD,
+ SYMBOL,
+ PLUS,
+ MIN,
+ STAR,
+ SLASH,
+ BACKSLASH,
+ PERCENT,
+ LBRACE,
+ RBRACE,
+ LPAREN,
+ RPAREN,
+ EQ_EQ,
+ BANG_EQ,
+ EQ_GT,
+ LT_EQ,
+ LT_DASH,
+ DASH_GT,
+ EQ,
+ BANG,
+ LIT_STRING,
+ LIT_DECIMAL,
+ LIT_INT,
+ LIT_BOOL,
+ LIT_VOID,
} Token_Type;
typedef enum Keyword {
- IF = 139,
- ELSE,
- WHILE,
- OPT,
- LAZY,
- MATCH,
- DEF,
- FOR,
- EACH,
- SOME,
- NONE,
- OK,
- ERR,
- IN,
- IS,
- CAST
+ IF = 139,
+ ELSE,
+ WHILE,
+ OPT,
+ LAZY,
+ MATCH,
+ DEF,
+ FOR,
+ EACH,
+ SOME,
+ NONE,
+ OK,
+ ERR,
+ IN,
+ IS,
+ CAST
} Keyword;
/////////////////////////////////////////////////
typedef struct String {
- char *value;
- size_t cap;
- size_t len;
+ char *value;
+ size_t cap;
+ size_t len;
} String;
typedef struct Token {
- Token_Type type;
- union Value {
- String as_string;
- char as_char;
- size_t as_int;
- bool as_bool;
- } value;
- const char *path;
- const char *filename;
- size_t line;
- size_t col;
+ Token_Type type;
+ union Value {
+ String as_string;
+ char as_char;
+ size_t as_int;
+ bool as_bool;
+ } value;
+ const char *path;
+ const char *filename;
+ size_t line;
+ size_t col;
} Token;
typedef struct Lexer_State {
- size_t pos;
- bool in_string;
- bool in_comment;
+ size_t pos;
+ bool in_string;
+ bool in_comment;
} Lexer_State;
typedef struct Lexer {
- const char *code;
- size_t code_len;
- const char *path;
- const char *filename;
- Lexer_State state;
- Token *tokens;
- size_t len;
- size_t cap;
+ const char *code;
+ size_t code_len;
+ const char *path;
+ const char *filename;
+ Lexer_State state;
+ Token *tokens;
+ size_t len;
+ size_t cap;
} Lexer;
/////////////////////////////////////////////////
diff --git a/src/lexer.c b/src/lexer.c
@@ -4,123 +4,121 @@
static void add_token(Lexer *l, Token t)
{
- if (l->len >= l->cap) {
- l->cap = l->cap == 0 ? 256 : l->cap * 2;
- l->tokens = realloc(l->tokens, l->cap * sizeof(Token));
- }
+ if (l->len >= l->cap) {
+ l->cap = l->cap == 0 ? 256 : l->cap * 2;
+ l->tokens = realloc(l->tokens, l->cap * sizeof(Token));
+ }
- l->tokens[l->len++] = t;
+ l->tokens[l->len++] = t;
}
void print_tokens(Lexer *l)
{
- Token t;
- Token_Type typ;
- size_t i;
-
- for (i = 0; i < l->len; i++) {
- t = l->tokens[i];
- typ = t.type;
- switch (typ) {
- case LIT_STRING:
- printf("STRING LITERAL: %s\n", l->tokens[i].value.as_string.value);
- break;
- default:
- printf("print_tokens: unhandled token %i", typ);
- break;
- }
+ Token t;
+ Token_Type typ;
+ size_t i;
+
+ for (i = 0; i < l->len; i++) {
+ t = l->tokens[i];
+ typ = t.type;
+ switch (typ) {
+ case LIT_STRING:
+ printf("STRING LITERAL: %s\n", l->tokens[i].value.as_string.value);
+ break;
+ default:
+ printf("print_tokens: unhandled token %i", typ);
+ break;
}
+ }
}
static void add_to_string(Token *t, char c)
{
- String *str = &t->value.as_string;
- char *new_value;
+ String *str = &t->value.as_string;
+ char *new_value;
- if (str->len >= str->cap) {
- str->cap = str->cap == 0 ? 256 : str->cap * 2;
- str->value = realloc(str->value, str->cap * sizeof(char));
- }
+ if (str->len >= str->cap) {
+ str->cap = str->cap == 0 ? 256 : str->cap * 2;
+ str->value = realloc(str->value, str->cap * sizeof(char));
+ }
- str->value[str->len++] = c;
- str->value[str->len] = '\0';
+ str->value[str->len++] = c;
+ str->value[str->len] = '\0';
}
static char peek(Lexer *l)
{
- size_t next = l->state.pos + 1;
+ size_t next = l->state.pos + 1;
- if (next >= l->code_len) {
- return '\0';
- }
+ if (next >= l->code_len) {
+ return '\0';
+ }
- return l->code[next];
+ return l->code[next];
}
static char consume(Lexer *l)
{
- return l->code[++l->state.pos];
+ return l->code[++l->state.pos];
}
static void run_until_char(Lexer *l, char c)
{
- do {
- // printf("%zu", l->state.pos);
- l->state.pos++;
- } while (peek(l) != c);
+ do {
+ // printf("%zu", l->state.pos);
+ l->state.pos++;
+ } while (peek(l) != c);
}
Lexer *lexer_lex(Lexer *l)
{
- char c = '\0';
- size_t len = strlen(l->code);
- Token t = {
- .filename = l->filename, .path = l->path, .col = -1, .line = -1, .type = NOTYETSET, .value = { 0 }
- };
-
- l->tokens = calloc(250, sizeof(Token));
- l->state.pos = 0;
- l->state.in_string = false;
-
- // longest valid token first
- while (l->state.pos <= len) {
- c = l->code[l->state.pos];
-
- if (c == '/' && peek(l) == '/') {
- // continue until the end of the line
- run_until_char(l, '\n');
- l->state.pos++;
- continue;
- }
-
- switch (c) {
- case '\"':
- l->state.in_string = true;
- t.type = LIT_STRING;
- c = l->code[++l->state.pos];
-
- while (l->code[l->state.pos] != '\"') {
- add_to_string(&t, c);
- c = l->code[++l->state.pos];
- }
-
- l->state.pos++;
- l->state.in_string = false;
- add_token(l, t);
- continue;
- case EOF:
- return l;
- case '\n':
- case '\r':
- l->state.pos++;
- continue;
- break;
- }
-
- // printf("%zu", l->state.pos);
- printf("unhandled: %c\n", c);
- l->state.pos++;
+ char c = '\0';
+ size_t len = strlen(l->code);
+ Token t = { .filename = l->filename, .path = l->path, .col = -1, .line = -1, .type = NOTYETSET, .value = { 0 } };
+
+ l->tokens = calloc(250, sizeof(Token));
+ l->state.pos = 0;
+ l->state.in_string = false;
+
+ // longest valid token first
+ while (l->state.pos <= len) {
+ c = l->code[l->state.pos];
+
+ if (c == '/' && peek(l) == '/') {
+ // continue until the end of the line
+ run_until_char(l, '\n');
+ l->state.pos++;
+ continue;
}
- return l;
+ switch (c) {
+ case '\"':
+ l->state.in_string = true;
+ t.type = LIT_STRING;
+ c = l->code[++l->state.pos];
+
+ while (l->code[l->state.pos] != '\"') {
+ add_to_string(&t, c);
+ c = l->code[++l->state.pos];
+ }
+
+ l->state.pos++;
+ l->state.in_string = false;
+ add_token(l, t);
+ continue;
+ case EOF:
+ return l;
+ case '\n':
+ case '\r':
+ l->state.pos++;
+ continue;
+ break;
+ }
+
+ // printf("%zu", l->state.pos);
+ printf("unhandled: %c\n", c);
+ l->state.pos++;
+ }
+
+ return l;
}
diff --git a/src/main.c b/src/main.c
@@ -6,24 +6,24 @@
int main(int argc, char **args)
{
- char *filename;
- char *contents;
- Lexer lexer = { 0 };
+ char *filename;
+ char *contents;
+ Lexer lexer = { 0 };
- if (argc < 1) return 1;
+ if (argc < 1) return 1;
- filename = args[1];
- if (filename == NULL) return 1;
+ filename = args[1];
+ if (filename == NULL) return 1;
- contents = read_file(filename);
- if (contents == NULL) return 1;
- lexer.code = contents;
- lexer.code_len = strlen(contents);
+ contents = read_file(filename);
+ if (contents == NULL) return 1;
+ lexer.code = contents;
+ lexer.code_len = strlen(contents);
- lexer = *lexer_lex(&lexer);
+ lexer = *lexer_lex(&lexer);
- print_tokens(&lexer);
+ print_tokens(&lexer);
- printf("\n");
- return 0;
+ printf("\n");
+ return 0;
}
diff --git a/src/utils.c b/src/utils.c
@@ -6,46 +6,46 @@
char *read_file(const char *filename)
{
- long fsize;
- char *source;
- FILE *fp = fopen(filename, "r");
- if (fp == NULL) {
- fprintf(stderr, "file not found\n");
- return NULL;
- }
-
- fseek(fp, 0, SEEK_END);
- fsize = ftell(fp);
- fseek(fp, 0, SEEK_SET);
-
- source = malloc(fsize + 1);
- fread(source, fsize, 1, fp);
- fclose(fp);
-
- source[fsize] = '\0';
- return source;
+ long fsize;
+ char *source;
+ FILE *fp = fopen(filename, "r");
+ if (fp == NULL) {
+ fprintf(stderr, "file not found\n");
+ return NULL;
+ }
+
+ fseek(fp, 0, SEEK_END);
+ fsize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ source = malloc(fsize + 1);
+ fread(source, fsize, 1, fp);
+ fclose(fp);
+
+ source[fsize] = '\0';
+ return source;
}
void separate_file_from_path(const char *fullpath, char **out_path, char **out_filename)
{
- char *path = strdup(fullpath);
- char *filename = strrchr(path, '/');
-
- if (filename == NULL) {
- printf("No path found\n");
- exit(1);
- }
-
- *filename = '\0';
- filename++;
- *out_path = strdup(path);
- *out_filename = strdup(filename);
- free(path);
+ char *path = strdup(fullpath);
+ char *filename = strrchr(path, '/');
+
+ if (filename == NULL) {
+ printf("No path found\n");
+ exit(1);
+ }
+
+ *filename = '\0';
+ filename++;
+ *out_path = strdup(path);
+ *out_filename = strdup(filename);
+ free(path);
}
void die(bool condition, const char *message)
{
- if (!condition) return;
- fprintf(stderr, "%s", message);
- exit(1);
+ if (!condition) return;
+ fprintf(stderr, "%s", message);
+ exit(1);
}