From de91ec0542aea5959376ee0d2c9d486268dd9392 Mon Sep 17 00:00:00 2001 From: Elis Eriksson Date: Sat, 20 Jun 2026 11:26:50 +0200 Subject: Add a README, replace the shell script with C code. Add a LICENSE. --- src/bfc.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'src/bfc.c') diff --git a/src/bfc.c b/src/bfc.c index d567f88..fc7d29d 100644 --- a/src/bfc.c +++ b/src/bfc.c @@ -1,16 +1,55 @@ #include "all.h" #include "str.h" +#include +#include +#include +#include +#include int main(void) { str input = {0}; str_append_fread(&input, stdin); + + // Run the lexer to get tokens (honestly useless considering the simplicity of + // BF) lexer_t lexer = lex_init(&input); lex_run(&lexer); + + // Run the parser and turn tokens into an AST representation parser_t p = parser_init(&lexer); ast_node_t *ast = parse_program(&p); str c_code = gen_code(ast); + + // Run gcc + int fd[2]; + pipe(fd); + + if (fork() == 0) { + dup2(fd[0], STDIN_FILENO); + close(fd[0]); + close(fd[1]); + + char *argv[] = {"gcc", "-Os", + "-flto", "-fuse-linker-plugin", + "-DNDEBUG", "-fomit-frame-pointer", + "-nostdlib", "-nostartfiles", + "-no-pie", "-fno-stack-protector", + "-o", "/proc/self/fd/1", + "-x", "c", + "-", NULL}; + + execvp("gcc", argv); + perror("execvp"); + _exit(1); + } + + // Cleanup + close(fd[0]); + write(fd[1], c_code.data, strlen(c_code.data)); + close(fd[1]); + wait(NULL); + ast_free(ast); - printf("%s", c_code.data); free_str(&input); return 0; } -- cgit v1.3-7-ge9ab