diff --git a/bfpcompiler/include/tokenizer.h b/bfpcompiler/include/tokenizer.h index 3259771..9653c78 100644 --- a/bfpcompiler/include/tokenizer.h +++ b/bfpcompiler/include/tokenizer.h @@ -2,5 +2,17 @@ #define TOKENIZER_H #include +#include +#include + +/** + * @name extractTokens + * @return int + * @brief Extract only allowed characters from buffer; + * + * @param char* buffer: extractTokens_buffer + * @param char* tokens: extractTokens_tokens + */ +int extractTokens (char* buffer, char* tokens); #endif//TOKENIZER_H diff --git a/bfpcompiler/src/compilefuck.c b/bfpcompiler/src/compilefuck.c index cdb2b29..bdb41db 100644 --- a/bfpcompiler/src/compilefuck.c +++ b/bfpcompiler/src/compilefuck.c @@ -1,4 +1,5 @@ #include +#include #include "../include/analyzer.h" #include "../include/assembling.h" @@ -20,5 +21,69 @@ int main (int argc, char** argv) { exit(EXIT_FAILURE); } + /* Parse arguments */ + char* filename = argv[1]; + + + /* read file into buffer */ + FILE* fd = 0; /* File descriptor */ + fd = fopen(filename, "r"); + + /* make sure the file was loaded successfully */ + if (!fd) { + perror("ERROR: Could not open file!"); + exit(EXIT_FAILURE); + } + + /* create buffer and read file */ + size_t chunk_size = 512; + char* buffer; + + /* Allocate memory for buffer */ + buffer = malloc(sizeof(char) * chunk_size); + if (!buffer) { + /* Error */ + perror("malloc error on memory allocation of: buffer"); + exit(EXIT_FAILURE); + } + + size_t total_size; + size_t bytes_read; + size_t buffer_size = chunk_size; + + for (;( bytes_read = fread(buffer + total_size, 1, chunk_size, fd) ) > 0;) { + total_size += bytes_read; + + if ( total_size + chunk_size > buffer_size ) { + buffer_size += chunk_size; + buffer = (char*)realloc(buffer, buffer_size); + if (!buffer) { + perror("ERROR: Could not reallocate file buffer!"); + exit(EXIT_FAILURE); + } + } + } + + /* extract tokens from buffer */ + char* tokens; + /* Allocate memory for tokens */ + tokens = (char*)malloc(sizeof(char) * 1); + if (!tokens) { + /* Error */ + perror("malloc error on memory allocation of: tokens"); + exit(EXIT_FAILURE); + } + + extractTokens(buffer, tokens); + + /* end of lifetime for buffer */ + free( buffer ); + + /* Just print the tokens as example. */ + for (char* index = tokens; *index; index++) { + (void)printf("%c", *index); + } + (void)printf("\n"); + return rv; } diff --git a/bfpcompiler/src/tokenizer.c b/bfpcompiler/src/tokenizer.c index 94d1175..ce1693c 100644 --- a/bfpcompiler/src/tokenizer.c +++ b/bfpcompiler/src/tokenizer.c @@ -1 +1,44 @@ #include "../include/tokenizer.h" + +static char operators[] = {'>', '<', '+', '-', ',', '.', '[', ']'}; + +/** + * @name extractTokens + * @return int + * @brief Extract only allowed tokens from buffer. + * + * @param char* buffer + * @param char* tokens + */ +int extractTokens (char* buffer, char* tokens) { + int rv = 0; + + size_t token_size = 1; + size_t tokens_found = 0; + + for (char* cursor = buffer; *cursor; cursor++) { + + /* check tokens size and reallocate if necessary */ + if (tokens_found >= token_size) { + token_size *= 2; + tokens = (char*)realloc(tokens, token_size); + if (!tokens) { + perror("ERROR: Could not expand token array!"); + exit(-1); + } + } + + /* check if current symbol is a token */ + for (int i = 0; i < 8; i++) { + if (*cursor == operators[i]) { + tokens[tokens_found] = *cursor; + tokens_found++; + } + } + + } + + rv = tokens_found; + + return rv; +}