From 587f44fd93a0024500418ce25bf01d0f177644f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20L=2E=20=C5=A0ijanec?= Date: Sat, 16 May 2020 19:35:55 +0200 Subject: easier to add commands, accept values, added substirng --- src/bvr.h | 6 +- src/bvrcommands.c | 195 ++++++++++++++++++++++++++++++------------------------ src/tape.c | 17 +++-- 3 files changed, 126 insertions(+), 92 deletions(-) (limited to 'src') diff --git a/src/bvr.h b/src/bvr.h index 0008bef..588f31f 100644 --- a/src/bvr.h +++ b/src/bvr.h @@ -25,8 +25,8 @@ char bvr_variables[BVR_INITIAL_VARIABLES_COUNT*2][BVR_MAX_VARIABLE_SIZE]; int bvr_bvrvar_first_time_set = 1; #define BVR_VER_MAJOR 0 -#define BVR_VER_MINOR 1 -#define BVR_VER_PATCH 1 +#define BVR_VER_MINOR 2 +#define BVR_VER_PATCH 0 #define BVR_PATH_SEPARATOR ' ' #define BVR_INCLUDE_PATH_VAR_NAME "bvr_include_path" @@ -34,6 +34,8 @@ int bvr_bvrvar_first_time_set = 1; #define BVR_CONTINUE 1328 #define BVR_KEEPGOING 132 +char BVR_CHARS_TO_BREAK_VALUE[3] = {CLOSING_COMMAND_TAG_CHAR_1, EOF, '\0'}; // 0x00 mora biti na koncu (null terminated array) +#define BVR_VALUE_CHUNK_SIZE 256 int bvr_compose_stream(FILE *, FILE *); int bvr_command_processor(FILE *, FILE *); diff --git a/src/bvrcommands.c b/src/bvrcommands.c index b040d46..3d54cd0 100644 --- a/src/bvrcommands.c +++ b/src/bvrcommands.c @@ -1,7 +1,12 @@ #pragma once +#include +#include +#include +#include #include #include #include +#include int bvr_commands_check_for_command(char * input_char, char ** value, int *i, FILE * input) { if((*input_char) == LINE_COMMAND_CHAR) { FILE * command_return; @@ -11,12 +16,7 @@ int bvr_commands_check_for_command(char * input_char, char ** value, int *i, FIL fprintf(stderr, "[bvrcommands.c] bvr_commands_check_for_command: command, passed as argument, didn't return success. Going on.\n"); } fflush(command_return); - // fprintf(stderr, "debug: \"%s\"\n", (*value)+((*i)-1)); - // fprintf(stderr, "debug: \"%s\"\n", (*value)); - // fprintf(stderr, "debug: \"%d\"\n", (*i)); - // fprintf(stderr, "debug: \"%ld\"\n", (buf_size)); (*i) = (*i)+buf_size; - // fprintf(stderr, "debug: \"%d\"\n", (*i)); (*input_char) = CLOSING_COMMAND_TAG_CHAR_1; // da zaključimo loop (drugače ostane notri ?) //\\ zelo slabo. znak, ki ga najde izveden ukaz, se izgubi. rešitev bi bila dobiti zadnji input char, ki triggera break // prejšnjega ukaza, kar pa je nemogoče. @@ -27,7 +27,6 @@ int bvr_commands_check_for_command(char * input_char, char ** value, int *i, FIL } return BVR_KEEPGOING; } - char bvr_var_skip_separator_chars(FILE * input) { char input_char = fgetc(input); while(input_char == ' ' || input_char == CLOSING_COMMAND_TAG_CHAR_1 || input_char == ',' || input_char == ';' || input_char == EOF || @@ -36,68 +35,105 @@ char bvr_var_skip_separator_chars(FILE * input) { } return input_char; } -int bvr_handle_get(FILE * input, FILE * output) { - char * item = (char*) malloc(BVR_MAX_VARIABLE_SIZE+1); +char * bvr_commands_get_value(FILE * input, char * yeetus_chars) { + int value_size = BVR_VALUE_CHUNK_SIZE; + char * value = (char*) malloc(value_size); char input_char = bvr_var_skip_separator_chars(input); int i = 0; - while(input_char != ' ' && input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && input_char != '\n' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &item, &i, input) == BVR_CONTINUE) { + while(1) { + // i == napisali smo že toliko znakov + if(i >= value_size) { // <-- todo: uncomment after done debugging + value = realloc(value, (value_size) * BVR_VALUE_CHUNK_SIZE); + value_size = value_size + BVR_VALUE_CHUNK_SIZE; + } + if(char_in_array(input_char, yeetus_chars)) { + value[i++] = '\0'; + return value; // or yeet! + } + if(bvr_commands_check_for_command(&(input_char), &(value), &(i), input) == BVR_CONTINUE) { continue; } - item[i++] = input_char; + (value)[(i)++] = input_char; input_char = fgetc(input); } - item[i++] = '\0'; + // we should not get here! +} +int bvr_handle_substring(FILE * input, FILE * output) { // acts like https://www.php.net/manual/en/function.substr.php + char chars_to_break_value[69] = ",; "; + strlcat(chars_to_break_value, BVR_CHARS_TO_BREAK_VALUE, sizeof(chars_to_break_value)); + char * offset = bvr_commands_get_value(input, chars_to_break_value); + char * length = bvr_commands_get_value(input, chars_to_break_value); + char * string = bvr_commands_get_value(input, BVR_CHARS_TO_BREAK_VALUE); + + int return_status = SUCCESS; + int real_offset = atoi(offset); + + if(real_offset < 0) { + real_offset = strlen(string)-abs(real_offset); + } + + if(strlen(string) < real_offset) { // catch errors + fprintf(stderr, "[bvrcommands.c] bvr_handle_substring: string lenght (%ld) is less than offset (%d). fuck you.\n", + strlen(string), real_offset); + fprintf(output, "\nbVerbose substring: string length of %ld is less than offset of %d.\n", strlen(string), real_offset); + return_status = FAILURE; + goto cleanup_and_return; + } + if(real_offset < 0) { // catch errors + fprintf(stderr, "[bvrcommands.c] bvr_handle_substring: supplied negative offset after calculation (%d) is negative. failing...\n", + real_offset); + fprintf(output, "\nbVerbose substring: supplied negative offset after calculation (%d) is negative.\n", real_offset); + return_status = FAILURE; + goto cleanup_and_return; + } + + if(atoi(length) < 0) { + string[strlen(string)-abs(atoi(length))] = '\0'; + fprintf(output, "%s", string+real_offset); + } else { + fprintf(output, "%.*s", atoi(length), string+real_offset); + } + + cleanup_and_return: + fflush(output); + free(offset); + free(length); + free(string); + offset = NULL; + length = NULL; + string = NULL; + return return_status; +} +int bvr_handle_get(FILE * input, FILE * output) { + char chars_to_break_value[69] = ",; "; + strlcat(chars_to_break_value, BVR_CHARS_TO_BREAK_VALUE, sizeof(chars_to_break_value)); + char * item = bvr_commands_get_value(input, chars_to_break_value); + fprintf(output, "%s", bvr_var_get(item)); fflush(output); + free(item); + item = NULL; return SUCCESS; } int bvr_handle_set(FILE * input, FILE * output) { - char * item = (char *) malloc(BVR_MAX_VARIABLE_SIZE+1); - char * value = (char *) malloc(BVR_MAX_VARIABLE_SIZE+1); - char input_char = bvr_var_skip_separator_chars(input); - int i = 0; - while(input_char != ' ' && input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && input_char != '\n' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &item, &i, input) == BVR_CONTINUE) { - continue; - } - item[i++] = input_char; - input_char = fgetc(input); - } - item[i++] = '\0'; - i = 0; - input_char = bvr_var_skip_separator_chars(input); - while(input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &value, &i, input) == BVR_CONTINUE) { - // fprintf(stderr, "debug3: \"%s\"\n", value); - continue; - } - value[i++] = input_char; - input_char = fgetc(input); - } - value[i++] = '\0'; - // fprintf(stderr, "debug2: \"%s\"\n", value); - // fprintf(stderr, "debug2: \"%d\"\n", i); - return bvr_var_set(item, value); + char chars_to_break_value[69] = " "; + strlcat(chars_to_break_value, BVR_CHARS_TO_BREAK_VALUE, sizeof(chars_to_break_value)); + char * item = bvr_commands_get_value(input, chars_to_break_value); + char * value = bvr_commands_get_value(input, BVR_CHARS_TO_BREAK_VALUE); + int return_value = bvr_var_set(item, value); fflush(output); - return SUCCESS; + free(item); + free(value); + item = NULL; + value = NULL; + return return_value; } int bvr_handle_include(FILE * input, FILE * output) { - char * item = (char *) malloc(BVR_MAX_VARIABLE_SIZE+1); - char input_char = bvr_var_skip_separator_chars(input); - int i = 0; - while(input_char != ' ' && input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && input_char != '\n' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &item, &i, input) == BVR_CONTINUE) { - continue; - } - item[i++] = input_char; - input_char = fgetc(input); - } - item[i++] = '\0'; + char chars_to_break_value[69] = " "; + strlcat(chars_to_break_value, BVR_CHARS_TO_BREAK_VALUE, sizeof(chars_to_break_value)); + // fprintf(stderr, "debug: \"%s\"\n", chars_to_break_value); + char * item = bvr_commands_get_value(input, chars_to_break_value); + FILE * stream = fopen(item, "r"); char notgoodatnamingvariables[PATH_MAX]; char * path = bvr_var_get(BVR_INCLUDE_PATH_VAR_NAME); @@ -106,8 +142,8 @@ int bvr_handle_include(FILE * input, FILE * output) { strcat(notgoodatnamingvariables, BVR_COMMAND_FILE_EXT); stream = fopen(notgoodatnamingvariables, "r"); if(strcmp(path, BVR_UNDEFINED) == 0 && stream == NULL) { - fprintf(output, "\nbVerbose include error. File %s not found. Path is undefined.\n", item); - fprintf(stderr, "[bvrcommands.c] bvr_handle_include: File %s not found. Path is undefined.\n", item); + fprintf(output, "\nbVerbose include error. File \"%s\" not found. Path is undefined.\n", item); + fprintf(stderr, "[bvrcommands.c] bvr_handle_include: File \"%s\" not found. Path is undefined.\n", item); return FAILURE; } } @@ -124,8 +160,8 @@ int bvr_handle_include(FILE * input, FILE * output) { strcat(notgoodatnamingvariables, BVR_COMMAND_FILE_EXT); stream = fopen(notgoodatnamingvariables, "r"); // ob1 fuckery if(stream == NULL) { - fprintf(output, "\nbVerbose include error. File %s not found.\n", item); - fprintf(stderr, "[bvrcommands.c] bvr_handle_include: File %s not found.\n", item); + fprintf(output, "\nbVerbose include error. File \"%s\" not found.\n", item); + fprintf(stderr, "[bvrcommands.c] bvr_handle_include: File \"%s\" not found.\n", item); return FAILURE; } break; @@ -144,37 +180,26 @@ int bvr_handle_include(FILE * input, FILE * output) { } *singlepath = '\0'; } - return bvr_compose_stream(stream, output); + int return_status = bvr_compose_stream(stream, output); fflush(output); + free(item); + item = NULL; + return return_status; + fflush(output); // kja? } int bvr_handle_move(FILE * input, FILE * output) { - char * item = (char *) malloc(BVR_MAX_VARIABLE_SIZE+1); - char * value = (char *) malloc(BVR_MAX_VARIABLE_SIZE+1); - char input_char = bvr_var_skip_separator_chars(input); - int i = 0; - while(input_char != ' ' && input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && input_char != '\n' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &item, &i, input) == BVR_CONTINUE) { - continue; - } - item[i++] = input_char; - input_char = fgetc(input); - } - item[i++] = '\0'; - i = 0; - input_char = bvr_var_skip_separator_chars(input); - while(input_char != ' ' && input_char != CLOSING_COMMAND_TAG_CHAR_1 && input_char != ',' && input_char != ';' && input_char != EOF && - input_char != '\0' && input_char != '\n' && i < BVR_MAX_VARIABLE_SIZE) { - if(bvr_commands_check_for_command(&input_char, &value, &i, input) == BVR_CONTINUE) { - continue; - } - value[i++] = input_char; - input_char = fgetc(input); - } - value[i++] = '\0'; - return bvr_var_mv(item, value); + char chars_to_break_value[69] = " "; + strlcat(chars_to_break_value, BVR_CHARS_TO_BREAK_VALUE, sizeof(chars_to_break_value)); + char * item = bvr_commands_get_value(input, chars_to_break_value); + char * value = bvr_commands_get_value(input, chars_to_break_value); + + int return_value = bvr_var_mv(item, value); + free(item); + free(value); + value = NULL; + item = NULL; fflush(output); - return SUCCESS; + return return_value; } int bvr_handle_info(FILE * input, FILE * output) { diff --git a/src/tape.c b/src/tape.c index 185097b..e405001 100644 --- a/src/tape.c +++ b/src/tape.c @@ -29,8 +29,11 @@ int bvr_command_processor(FILE * page_source_file, FILE * temp_output_file) { case 'm': command_handler_output = bvr_handle_move(page_source_file, temp_output_file); break; + case 'u': + command_handler_output = bvr_handle_substring(page_source_file, temp_output_file); + break; case 'b': - fprintf(stderr, "bunden %c\n", command_entered); + // fprintf(stderr, "bunden %c\n", command_entered); command_handler_output = bvr_handle_info(page_source_file, temp_output_file); break; default: @@ -83,9 +86,11 @@ int bvr_inline_command_processor(FILE * page_source_file, FILE * output_file, ch int bvr_compose_stream(FILE * page_source_file, FILE * temp_output_file) { char copy_buffer[COPY_BUFFER_SIZE]; + int cycles = 0; for(int i = 0; i < sizeof(copy_buffer); i++) { // da garbage vrednosti ne bodo slučajno ukazi! - copy_buffer[i] = '\n'; - } + copy_buffer[i] = '\n'; // čeprav OS verjetno nastavi ram na \0\0\0\0\0\0 preden ga da procesu + } // ampak kaj pa, ko funkcijo zaženemo drugič, pointer bo kazal na isto mesto! // nočemo \0 + // copy_buffer[ftell(page_source_file)% COPY_BUFFER_SIZE] = fgetc(page_source_file); // if(copy_buffer[ftell(page_source_file)% COPY_BUFFER_SIZE] == EOF) { // goto done_reading_write_file; @@ -116,10 +121,12 @@ int bvr_compose_stream(FILE * page_source_file, FILE * temp_output_file) { // continue; // } if(copy_buffer[ftell(page_source_file)% COPY_BUFFER_SIZE] == EOF) { - fputc('\n', temp_output_file); + fputc('\n', temp_output_file); // NO POMEGRANTES! NO! NO! NO! NO POMEGRANTES! break; } - fputc(copy_buffer[(ftell(page_source_file)-1)% COPY_BUFFER_SIZE], temp_output_file); + if (cycles++ != 0) { // da ne napišemo prvega znaka bufferja, preden je sploh kaj v bufferju. + fputc(copy_buffer[(ftell(page_source_file)-1)% COPY_BUFFER_SIZE], temp_output_file); + } } return SUCCESS; } -- cgit v1.2.3