diff --git a/Makefile b/Makefile index e147713..a478d8d 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ RM=rm CFLAGS=-Wall -Werror -std=gnu99 -O0 -g LIBS= -FILES=build/main.o build/utils/vector.o build/utils/buffer.o +FILES=build/main.o build/lexer.o build/utils/vector.o build/utils/buffer.o OUT=bin/pinky.out all: $(FILES) @@ -16,6 +16,10 @@ build/main.o: src/main.c @$(ECHO) "CC\t\t"$< @$(CC) $(CFLAGS) $< -c -o $@ $(LIBS) +build/lexer.o: src/lexer.c + @$(ECHO) "CC\t\t"$< + @$(CC) $(CFLAGS) $< -c -o $@ $(LIBS) + build/utils/vector.o: src/utils/vector.c @$(ECHO) "CC\t\t"$< @$(CC) $(CFLAGS) $< -c -o $@ $(LIBS) diff --git a/src/lexer.c b/src/lexer.c new file mode 100644 index 0000000..16ede00 --- /dev/null +++ b/src/lexer.c @@ -0,0 +1,20 @@ +#include "lexer.h" + +struct lexer +lexer_create () +{ + struct lexer l = { 0 }; + + l.tokens = vector_create (); + + return l; +} + +void +lexer_free (struct lexer *lexer) +{ + if (!lexer) + return; + + vector_free (&lexer->tokens); +} diff --git a/src/lexer.h b/src/lexer.h new file mode 100644 index 0000000..25981fa --- /dev/null +++ b/src/lexer.h @@ -0,0 +1,14 @@ +#ifndef __LEXER_H +#define __LEXER_H + +#include "utils/vector.h" + +struct lexer +{ + struct vector tokens; +}; + +struct lexer lexer_create (); +void lexer_free (struct lexer *lexer); + +#endif diff --git a/src/main.c b/src/main.c index 2dda947..bbd5115 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,10 @@ #include #include +#include "utils/buffer.h" + +#include "lexer.h" + int main (int argc, char **argv) { @@ -10,5 +14,14 @@ main (int argc, char **argv) return EXIT_FAILURE; } + struct buffer code = buffer_create (); + if (!buffer_read (argv[1], &code)) + return EXIT_FAILURE; + + struct lexer lexer = lexer_create (); + + lexer_free (&lexer); + buffer_free (&code); + return EXIT_SUCCESS; } diff --git a/src/token.h b/src/token.h new file mode 100644 index 0000000..b32a6e7 --- /dev/null +++ b/src/token.h @@ -0,0 +1,14 @@ +#ifndef __TOKEN_H +#define __TOKEN_H + +enum token_type +{ +}; + +struct token +{ + enum token_type type; + char lexeme[4]; +}; + +#endif diff --git a/src/utils/buffer.c b/src/utils/buffer.c index 92b7c0d..f9171e9 100644 --- a/src/utils/buffer.c +++ b/src/utils/buffer.c @@ -22,7 +22,7 @@ buffer_create () { struct buffer b = { 0 }; - b.capacity = 16; + b.capacity = 4; b.buf = calloc (b.capacity, sizeof (char)); if (!b.buf) { @@ -77,6 +77,41 @@ buffer_get (struct buffer *b) return b->buf; } +_Bool +buffer_read (const char *path, struct buffer *b) +{ + if (!path || !b) + return 0; + + FILE *fp = fopen (path, "r"); + if (!fp) + { + fputs ("buffer_read: cannot open path.", stderr); + return 0; + } + + fseek (fp, 0, SEEK_END); + size_t size = ftell (fp); + fseek (fp, 0, SEEK_SET); + + char *buf = malloc (sizeof (char) * size); + if (!buf) + { + fclose (fp); + fputs ("buffer_read: cannot allocate memory for temporary buffer.", + stderr); + return 0; + } + fread (buf, size, 1, fp); + + buffer_append (buf, b); + + free (buf); + fclose (fp); + + return 1; +} + void buffer_free (struct buffer *b) { diff --git a/src/utils/buffer.h b/src/utils/buffer.h index b732675..d5a46fe 100644 --- a/src/utils/buffer.h +++ b/src/utils/buffer.h @@ -14,6 +14,7 @@ struct buffer buffer_create (); void buffer_append (const char *s, struct buffer *b); void buffer_printf (struct buffer *b, const char *fmt, ...); char *buffer_get (struct buffer *b); +_Bool buffer_read (const char *path, struct buffer *b); void buffer_free (struct buffer *b); #endif diff --git a/tests/expr.pinky b/tests/expr.pinky new file mode 100644 index 0000000..bf5b0e0 --- /dev/null +++ b/tests/expr.pinky @@ -0,0 +1,2 @@ +# Evaluate a simple expression +2 + 3 \ No newline at end of file