From 249fb9ba4de5d1a7b562ce1d6c66d526f729cffb Mon Sep 17 00:00:00 2001 From: Aaron Taylor Date: Tue, 2 Jul 2019 14:56:49 -0700 Subject: [PATCH] Added compiler for pseudo-VVhitespace -> VVhitespace. --- Makefile | 22 ++++++++++ vv_compiler.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 Makefile create mode 100644 vv_compiler.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5ff4f11 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +# (c) 2019 Aaron Taylor +# All rights reserved. + +#################################################################################################### +# Configuration + +CC = cc +CC_FLAGS = -Wall -std=c99 + +#################################################################################################### +# Build + +all: vvc vvi + +vvi: + $(CC) $(CC_FLAGS) -o $@ vv_interpreter.c + +vvc: + $(CC) $(CC_FLAGS) -o $@ vv_compiler.c + +clean: + @rm -f vvc vvc.core vvi vvi.core diff --git a/vv_compiler.c b/vv_compiler.c new file mode 100644 index 0000000..3153eee --- /dev/null +++ b/vv_compiler.c @@ -0,0 +1,114 @@ +/* + * (c) 2019 Aaron Taylor + * All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define VERSION 1 + +void +print_usage(char ** argv) +{ + printf( "VVhitespace Interpreter v%d (www.subgeniuskitty.com)\n" + "Usage: %s -i -o \n" + " -h Help (prints this message)\n" + " -i Specify a pseudo-VVhitespace source file as input.\n" + " -o Specify location for VVhitespace output.\n" + , VERSION, argv[0] + ); +} + +int +main(int argc, char ** argv) +{ + /* + * Process command line arguments + */ + int c; + FILE * input = NULL, * output = NULL; + while ((c = getopt(argc,argv,"i:o:h")) != -1) { + switch (c) { + case 'i': + if ((input = fopen(optarg, "r")) == NULL) { + fprintf(stderr, "ERROR: %s: %s\n", optarg, strerror(errno)); + } + break; + case 'o': + if ((output = fopen(optarg, "w+")) == NULL) { + fprintf(stderr, "ERROR: %s: %s\n", optarg, strerror(errno)); + } + break; + case 'h': + print_usage(argv); + exit(EXIT_SUCCESS); + break; + default: + break; + } + } + if (input == NULL) { + fprintf(stderr, "ERROR: Must specify a pseudo-VVhitespace source file with -i flag.\n"); + print_usage(argv); + exit(EXIT_FAILURE); + } + if (output == NULL) { + fprintf(stderr, "ERROR: Must specify destination for VVhitespace source file with -o flag.\n"); + print_usage(argv); + exit(EXIT_FAILURE); + } + + /* + * Main Loop + */ + uint8_t temp_byte; + while (fread(&temp_byte, 1, 1, input)) { + switch (temp_byte) { + case 't': + case 'T': + temp_byte = '\t'; + fwrite(&temp_byte, 1, 1, output); + break; + case 's': + case 'S': + temp_byte = ' '; + fwrite(&temp_byte, 1, 1, output); + break; + case 'n': + case 'N': + temp_byte = '\n'; + fwrite(&temp_byte, 1, 1, output); + break; + case 'v': + case 'V': + temp_byte = '\v'; + fwrite(&temp_byte, 1, 1, output); + break; + case '\n': + /* Intentionally empty */ + break; + default: + /* The first non-[tTsSnNvV] character begins a comment lasting until end of line. */ + while (fread(&temp_byte, 1, 1, input)) { + if (temp_byte == '\n') break; + } + break; + } + } + + /* + * Cleanup and exit + */ + fclose(input); + fclose(output); + + printf("Successfully converted source code.\n"); + + exit(EXIT_SUCCESS); +} -- 2.20.1