aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-09-02 16:14:49 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-09-02 16:14:49 +0100
commite5cba43a0e5a19360d87594ae22cdb94872e536c (patch)
tree8e2477ab3a5684f5ad0cab8ec5a5d65603afeb74 /main.c
parentc9b6b04d190c1f9d0c4dfd7c4e66ac0743be18fd (diff)
downloadobf-e5cba43a0e5a19360d87594ae22cdb94872e536c.tar.gz
obf-e5cba43a0e5a19360d87594ae22cdb94872e536c.tar.bz2
obf-e5cba43a0e5a19360d87594ae22cdb94872e536c.zip
New module for parser functions
Same principle as main->lib (previous commit).
Diffstat (limited to 'main.c')
-rw-r--r--main.c157
1 files changed, 1 insertions, 156 deletions
diff --git a/main.c b/main.c
index dc7269a..dad7e92 100644
--- a/main.c
+++ b/main.c
@@ -11,6 +11,7 @@
#include <string.h>
#include "./lib.h"
+#include "./parser.h"
#define MEMORY_DEFAULT 30000
@@ -20,162 +21,6 @@ typedef struct
uint8_t memory[MEMORY_DEFAULT];
} machine_t;
-typedef struct AST
-{
- size_t col, row;
- enum
- {
- NEXT = 0,
- PREV,
- INC,
- DEC,
- OUT,
- READ,
- LIN,
- LOUT
- } type;
- int loop_ref;
-} node_t;
-
-char *ast_to_str(node_t *ast, size_t size)
-{
- char *out = calloc(size + 1, 1);
- for (size_t i = 0; i < size; ++i)
- {
- switch (ast[i].type)
- {
- case NEXT:
- out[i] = '>';
- break;
- case PREV:
- out[i] = '<';
- break;
- case INC:
- out[i] = '+';
- break;
- case DEC:
- out[i] = '-';
- break;
- case OUT:
- out[i] = '.';
- break;
- case READ:
- out[i] = ',';
- break;
- case LIN:
- out[i] = '[';
- break;
- case LOUT:
- out[i] = ']';
- break;
- }
- }
- out[size] = '\0';
- return out;
-}
-
-struct PResult
-{
- node_t *nodes;
- size_t size;
-} parse_buffer(buffer_t *buffer)
-{
- node_t *nodes = NULL;
- size_t usable = 0, loops = 0;
- for (size_t i = 0; i < buffer->size; ++i)
- if (usable_character(buffer->data[i]))
- {
- ++usable;
- if (buffer->data[i] == '[')
- ++loops;
- }
- nodes = calloc(usable, sizeof(*nodes));
-
- // First pass: Get my info
- for (size_t i = 0, col = 0, row = 1, nptr = 0; i < buffer->size; ++i)
- {
- ++col;
- if (buffer->data[i] == '\n')
- {
- ++row;
- col = 0;
- }
- else if (usable_character(buffer->data[i]))
- {
- nodes[nptr].col = col;
- nodes[nptr].row = row;
- switch (buffer->data[i])
- {
- case '>':
- nodes[nptr].type = NEXT;
- break;
- case '<':
- nodes[nptr].type = PREV;
- break;
- case '+':
- nodes[nptr].type = INC;
- break;
- case '-':
- nodes[nptr].type = DEC;
- break;
- case '.':
- nodes[nptr].type = OUT;
- break;
- case ',':
- nodes[nptr].type = READ;
- break;
- case '[':
- nodes[nptr].type = LIN;
- nodes[nptr].loop_ref = -1;
- break;
- case ']':
- nodes[nptr].type = LOUT;
- nodes[nptr].loop_ref = -1;
- break;
- }
- ++nptr;
- }
- }
-
- // Second pass: setup any loop references
- node_t *stack[loops];
- memset(stack, 0, loops);
- size_t stackptr = 0;
- for (size_t i = 0; i < usable; ++i)
- {
- node_t *node = nodes + i;
- if (node->type == LIN)
- stack[stackptr++] = node;
- else if (node->type == LOUT)
- {
- if (stackptr == 0)
- {
- print_error(buffer->name, node->row, node->col,
- "ERROR: Unbalanced square brackets!");
- goto error;
- }
- // Access last IN loop
- --stackptr;
- node->loop_ref = stack[stackptr] - nodes;
- stack[stackptr]->loop_ref = i;
- }
- }
-
- if (stackptr > 0)
- {
- node_t *node = nodes + usable - 1;
- print_error(buffer->name, node->row, node->col,
- "ERROR: Unbalanced square brackets!");
- goto error;
- }
-
- return (struct PResult){nodes, usable};
-error:
- if (nodes)
- free(nodes);
- return (struct PResult){0};
-}
-
int main(int argc, char *argv[])
{
if (argc == 1)