X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/2f6928ffa8acd02f8b388294a928a36d99ad5be0..249fb9ba4de5d1a7b562ce1d6c66d526f729cffb:/vv_compiler.c 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); +}