From 4f5b22525ded3a2667d1ce4e5e8f6e11c27df391 Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Tue, 31 Mar 2026 19:35:18 +0000 Subject: [PATCH 01/12] Unfinished rewrite. --- .gitmodules | 3 + CMakeLists.txt | 5 +- README.md | 1 - bothExample.em | 18 ----- enumExample.em | 14 ---- example.em | 23 ++++++ langExample.em | 13 --- src/VoArray | 1 + src/errorMake.c | 180 +++++++++++------------------------------- src/file.c | 6 ++ src/file.h | 7 ++ src/item.c | 149 ++-------------------------------- src/item.h | 13 ++- src/main.c | 9 +++ src/progInfo.h.in | 17 ++-- src/setting.c | 120 ---------------------------- src/setting.h | 35 -------- src/variable.c | 126 +++++++++++++++++++++++++++++ src/variable.h | 35 ++++++++ src/verbose.c | 4 + src/verbose.h | 25 ++++++ src/whitespace.c | 14 ---- src/whitespace.h | 7 -- vim/syntax/esmake.vim | 10 +-- 24 files changed, 312 insertions(+), 523 deletions(-) create mode 100644 .gitmodules delete mode 100644 bothExample.em delete mode 100644 enumExample.em create mode 100644 example.em delete mode 100644 langExample.em create mode 160000 src/VoArray delete mode 100644 src/setting.c delete mode 100644 src/setting.h create mode 100644 src/variable.c create mode 100644 src/variable.h create mode 100644 src/verbose.c create mode 100644 src/verbose.h delete mode 100644 src/whitespace.c delete mode 100644 src/whitespace.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4279bf0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/VoArray"] + path = src/VoArray + url = https://github.com/StevenSYS/VoArray diff --git a/CMakeLists.txt b/CMakeLists.txt index 06dafe6..ac50be2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,11 @@ cmake_minimum_required(VERSION 3.11) project(ESMake LANGUAGES C VERSION 1.0) -option(BUILD_FOR_I586 "Build ${PROGRAM_NAME} for i586 (Intel Pentium) or higher" OFF) +option(BUILD_FOR_I586 "Build ${PROJECT_NAME} for i586 (Intel Pentium) or higher" OFF) # Windows Compiler Options -option(BUILD_USING_MSVCRT20 "Build ${PROGRAM_NAME} using msvcrt20 (Windows Compiler Only)" OFF) +option(BUILD_USING_MSVCRT20 "Build ${PROJECT_NAME} using msvcrt20 (Windows Compiler Only)" OFF) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVOARRAY_DEFCONFIG") set(CMAKE_C_FLAGS_DEBUG "-g -Wall") set(CMAKE_C_FLAGS_RELEASE "-O2") if(NOT CMAKE_C_COMPILER_ID MATCHES "Clang") diff --git a/README.md b/README.md index f78191e..69222b0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ A program that helps with making errors strings and enums the way I do it | Legend | Meaning | | ------ | --------------------------- | -| > | Output(s) - First line only | | % | Setting | | + | Item | | - | Item (Switch Default) | diff --git a/bothExample.em b/bothExample.em deleted file mode 100644 index 2cd5715..0000000 --- a/bothExample.em +++ /dev/null @@ -1,18 +0,0 @@ -> "exampleRet.h" "exampleEnum.h" -%mode "enum" -%preEnum "ERROR_" -%preLang "LANG_ERROR_" -! | Legend | Meaning | -! | ------ | --------------------------- | -! | > | Output(s) - First line only | -! | % | Setting | -! | + | Item | -! | - | Item (Switch Default) | -! | ! | Comment | -! | \ | Escape | - -+EXAMPLE -> "exampleLang.h" -%mode "lang" - -+EXAMPLE "Example error" \ No newline at end of file diff --git a/enumExample.em b/enumExample.em deleted file mode 100644 index febcbbf..0000000 --- a/enumExample.em +++ /dev/null @@ -1,14 +0,0 @@ -> "exampleRet.h" "exampleEnum.h" -%mode "enum" -%preEnum "ERROR_" -%preLang "LANG_ERROR_" -! | Legend | Meaning | -! | ------ | --------------------------- | -! | > | Output(s) - First line only | -! | % | Setting | -! | + | Item | -! | - | Item (Switch Default) | -! | ! | Comment | -! | \ | Escape | - -+EXAMPLE \ No newline at end of file diff --git a/example.em b/example.em new file mode 100644 index 0000000..24ae46f --- /dev/null +++ b/example.em @@ -0,0 +1,23 @@ +>ret "exampleRet.h" +>enum "exampleEnum.h" +>lang "exampleLang.h" +>lang2 "exampleLang2.h" +%preEnum "VISION_ERROR_" +%preLang "LANG_ERROR_" +! | Legend | Meaning | +! | ------ | --------------------------- | +! | > | Output Variable | +! | % | Variable | +! | + | Item | +! | - | Item (Switch Default) | +! | | | Item - Lang Output | +! | ! | Comment | +! | \ | Escape | + +-EXAMPLE +|lang "lang - Example error" +|lang2 "lang2 - Example error" + ++EXAMPLE2 +|lang "lang - Example error 2" +|lang2 "lang2 - Example error 2" \ No newline at end of file diff --git a/langExample.em b/langExample.em deleted file mode 100644 index efcba93..0000000 --- a/langExample.em +++ /dev/null @@ -1,13 +0,0 @@ -> "exampleLang.h" -%mode "lang" -%preLang "LANG_ERROR_" -! | Legend | Meaning | -! | ------ | --------------------------- | -! | > | Output(s) - First line only | -! | % | Setting | -! | + | Item | -! | - | Item (Switch Default) | -! | ! | Comment | -! | \ | Escape | - -+EXAMPLE "Example error" \ No newline at end of file diff --git a/src/VoArray b/src/VoArray new file mode 160000 index 0000000..129e105 --- /dev/null +++ b/src/VoArray @@ -0,0 +1 @@ +Subproject commit 129e105267625f5da3cdf114ca18fdba86848ae9 diff --git a/src/errorMake.c b/src/errorMake.c index fe592e3..de6f450 100644 --- a/src/errorMake.c +++ b/src/errorMake.c @@ -1,124 +1,55 @@ +#include #include #include #include "file.h" #include "item.h" -#include "setting.h" +#include "verbose.h" +#include "variable.h" #include "progInfo.h" -#include "whitespace.h" -static char check = 0; -static char *outNames[MAX_OUTPUTS]; +// static char check = 0; -static inline unsigned int getItemCount(FILE *fileInput) { +static inline size_t getItemCount(FILE *fileInput) { char buffer[LENGTH_BUFFER] = { 0 }; - unsigned int ret = 0; + size_t ret = 0; long int prevPos = ftell(fileInput); + VERBOSE_PRINTF("Getting item count...\n"); + while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { if ( buffer[0] == LEGEND_ITEM || - buffer[0] == LEGEND_ITEMDEFAULT + buffer[0] == LEGEND_ITEM_DEFAULT ) { ret++; } } - fseek(fileInput, prevPos, SEEK_SET); - return ret; -} - -static inline unsigned int initFiles(FILE *files[]) { - unsigned int i; - unsigned int ret = 0; - - for (i = 0; i < MAX_OUTPUTS && outNames[i] != NULL; i++) { - if (file_open( - &files[i], - outNames[i], - "w" - )) { - return 0; - } - - fprintf(files[i], AUTOGEN_TEXT); - ret++; - } + VERBOSE_PRINTF("Got item count: %zu\n", ret); - if (!ret) { - fprintf(stderr, "ERROR: All files are NULL\n"); - return 0; - } + fseek(fileInput, prevPos, SEEK_SET); return ret; } -int getOutputs(char *str) { - unsigned char j; - unsigned int i = 0; - unsigned int k; - - for (k = 0; k < MAX_OUTPUTS; k++) { - outNames[k] = NULL; - } - - for (k = 0; k < MAX_OUTPUTS; k++) { - for (j = 0; j < 2; j++) { - check = 0; - - for (i++; str[i]; i++) { - if (str[i] == '"') { - check = 1; - if (j == 0) { - outNames[k] = str + (i + 1); - } else { - str[i] = 0; - } - break; - } else if ( - j == 0 && - !whitespace(str[i]) - ) { - fprintf(stderr, "ERROR: Output contains non whitespace character\n"); - return 1; - } - } - - if (!check) { - if ( - j == 0 && - k > 0 - ) { - break; - } else if (j != 0) { - fprintf(stderr, "ERROR: Output is missing end of string\n"); - } - return 1; - } - } - } - return 0; -} - int errorMake_readFile(FILE *fileInput) { char buffer[LENGTH_BUFFER] = { 0 }; - unsigned int i; - unsigned int fileCount = 0; - unsigned int offset = 0; - unsigned int itemCount = getItemCount(fileInput); + unsigned char offset; + VOARRAY_TYPE_SIZE i; size_t bufLen; - enum modes mode; - FILE *files[MAX_OUTPUTS]; - settings_t settings = { 0 }; - setting_t *tmpSet; + size_t itemCount = getItemCount(fileInput); + files_t files = { NULL, 1 }; + variables_t outVars = { NULL, 1 }; + variables_t vars = { NULL, 1 }; if (fileInput == NULL) { fprintf(stderr, "ERROR: Required argument is NULL\n"); return 1; } - for (i = 0; i < MAX_OUTPUTS; i++) { - files[i] = NULL; - } + VOARRAY_INIT(FILE *, files, 1); + VOARRAY_INIT(variable_t, vars, 1); + VOARRAY_INIT(variable_t, outVars, 1); while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { offset = 0; @@ -126,10 +57,10 @@ int errorMake_readFile(FILE *fileInput) { if ( ( buffer[0] != LEGEND_OUTPUT && - buffer[0] != LEGEND_SETTING && + buffer[0] != LEGEND_VARIABLE && buffer[0] != LEGEND_COMMENT ) && - !fileCount + !files.length ) { fprintf(stderr, "ERROR: No output files have been specified\n"); return 1; @@ -137,79 +68,58 @@ int errorMake_readFile(FILE *fileInput) { switch (buffer[0]) { case LEGEND_OUTPUT: - for (i = 0; i < MAX_OUTPUTS; i++) { - if (files[i] != NULL) { - fclose(files[i]); - } - } - if (getOutputs(buffer)) { + if (variable_getStr(&outVars, buffer)) { return 1; } + file_open( + &files.i[files.length - 1], + outVars.i[outVars.length - 2].value, + "w" + ); + VERBOSE_PRINTF("Increasing file list size...\n"); + files.length++; + VOARRAY_RESIZE(FILE *, files, 1); - fileCount = initFiles(files); - - if (!fileCount) { - return 1; - } + VERBOSE_PRINTF("Increased file list size\n"); break; - case LEGEND_SETTING: - if (setting_getStr(&settings, buffer)) { + case LEGEND_VARIABLE: + if (variable_getStr(&vars, buffer)) { return 1; } - - if (strncmp( - buffer + 1, - SETTING_MODE, - LENGTH_BUFFER - 1 - ) == 0) { - tmpSet = setting_find(&settings, SETTING_MODE); - - if (tmpSet == NULL) { - fprintf(stderr, "ERROR: \"" SETTING_MODE "\" isn't set\n"); - return 1; - } - - if (mode_getStr( - tmpSet->value, - &mode - )) { - return 1; - } - } break; case LEGEND_ITEM: - case LEGEND_ITEMDEFAULT: + case LEGEND_ITEM_DEFAULT: if (item_addFile( - files, - fileCount, - itemCount, buffer, - mode, - &settings + &files, + &outVars, + &vars )) { return 1; } break; + case LEGEND_ITEM_OUT: + break; case LEGEND_COMMENT: break; case LEGEND_ESCAPE: offset = 1; default: bufLen = strlen(buffer + offset); - for (i = 0; i < fileCount; i++) { + for (i = 0; i < files.length - 1; i++) { fwrite( buffer + offset, sizeof(char), bufLen, - files[i] + files.i[i] ); } break; } } - for (i = 0; i < fileCount; i++) { - fclose(files[i]); - } + VOARRAY_UNINIT(outVars); + VOARRAY_UNINIT(vars); + VOARRAY_UNINIT(files); return 0; } \ No newline at end of file diff --git a/src/file.c b/src/file.c index 7371560..0390dd7 100644 --- a/src/file.c +++ b/src/file.c @@ -1,5 +1,7 @@ #include +#include "verbose.h" + int file_open( FILE **output, const char *filename, @@ -7,9 +9,13 @@ int file_open( ) { *output = fopen(filename, mode); + VERBOSE_PRINTF("%s (%s) - Opening file...\n", filename, mode); + if (*output == NULL) { perror("ERROR: Failed to open file"); return 1; } + + VERBOSE_PRINTF("%s (%s) - Opened file\n", filename, mode); return 0; } \ No newline at end of file diff --git a/src/file.h b/src/file.h index 0231518..d966d85 100644 --- a/src/file.h +++ b/src/file.h @@ -1,6 +1,10 @@ #ifndef __FILE_H__ #define __FILE_H__ +#include + +#include "VoArray/voArray.h" + /* Functions */ int file_open( FILE **output, @@ -8,4 +12,7 @@ int file_open( const char *mode ); +/* VoArrays */ +VOARRAY(files_t, FILE *); + #endif \ No newline at end of file diff --git a/src/item.c b/src/item.c index e145298..421a5a1 100644 --- a/src/item.c +++ b/src/item.c @@ -1,153 +1,14 @@ +#include #include #include "item.h" #include "progInfo.h" -#include "whitespace.h" int item_addFile( - FILE *files[], - unsigned int fileCount, - unsigned int itemCount, - char *str, - enum modes mode, - settings_t *settings + const char *buffer, + files_t *files, + variables_t *outVars, + variables_t *vars ) { - char check = 0; - char *value; - unsigned int i; - unsigned char j; - static unsigned int currentCount = 0; - static enum modes prevMode = MODE_COUNT; - static setting_t *preEnum = NULL; - static setting_t *preLang = NULL; - - if (mode != prevMode) { - currentCount = 0; - prevMode = mode; - } - - if ( - files == NULL || - str == NULL || - settings == NULL - ) { - fprintf(stderr, "ERROR: Required argument(s) is/are NULL\n"); - return 1; - } - - if ( - mode != MODE_LANG && - preEnum == NULL - ) { - preEnum = setting_find(settings, SETTING_PREENUM); - - if (preEnum == NULL) { - fprintf(stderr, "ERROR: \"" SETTING_PREENUM "\" isn't set\n"); - return 1; - } - } - - if (preLang == NULL) { - preLang = setting_find(settings, SETTING_PRELANG); - - if (preLang == NULL) { - fprintf(stderr, "ERROR: \"" SETTING_PRELANG "\" isn't set\n"); - return 1; - } - } - - switch (mode) { - case MODE_ENUM: - /* Ret */ - for (i = 0; str[i]; i++) { - if (whitespace(str[i])) { - str[i] = 0; - break; - } - } - - if (str[0] == LEGEND_ITEMDEFAULT) { - fprintf( - files[0], - "default: return %s%s;\n", - preLang->value, - str + 1 - ); - } else { - fprintf( - files[0], - "case %s%s: return %s%s;\n", - preEnum->value, - str + 1, - preLang->value, - str + 1 - ); - } - - /* Enum */ - fprintf( - files[1], - "%s%s", - preEnum->value, - str + 1 - ); - - if (currentCount < (itemCount - 1)) { - fprintf(files[1], ","); - } - - fprintf(files[1], "\n"); - break; - case MODE_LANG: - for (i = 0; str[i]; i++) { - if (whitespace(str[i])) { - str[i] = 0; - break; - } - } - - for (j = 0; j < 2; j++) { - check = 0; - - for (i++; str[i]; i++) { - if (str[i] == '"') { - if (j == 0) { - value = str + (i + 1); - } else { - check = 1; - str[i] = 0; - } - break; - } else if ( - j == 0 && - !whitespace(str[i]) - ) { - fprintf(stderr, "ERROR: Non whitespace character before value string\n"); - return 1; - } - } - - if ( - j != 0 && - !check - ) { - fprintf(stderr, "ERROR: Missing end of value string\n"); - return 1; - } - } - - fprintf( - files[0], - "#define %s%s \"%s\"\n", - preLang->value, - str + 1, - value - ); - break; - default: - fprintf(stderr, "ERROR: Unknown mode: %d\n", mode); - return 1; - } - currentCount++; return 0; } \ No newline at end of file diff --git a/src/item.h b/src/item.h index 3d3d5fe..1516216 100644 --- a/src/item.h +++ b/src/item.h @@ -4,16 +4,15 @@ #include #include "mode.h" -#include "setting.h" +#include "file.h" +#include "variable.h" /* Functions */ int item_addFile( - FILE *files[], - unsigned int fileCount, - unsigned int itemCount, - char *str, - enum modes mode, - settings_t *settings + const char *buffer, + files_t *files, + variables_t *outVars, + variables_t *vars ); #endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7ebf8f1..605621e 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,8 @@ #include "progInfo.h" #include "errorMake.h" +extern char verbose_enabled; + int main( int argc, char *argv[] @@ -16,6 +18,13 @@ int main( return 1; } + if ( + argc > 2 && + strcmp(argv[2], ARGUMENT_VERBOSE) == 0 + ) { + verbose_enabled = 1; + } + if (file_open( &fileInput, argv[1], diff --git a/src/progInfo.h.in b/src/progInfo.h.in index ddd07c9..1139d39 100644 --- a/src/progInfo.h.in +++ b/src/progInfo.h.in @@ -9,9 +9,10 @@ /* - Legend - */ #define LEGEND_OUTPUT '>' -#define LEGEND_SETTING '%' +#define LEGEND_VARIABLE '%' #define LEGEND_ITEM '+' -#define LEGEND_ITEMDEFAULT '-' +#define LEGEND_ITEM_DEFAULT '-' +#define LEGEND_ITEM_OUT '|' #define LEGEND_COMMENT '!' #define LEGEND_ESCAPE '\\' @@ -19,13 +20,13 @@ #define TYPE_ENUM "enum" #define TYPE_LANG "lang" -/* - Max - */ -#define MAX_OUTPUTS 2 +/* - Variable - */ +#define VARIABLE_MODE "mode" +#define VARIABLE_PREENUM "preEnum" +#define VARIABLE_PRELANG "preLang" -/* - Setting - */ -#define SETTING_MODE "mode" -#define SETTING_PREENUM "preEnum" -#define SETTING_PRELANG "preLang" +/* - Argument - */ +#define ARGUMENT_VERBOSE "-v" /* - Misc. - */ #define AUTOGEN_TEXT \ diff --git a/src/setting.c b/src/setting.c deleted file mode 100644 index d172c0c..0000000 --- a/src/setting.c +++ /dev/null @@ -1,120 +0,0 @@ -#include -#include - -#include "setting.h" -#include "whitespace.h" - -int setting_add( - settings_t *settings, - const setting_t *setting -) { - if (settings->count >= SETTING_LENGTH) { - fprintf(stderr, "ERROR: No free slots in settings variable\n"); - return 1; - } - - strncpy( - settings->i[settings->count].name, - setting->name, - SETTING_LENGTH_STRING - ); - strncpy( - settings->i[settings->count].value, - setting->value, - SETTING_LENGTH_STRING - ); - - settings->count++; - return 0; -} - -setting_t *setting_find( - settings_t *settings, - const char *find -) { - unsigned int i; - - for (i = 0; i < settings->count; i++) { - if (strncmp( - settings->i[i].name, - find, - SETTING_LENGTH_STRING - ) == 0) { - return &settings->i[i]; - } - } - return NULL; -} - -int setting_getStr( - settings_t *settings, - char *str -) { - char check = 0; - char *value; - unsigned int i; - unsigned char j; - - setting_t tmpSet; - setting_t *tmpSetPtr; - - for (i = 1; str[i]; i++) { - if (whitespace(str[i])) { - str[i] = 0; - strncpy( - tmpSet.name, - str + 1, - SETTING_LENGTH_STRING - ); - break; - } - } - - for (j = 0; j < 2; j++) { - check = 0; - - for (i++; str[i]; i++) { - if (str[i] == '"') { - if (j == 0) { - value = str + (i + 1); - } else { - check = 1; - str[i] = 0; - strncpy( - tmpSet.value, - value, - SETTING_LENGTH_STRING - ); - } - break; - } else if ( - j == 0 && - !whitespace(str[i]) - ) { - fprintf(stderr, "ERROR: Non whitespace character before value string\n"); - return 1; - } - } - - if ( - j != 0 && - !check - ) { - fprintf(stderr, "ERROR: Missing end of value string\n"); - return 1; - } - } - - tmpSetPtr = setting_find(settings, tmpSet.name); - - if (tmpSetPtr == NULL) { - setting_add(settings, &tmpSet); - } else { - strncpy( - tmpSetPtr->value, - tmpSet.value, - SETTING_LENGTH_STRING - ); - } - return 0; -} \ No newline at end of file diff --git a/src/setting.h b/src/setting.h deleted file mode 100644 index 830b2f8..0000000 --- a/src/setting.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __SETTING__ -#define __SETTING__ - -/* Macros */ -#define SETTING_LENGTH 3 -#define SETTING_LENGTH_STRING 100 - -/* Structs */ -typedef struct { - char name[SETTING_LENGTH_STRING]; - char value[SETTING_LENGTH_STRING]; -} setting_t; - -typedef struct { - unsigned int count; - setting_t i[SETTING_LENGTH]; -} settings_t; - -/* Functions */ -int setting_add( - settings_t *settings, - const setting_t *setting -); - -int setting_getStr( - settings_t *settings, - char *str -); - -setting_t *setting_find( - settings_t *settings, - const char *find -); - -#endif \ No newline at end of file diff --git a/src/variable.c b/src/variable.c new file mode 100644 index 0000000..5914120 --- /dev/null +++ b/src/variable.c @@ -0,0 +1,126 @@ +#include +#include +#include + +#include "verbose.h" +#include "variable.h" + +int variable_add( + variables_t *vars, + const variable_t *var +) { + VERBOSE_PRINTF("%s - Adding variable to variable list...\n", var->name); + strncpy( + vars->i[vars->length - 1].name, + var->name, + VARIABLE_LENGTH_STRING + ); + strncpy( + vars->i[vars->length - 1].value, + var->value, + VARIABLE_LENGTH_STRING + ); + VERBOSE_PRINTF("%s - Added variable to variable list\n", var->name); + + VERBOSE_PRINTF("%s - Increasing variable list size...\n", var->name); + vars->length++; + VOARRAY_RESIZE(variable_t, (*vars), 1); + VERBOSE_PRINTF("%s - Increased variable list size: %zu\n", var->name, vars->length); + return 0; +} + +variable_t *variable_find( + variables_t *variables, + const char *find +) { + VOARRAY_TYPE_SIZE i; + + VERBOSE_PRINTF("%s - Searching for variable in variable list...\n", find); + + for (i = 0; i < variables->length; i++) { + if (strncmp( + variables->i[i].name, + find, + VARIABLE_LENGTH_STRING + ) == 0) { + VERBOSE_PRINTF("%s - Found variable in variable list\n", find); + return &variables->i[i]; + } + } + + VERBOSE_PRINTF("%s - Failed to find variable in variable list\n", find); + return NULL; +} + +int variable_getStr( + variables_t *variables, + char *str +) { + char check = 0; + char *value; + unsigned char j; + size_t i; + + variable_t tmpVar; + variable_t *tmpVarPtr; + + for (i = 1; str[i]; i++) { + if (isspace(str[i])) { + str[i] = 0; + strncpy( + tmpVar.name, + str + 1, + VARIABLE_LENGTH_STRING + ); + break; + } + } + + for (j = 0; j < 2; j++) { + check = 0; + + for (i++; str[i]; i++) { + if (str[i] == '"') { + if (j == 0) { + value = str + (i + 1); + } else { + check = 1; + str[i] = 0; + strncpy( + tmpVar.value, + value, + VARIABLE_LENGTH_STRING + ); + } + break; + } else if ( + j == 0 && + !isspace(str[i]) + ) { + fprintf(stderr, "ERROR: Non whitespace character before value string\n"); + return 1; + } + } + + if ( + j != 0 && + !check + ) { + fprintf(stderr, "ERROR: Missing end of value string\n"); + return 1; + } + } + + tmpVarPtr = variable_find(variables, tmpVar.name); + + if (tmpVarPtr == NULL) { + variable_add(variables, &tmpVar); + } else { + strncpy( + tmpVarPtr->value, + tmpVar.value, + VARIABLE_LENGTH_STRING + ); + } + return 0; +} \ No newline at end of file diff --git a/src/variable.h b/src/variable.h new file mode 100644 index 0000000..2763746 --- /dev/null +++ b/src/variable.h @@ -0,0 +1,35 @@ +#ifndef __VARIABLE__ +#define __VARIABLE__ + +#include "VoArray/voArray.h" + +/* Macros */ +#define VARIABLE_LENGTH 10 +#define VARIABLE_LENGTH_STRING 100 + +/* Structs */ +typedef struct { + char name[VARIABLE_LENGTH_STRING]; + char value[VARIABLE_LENGTH_STRING]; +} variable_t; + +/* VoArrays */ +VOARRAY(variables_t, variable_t); + +/* Functions */ +int variable_add( + variables_t *vars, + const variable_t *var +); + +int variable_getStr( + variables_t *vars, + char *str +); + +variable_t *variable_find( + variables_t *vars, + const char *find +); + +#endif \ No newline at end of file diff --git a/src/verbose.c b/src/verbose.c new file mode 100644 index 0000000..c92d6f2 --- /dev/null +++ b/src/verbose.c @@ -0,0 +1,4 @@ +#include +#include + +char verbose_enabled = 0; \ No newline at end of file diff --git a/src/verbose.h b/src/verbose.h new file mode 100644 index 0000000..90b61cd --- /dev/null +++ b/src/verbose.h @@ -0,0 +1,25 @@ +#ifndef __VERBOSE__ +#define __VERBOSE__ + +#include + +/* Macros */ +#ifndef __FILE_NAME__ + #define __FILE_NAME__ __FILE__ +#endif + +#define VERBOSE_PRINTF(...) \ + if (verbose_enabled) { \ + printf( \ + "%s: %i - %s: ", \ + __FILE_NAME__, \ + __LINE__, \ + __func__ \ + ); \ + printf(__VA_ARGS__); \ + } + +/* Functions */ +extern char verbose_enabled; + +#endif \ No newline at end of file diff --git a/src/whitespace.c b/src/whitespace.c deleted file mode 100644 index 480d4ad..0000000 --- a/src/whitespace.c +++ /dev/null @@ -1,14 +0,0 @@ -char whitespace(char chr) { - switch (chr) { - case ' ': - case '\t': - case '\n': - case '\v': - case '\f': - case '\r': - return 1; - default: - return 0; - } - return 0; -} \ No newline at end of file diff --git a/src/whitespace.h b/src/whitespace.h deleted file mode 100644 index 9dcae07..0000000 --- a/src/whitespace.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __WHITESPACE__ -#define __WHITESPACE__ - -/* Functions */ -char whitespace(char chr); - -#endif \ No newline at end of file diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index 2a370b3..37c95eb 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -9,16 +9,16 @@ endif runtime! syntax/c.vim -syn match emOutput "^>" -syn match emSetting "^%\S\+" -syn match emItem "^[+|-]\S\+" +syn match emVariable "^[%>]\S\+" +syn match emItem "^[+-]\S\+" +syn match emItemOut "^|\S\+" syn match emEscape "^\\.\+" syn region emComment start="^!" skip="\\$" end="$" " Settings -hi def link emOutput keyword -hi def link emSetting keyword +hi def link emVariable keyword hi def link emItem structure +hi def link emItemOut function hi def link emEscape special hi def link emComment comment From 9012cd912cda9d3dc17b9c016e2654e66d1e937e Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Wed, 1 Apr 2026 00:51:32 +0000 Subject: [PATCH 02/12] Really bad broken code. --- example.em | 10 ++-- src/errorMake.c | 70 +++++++++++++++++----- src/file.c | 7 ++- src/item.c | 148 +++++++++++++++++++++++++++++++++++++++++++++- src/item.h | 11 +++- src/main.c | 3 + src/progInfo.h.in | 16 +++-- src/variable.c | 24 ++++++-- src/variable.h | 10 ++-- 9 files changed, 257 insertions(+), 42 deletions(-) diff --git a/example.em b/example.em index 24ae46f..52baa98 100644 --- a/example.em +++ b/example.em @@ -13,11 +13,11 @@ ! | | | Item - Lang Output | ! | ! | Comment | ! | \ | Escape | - --EXAMPLE ++EXAMPLE |lang "lang - Example error" |lang2 "lang2 - Example error" -+EXAMPLE2 -|lang "lang - Example error 2" -|lang2 "lang2 - Example error 2" \ No newline at end of file +/* This item is the default in the return switch */ +-DEFEXAMPLE +|lang "lang - Default error" +|lang2 "lang2 - Default error" \ No newline at end of file diff --git a/src/errorMake.c b/src/errorMake.c index de6f450..3e309ac 100644 --- a/src/errorMake.c +++ b/src/errorMake.c @@ -15,7 +15,7 @@ static inline size_t getItemCount(FILE *fileInput) { size_t ret = 0; long int prevPos = ftell(fileInput); - VERBOSE_PRINTF("Getting item count...\n"); + VERBOSE_PRINTF("Getting item count\n"); while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { if ( @@ -34,10 +34,11 @@ static inline size_t getItemCount(FILE *fileInput) { int errorMake_readFile(FILE *fileInput) { char buffer[LENGTH_BUFFER] = { 0 }; + char itemName[LENGTH_BUFFER] = { 0 }; unsigned char offset; - VOARRAY_TYPE_SIZE i; size_t bufLen; size_t itemCount = getItemCount(fileInput); + VOARRAY_TYPE_SIZE i = 0; files_t files = { NULL, 1 }; variables_t outVars = { NULL, 1 }; variables_t vars = { NULL, 1 }; @@ -51,7 +52,17 @@ int errorMake_readFile(FILE *fileInput) { VOARRAY_INIT(variable_t, vars, 1); VOARRAY_INIT(variable_t, outVars, 1); + files.i[0] = NULL; + while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { + if (item_init( + &files, + &outVars, + &vars + )) { + return 1; + } + offset = 0; if ( @@ -60,7 +71,7 @@ int errorMake_readFile(FILE *fileInput) { buffer[0] != LEGEND_VARIABLE && buffer[0] != LEGEND_COMMENT ) && - !files.length + !(files.length - 1) ) { fprintf(stderr, "ERROR: No output files have been specified\n"); return 1; @@ -68,37 +79,58 @@ int errorMake_readFile(FILE *fileInput) { switch (buffer[0]) { case LEGEND_OUTPUT: - if (variable_getStr(&outVars, buffer)) { + if (variable_getStr( + &outVars, + buffer, + &i + )) { return 1; } + file_open( - &files.i[files.length - 1], - outVars.i[outVars.length - 2].value, + &files.i[i], + outVars.i[i].value, "w" ); - VERBOSE_PRINTF("Increasing file list size...\n"); - files.length++; - VOARRAY_RESIZE(FILE *, files, 1); - VERBOSE_PRINTF("Increased file list size\n"); + if ((files.length - 1) == i) { + VERBOSE_PRINTF("Increasing file list size\n"); + files.length++; + VOARRAY_RESIZE(FILE *, files, 1); + files.i[files.length - 1] = NULL; + + VERBOSE_PRINTF("Increased file list size\n"); + } break; case LEGEND_VARIABLE: - if (variable_getStr(&vars, buffer)) { + if (variable_getStr(&vars, buffer, NULL)) { return 1; } break; case LEGEND_ITEM: case LEGEND_ITEM_DEFAULT: - if (item_addFile( - buffer, - &files, - &outVars, - &vars + offset = 1; + + if (item_cleanName(buffer + offset)) { + return 1; + } + + strncpy( + itemName, + buffer + offset, + LENGTH_BUFFER - offset + ); + + if (item_add( + itemName, + (buffer[0] == LEGEND_ITEM_DEFAULT), + itemCount )) { return 1; } break; case LEGEND_ITEM_OUT: + // printf("%s\n", itemName); break; case LEGEND_COMMENT: break; @@ -118,6 +150,12 @@ int errorMake_readFile(FILE *fileInput) { } } + for (i = 0; i < files.length - 1; i++) { + if (files.i[i] != NULL) { + fclose(files.i[i]); + } + } + VOARRAY_UNINIT(outVars); VOARRAY_UNINIT(vars); VOARRAY_UNINIT(files); diff --git a/src/file.c b/src/file.c index 0390dd7..718a9d9 100644 --- a/src/file.c +++ b/src/file.c @@ -7,9 +7,14 @@ int file_open( const char *filename, const char *mode ) { + if (*output != NULL) { + VERBOSE_PRINTF("Output pointer had an already open file, closing\n"); + fclose(*output); + } + *output = fopen(filename, mode); - VERBOSE_PRINTF("%s (%s) - Opening file...\n", filename, mode); + VERBOSE_PRINTF("%s (%s) - Opening file\n", filename, mode); if (*output == NULL) { perror("ERROR: Failed to open file"); diff --git a/src/item.c b/src/item.c index 421a5a1..2d05c71 100644 --- a/src/item.c +++ b/src/item.c @@ -2,13 +2,157 @@ #include #include "item.h" +#include "verbose.h" #include "progInfo.h" -int item_addFile( - const char *buffer, +enum types { + TYPES_RET, + TYPES_ENUM, + + TYPES_COUNT +}; + +enum vars { + VARS_PREENUM, + VARS_PRELANG, + + VARS_COUNT +}; + +static const char *typeNames[TYPES_COUNT] = { + "ret", + "enum" +}; +static const char *varNames[VARS_COUNT] = { + "preEnum", + "preLang" +}; + +static FILE **fileList[TYPES_COUNT]; +static char *varVal[VARS_COUNT]; + +void item_preInit() { + unsigned char i; + + for (i = 0; i < TYPES_COUNT; i++) { + fileList[i] = NULL; + } + + for (i = 0; i < VARS_COUNT; i++) { + varVal[i] = NULL; + } + return; +} + +int item_init( files_t *files, variables_t *outVars, variables_t *vars ) { + unsigned char i; + VOARRAY_TYPE_SIZE position = 0; + variable_t *tmpVar; + static char fullInited = 0; + + if (fullInited) { + VERBOSE_PRINTF("Skipping, already initialized\n"); + return 0; + } + + fullInited = 1; + + for (i = 0; i < TYPES_COUNT; i++) { + if (fileList[i] == NULL) { + tmpVar = variable_find( + outVars, + typeNames[i], + &position + ); + + if (tmpVar == NULL) { + fullInited = 0; + } else { + fileList[i] = &files->i[position]; + fprintf(*fileList[i], AUTOGEN_TEXT); + } + } + } + + for (i = 0; i < VARS_COUNT; i++) { + if (varVal[i] == NULL) { + tmpVar = variable_find( + vars, + varNames[i], + NULL + ); + + if (tmpVar == NULL) { + fullInited = 0; + } else { + varVal[i] = tmpVar->value; + } + } + } + return 0; +} + +int item_cleanName(char *str) { + size_t i; + + for (i = 0; str[i]; i++) { + if (isspace(str[i])) { + str[i] = 0; + break; + } + } + + for (i++; str[i]; i++) { + if (!isspace(str[i])) { + fprintf(stderr, "ERROR: Non whitespace character after item name\n"); + return 1; + } + } + return 0; +} + +int item_add( + const char *name, + char def, + size_t count +) { + static size_t i = 0; + + if (def) { + fprintf( + *fileList[TYPES_RET], + "default: return %s%s;\n", + varVal[VARS_PRELANG], + name + ); + } else { + fprintf( + *fileList[TYPES_RET], + "case %s%s: return %s%s;\n", + varVal[VARS_PREENUM], + name, + varVal[VARS_PRELANG], + name + ); + } + + fprintf( + *fileList[TYPES_ENUM], + "%s%s", + varVal[VARS_PREENUM], + name + ); + + if (i < (count - 1)) { + fprintf(*fileList[TYPES_ENUM], ","); + } + + fprintf(*fileList[TYPES_ENUM], "\n"); + + i++; return 0; } \ No newline at end of file diff --git a/src/item.h b/src/item.h index 1516216..a370ab1 100644 --- a/src/item.h +++ b/src/item.h @@ -8,11 +8,18 @@ #include "variable.h" /* Functions */ -int item_addFile( - const char *buffer, +void item_preInit(); +int item_init( files_t *files, variables_t *outVars, variables_t *vars ); +int item_cleanName(char *str); +int item_add( + const char *name, + char def, + size_t count +); + #endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 605621e..1304b5a 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include #include "file.h" +#include "item.h" #include "progInfo.h" #include "errorMake.h" @@ -18,6 +19,8 @@ int main( return 1; } + item_preInit(); + if ( argc > 2 && strcmp(argv[2], ARGUMENT_VERBOSE) == 0 diff --git a/src/progInfo.h.in b/src/progInfo.h.in index 1139d39..cde05cb 100644 --- a/src/progInfo.h.in +++ b/src/progInfo.h.in @@ -2,7 +2,16 @@ #define __PROGINFO__ /* - Program - */ +#ifndef PROGRAM_PRE_RELEASE + #define PROGRAM_PRE_RELEASE 1 +#endif + #define PROGRAM_NAME "@PROJECT_NAME@" +#if PROGRAM_PRE_RELEASE + #define PROGRAM_VERSION "@PROJECT_VERSION@pre" +#else + #define PROGRAM_VERSION "@PROJECT_VERSION@" +#endif /* - Length - */ #define LENGTH_BUFFER 255 @@ -20,18 +29,13 @@ #define TYPE_ENUM "enum" #define TYPE_LANG "lang" -/* - Variable - */ -#define VARIABLE_MODE "mode" -#define VARIABLE_PREENUM "preEnum" -#define VARIABLE_PRELANG "preLang" - /* - Argument - */ #define ARGUMENT_VERBOSE "-v" /* - Misc. - */ #define AUTOGEN_TEXT \ "/*\n" \ - " Generated with " PROGRAM_NAME ",\n" \ + " Generated with " PROGRAM_NAME " v" PROGRAM_VERSION ",\n" \ " do not modify this file directly.\n" \ "*/\n" diff --git a/src/variable.c b/src/variable.c index 5914120..469669f 100644 --- a/src/variable.c +++ b/src/variable.c @@ -9,7 +9,7 @@ int variable_add( variables_t *vars, const variable_t *var ) { - VERBOSE_PRINTF("%s - Adding variable to variable list...\n", var->name); + VERBOSE_PRINTF("%s - Adding variable to variable list\n", var->name); strncpy( vars->i[vars->length - 1].name, var->name, @@ -22,7 +22,7 @@ int variable_add( ); VERBOSE_PRINTF("%s - Added variable to variable list\n", var->name); - VERBOSE_PRINTF("%s - Increasing variable list size...\n", var->name); + VERBOSE_PRINTF("%s - Increasing variable list size\n", var->name); vars->length++; VOARRAY_RESIZE(variable_t, (*vars), 1); VERBOSE_PRINTF("%s - Increased variable list size: %zu\n", var->name, vars->length); @@ -31,11 +31,12 @@ int variable_add( variable_t *variable_find( variables_t *variables, - const char *find + const char *find, + VOARRAY_TYPE_SIZE *position ) { VOARRAY_TYPE_SIZE i; - VERBOSE_PRINTF("%s - Searching for variable in variable list...\n", find); + VERBOSE_PRINTF("%s - Searching for variable in variable list\n", find); for (i = 0; i < variables->length; i++) { if (strncmp( @@ -44,6 +45,9 @@ variable_t *variable_find( VARIABLE_LENGTH_STRING ) == 0) { VERBOSE_PRINTF("%s - Found variable in variable list\n", find); + if (position != NULL) { + *position = i; + } return &variables->i[i]; } } @@ -54,7 +58,8 @@ variable_t *variable_find( int variable_getStr( variables_t *variables, - char *str + char *str, + VOARRAY_TYPE_SIZE *position ) { char check = 0; char *value; @@ -111,9 +116,16 @@ int variable_getStr( } } - tmpVarPtr = variable_find(variables, tmpVar.name); + tmpVarPtr = variable_find( + variables, + tmpVar.name, + position + ); if (tmpVarPtr == NULL) { + if (position != NULL) { + *position = variables->length - 1; + } variable_add(variables, &tmpVar); } else { strncpy( diff --git a/src/variable.h b/src/variable.h index 2763746..dfbdc91 100644 --- a/src/variable.h +++ b/src/variable.h @@ -22,14 +22,16 @@ int variable_add( const variable_t *var ); -int variable_getStr( +variable_t *variable_find( variables_t *vars, - char *str + const char *find, + VOARRAY_TYPE_SIZE *position ); -variable_t *variable_find( +int variable_getStr( variables_t *vars, - const char *find + char *str, + VOARRAY_TYPE_SIZE *position ); #endif \ No newline at end of file From 102ba33f551515492bbb5750f797f7ba1cbb938c Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Wed, 1 Apr 2026 04:26:08 +0000 Subject: [PATCH 03/12] The start of rewrite #5. --- example.em | 46 ++++++------ src/errorMake.c | 163 ------------------------------------------ src/errorMake.h | 7 -- src/file.c | 7 -- src/file.h | 5 -- src/item.c | 158 ---------------------------------------- src/item.h | 25 ------- src/main.c | 17 +---- src/mode.c | 32 --------- src/mode.h | 23 ------ src/variable.c | 138 ----------------------------------- src/variable.h | 46 +++++------- src/verbose.c | 4 -- src/verbose.h | 25 ------- vim/syntax/esmake.vim | 25 +++---- 15 files changed, 58 insertions(+), 663 deletions(-) delete mode 100644 src/errorMake.c delete mode 100644 src/errorMake.h delete mode 100644 src/item.c delete mode 100644 src/item.h delete mode 100644 src/mode.c delete mode 100644 src/mode.h delete mode 100644 src/variable.c delete mode 100644 src/verbose.c delete mode 100644 src/verbose.h diff --git a/example.em b/example.em index 52baa98..966553d 100644 --- a/example.em +++ b/example.em @@ -1,23 +1,25 @@ ->ret "exampleRet.h" ->enum "exampleEnum.h" ->lang "exampleLang.h" ->lang2 "exampleLang2.h" -%preEnum "VISION_ERROR_" -%preLang "LANG_ERROR_" -! | Legend | Meaning | -! | ------ | --------------------------- | -! | > | Output Variable | -! | % | Variable | -! | + | Item | -! | - | Item (Switch Default) | -! | | | Item - Lang Output | -! | ! | Comment | -! | \ | Escape | -+EXAMPLE -|lang "lang - Example error" -|lang2 "lang2 - Example error" +obj outputs = { + str ret = "ret.h"; + str enum = "enum.h"; + str lang1 = "lang1.h"; + str lang2 = "lang2.h"; +}; -/* This item is the default in the return switch */ --DEFEXAMPLE -|lang "lang - Default error" -|lang2 "lang2 - Default error" \ No newline at end of file +obj variables = { + str preEnum = "ERROR_"; + str preLang = "LANG_ERROR_"; +}; + +obj items = { + obj EXAMPLE = { + str lang1 = "lang1 - Example"; + str lang2 = "lang2 - Example"; + }; + + // This is the default in the return switch + obj DEFEXAMPLE = { + vo def; + str lang1 = "lang1 - Default Example"; + str lang2 = "lang2 - Default Example"; + }; +}; \ No newline at end of file diff --git a/src/errorMake.c b/src/errorMake.c deleted file mode 100644 index 3e309ac..0000000 --- a/src/errorMake.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include - -#include "file.h" -#include "item.h" -#include "verbose.h" -#include "variable.h" -#include "progInfo.h" - -// static char check = 0; - -static inline size_t getItemCount(FILE *fileInput) { - char buffer[LENGTH_BUFFER] = { 0 }; - size_t ret = 0; - long int prevPos = ftell(fileInput); - - VERBOSE_PRINTF("Getting item count\n"); - - while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { - if ( - buffer[0] == LEGEND_ITEM || - buffer[0] == LEGEND_ITEM_DEFAULT - ) { - ret++; - } - } - - VERBOSE_PRINTF("Got item count: %zu\n", ret); - - fseek(fileInput, prevPos, SEEK_SET); - return ret; -} - -int errorMake_readFile(FILE *fileInput) { - char buffer[LENGTH_BUFFER] = { 0 }; - char itemName[LENGTH_BUFFER] = { 0 }; - unsigned char offset; - size_t bufLen; - size_t itemCount = getItemCount(fileInput); - VOARRAY_TYPE_SIZE i = 0; - files_t files = { NULL, 1 }; - variables_t outVars = { NULL, 1 }; - variables_t vars = { NULL, 1 }; - - if (fileInput == NULL) { - fprintf(stderr, "ERROR: Required argument is NULL\n"); - return 1; - } - - VOARRAY_INIT(FILE *, files, 1); - VOARRAY_INIT(variable_t, vars, 1); - VOARRAY_INIT(variable_t, outVars, 1); - - files.i[0] = NULL; - - while (fgets(buffer, LENGTH_BUFFER, fileInput) != NULL) { - if (item_init( - &files, - &outVars, - &vars - )) { - return 1; - } - - offset = 0; - - if ( - ( - buffer[0] != LEGEND_OUTPUT && - buffer[0] != LEGEND_VARIABLE && - buffer[0] != LEGEND_COMMENT - ) && - !(files.length - 1) - ) { - fprintf(stderr, "ERROR: No output files have been specified\n"); - return 1; - } - - switch (buffer[0]) { - case LEGEND_OUTPUT: - if (variable_getStr( - &outVars, - buffer, - &i - )) { - return 1; - } - - file_open( - &files.i[i], - outVars.i[i].value, - "w" - ); - - if ((files.length - 1) == i) { - VERBOSE_PRINTF("Increasing file list size\n"); - files.length++; - VOARRAY_RESIZE(FILE *, files, 1); - files.i[files.length - 1] = NULL; - - VERBOSE_PRINTF("Increased file list size\n"); - } - break; - case LEGEND_VARIABLE: - if (variable_getStr(&vars, buffer, NULL)) { - return 1; - } - break; - case LEGEND_ITEM: - case LEGEND_ITEM_DEFAULT: - offset = 1; - - if (item_cleanName(buffer + offset)) { - return 1; - } - - strncpy( - itemName, - buffer + offset, - LENGTH_BUFFER - offset - ); - - if (item_add( - itemName, - (buffer[0] == LEGEND_ITEM_DEFAULT), - itemCount - )) { - return 1; - } - break; - case LEGEND_ITEM_OUT: - // printf("%s\n", itemName); - break; - case LEGEND_COMMENT: - break; - case LEGEND_ESCAPE: - offset = 1; - default: - bufLen = strlen(buffer + offset); - for (i = 0; i < files.length - 1; i++) { - fwrite( - buffer + offset, - sizeof(char), - bufLen, - files.i[i] - ); - } - break; - } - } - - for (i = 0; i < files.length - 1; i++) { - if (files.i[i] != NULL) { - fclose(files.i[i]); - } - } - - VOARRAY_UNINIT(outVars); - VOARRAY_UNINIT(vars); - VOARRAY_UNINIT(files); - return 0; -} \ No newline at end of file diff --git a/src/errorMake.h b/src/errorMake.h deleted file mode 100644 index ec4ff13..0000000 --- a/src/errorMake.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __ERRORMAKE__ -#define __ERRORMAKE__ - -/* Functions */ -int errorMake_readFile(FILE *fileInput); - -#endif \ No newline at end of file diff --git a/src/file.c b/src/file.c index 718a9d9..026e9dc 100644 --- a/src/file.c +++ b/src/file.c @@ -1,26 +1,19 @@ #include -#include "verbose.h" - int file_open( FILE **output, const char *filename, const char *mode ) { if (*output != NULL) { - VERBOSE_PRINTF("Output pointer had an already open file, closing\n"); fclose(*output); } *output = fopen(filename, mode); - VERBOSE_PRINTF("%s (%s) - Opening file\n", filename, mode); - if (*output == NULL) { perror("ERROR: Failed to open file"); return 1; } - - VERBOSE_PRINTF("%s (%s) - Opened file\n", filename, mode); return 0; } \ No newline at end of file diff --git a/src/file.h b/src/file.h index d966d85..8af0bd0 100644 --- a/src/file.h +++ b/src/file.h @@ -3,8 +3,6 @@ #include -#include "VoArray/voArray.h" - /* Functions */ int file_open( FILE **output, @@ -12,7 +10,4 @@ int file_open( const char *mode ); -/* VoArrays */ -VOARRAY(files_t, FILE *); - #endif \ No newline at end of file diff --git a/src/item.c b/src/item.c deleted file mode 100644 index 2d05c71..0000000 --- a/src/item.c +++ /dev/null @@ -1,158 +0,0 @@ -#include -#include - -#include "item.h" -#include "verbose.h" -#include "progInfo.h" - -enum types { - TYPES_RET, - TYPES_ENUM, - - TYPES_COUNT -}; - -enum vars { - VARS_PREENUM, - VARS_PRELANG, - - VARS_COUNT -}; - -static const char *typeNames[TYPES_COUNT] = { - "ret", - "enum" -}; -static const char *varNames[VARS_COUNT] = { - "preEnum", - "preLang" -}; - -static FILE **fileList[TYPES_COUNT]; -static char *varVal[VARS_COUNT]; - -void item_preInit() { - unsigned char i; - - for (i = 0; i < TYPES_COUNT; i++) { - fileList[i] = NULL; - } - - for (i = 0; i < VARS_COUNT; i++) { - varVal[i] = NULL; - } - return; -} - -int item_init( - files_t *files, - variables_t *outVars, - variables_t *vars -) { - unsigned char i; - VOARRAY_TYPE_SIZE position = 0; - variable_t *tmpVar; - static char fullInited = 0; - - if (fullInited) { - VERBOSE_PRINTF("Skipping, already initialized\n"); - return 0; - } - - fullInited = 1; - - for (i = 0; i < TYPES_COUNT; i++) { - if (fileList[i] == NULL) { - tmpVar = variable_find( - outVars, - typeNames[i], - &position - ); - - if (tmpVar == NULL) { - fullInited = 0; - } else { - fileList[i] = &files->i[position]; - fprintf(*fileList[i], AUTOGEN_TEXT); - } - } - } - - for (i = 0; i < VARS_COUNT; i++) { - if (varVal[i] == NULL) { - tmpVar = variable_find( - vars, - varNames[i], - NULL - ); - - if (tmpVar == NULL) { - fullInited = 0; - } else { - varVal[i] = tmpVar->value; - } - } - } - return 0; -} - -int item_cleanName(char *str) { - size_t i; - - for (i = 0; str[i]; i++) { - if (isspace(str[i])) { - str[i] = 0; - break; - } - } - - for (i++; str[i]; i++) { - if (!isspace(str[i])) { - fprintf(stderr, "ERROR: Non whitespace character after item name\n"); - return 1; - } - } - return 0; -} - -int item_add( - const char *name, - char def, - size_t count -) { - static size_t i = 0; - - if (def) { - fprintf( - *fileList[TYPES_RET], - "default: return %s%s;\n", - varVal[VARS_PRELANG], - name - ); - } else { - fprintf( - *fileList[TYPES_RET], - "case %s%s: return %s%s;\n", - varVal[VARS_PREENUM], - name, - varVal[VARS_PRELANG], - name - ); - } - - fprintf( - *fileList[TYPES_ENUM], - "%s%s", - varVal[VARS_PREENUM], - name - ); - - if (i < (count - 1)) { - fprintf(*fileList[TYPES_ENUM], ","); - } - - fprintf(*fileList[TYPES_ENUM], "\n"); - - i++; - return 0; -} \ No newline at end of file diff --git a/src/item.h b/src/item.h deleted file mode 100644 index a370ab1..0000000 --- a/src/item.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __ITEM__ -#define __ITEM__ - -#include - -#include "mode.h" -#include "file.h" -#include "variable.h" - -/* Functions */ -void item_preInit(); -int item_init( - files_t *files, - variables_t *outVars, - variables_t *vars -); - -int item_cleanName(char *str); -int item_add( - const char *name, - char def, - size_t count -); - -#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1304b5a..1f8aed1 100644 --- a/src/main.c +++ b/src/main.c @@ -2,11 +2,7 @@ #include #include "file.h" -#include "item.h" #include "progInfo.h" -#include "errorMake.h" - -extern char verbose_enabled; int main( int argc, @@ -19,15 +15,6 @@ int main( return 1; } - item_preInit(); - - if ( - argc > 2 && - strcmp(argv[2], ARGUMENT_VERBOSE) == 0 - ) { - verbose_enabled = 1; - } - if (file_open( &fileInput, argv[1], @@ -36,9 +23,9 @@ int main( return 1; } - if (errorMake_readFile(fileInput)) { + /*if (errorMake_readFile(fileInput)) { return 1; - } + }*/ fclose(fileInput); return 0; diff --git a/src/mode.c b/src/mode.c deleted file mode 100644 index 496d08b..0000000 --- a/src/mode.c +++ /dev/null @@ -1,32 +0,0 @@ -#define MODE_NOEXTERNS -#include -#include - -#include "mode.h" - -const char *mode_names[MODE_COUNT] = { - "enum", - "lang" -}; - -int mode_getStr( - const char *str, - enum modes *mode -) { - char check = 0; - unsigned int i; - - for (i = 0; i < MODE_COUNT; i++) { - if (strcmp(str, mode_names[i]) == 0) { - check = 1; - *mode = (enum modes)i; - break; - } - } - - if (!check) { - fprintf(stderr, "ERROR: Unknown mode: %s\n", str); - return 1; - } - return 0; -} \ No newline at end of file diff --git a/src/mode.h b/src/mode.h deleted file mode 100644 index ee1fa6e..0000000 --- a/src/mode.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __MODE__ -#define __MODE__ - -/* Enums */ -enum modes { - MODE_ENUM, - MODE_LANG, - - MODE_COUNT -}; - -#ifndef MODE_NOEXTERNS -/* Externs */ -extern const char *mode_names[MODE_COUNT]; -#endif - -/* Functions */ -int mode_getStr( - const char *str, - enum modes *mode -); - -#endif \ No newline at end of file diff --git a/src/variable.c b/src/variable.c deleted file mode 100644 index 469669f..0000000 --- a/src/variable.c +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include - -#include "verbose.h" -#include "variable.h" - -int variable_add( - variables_t *vars, - const variable_t *var -) { - VERBOSE_PRINTF("%s - Adding variable to variable list\n", var->name); - strncpy( - vars->i[vars->length - 1].name, - var->name, - VARIABLE_LENGTH_STRING - ); - strncpy( - vars->i[vars->length - 1].value, - var->value, - VARIABLE_LENGTH_STRING - ); - VERBOSE_PRINTF("%s - Added variable to variable list\n", var->name); - - VERBOSE_PRINTF("%s - Increasing variable list size\n", var->name); - vars->length++; - VOARRAY_RESIZE(variable_t, (*vars), 1); - VERBOSE_PRINTF("%s - Increased variable list size: %zu\n", var->name, vars->length); - return 0; -} - -variable_t *variable_find( - variables_t *variables, - const char *find, - VOARRAY_TYPE_SIZE *position -) { - VOARRAY_TYPE_SIZE i; - - VERBOSE_PRINTF("%s - Searching for variable in variable list\n", find); - - for (i = 0; i < variables->length; i++) { - if (strncmp( - variables->i[i].name, - find, - VARIABLE_LENGTH_STRING - ) == 0) { - VERBOSE_PRINTF("%s - Found variable in variable list\n", find); - if (position != NULL) { - *position = i; - } - return &variables->i[i]; - } - } - - VERBOSE_PRINTF("%s - Failed to find variable in variable list\n", find); - return NULL; -} - -int variable_getStr( - variables_t *variables, - char *str, - VOARRAY_TYPE_SIZE *position -) { - char check = 0; - char *value; - unsigned char j; - size_t i; - - variable_t tmpVar; - variable_t *tmpVarPtr; - - for (i = 1; str[i]; i++) { - if (isspace(str[i])) { - str[i] = 0; - strncpy( - tmpVar.name, - str + 1, - VARIABLE_LENGTH_STRING - ); - break; - } - } - - for (j = 0; j < 2; j++) { - check = 0; - - for (i++; str[i]; i++) { - if (str[i] == '"') { - if (j == 0) { - value = str + (i + 1); - } else { - check = 1; - str[i] = 0; - strncpy( - tmpVar.value, - value, - VARIABLE_LENGTH_STRING - ); - } - break; - } else if ( - j == 0 && - !isspace(str[i]) - ) { - fprintf(stderr, "ERROR: Non whitespace character before value string\n"); - return 1; - } - } - - if ( - j != 0 && - !check - ) { - fprintf(stderr, "ERROR: Missing end of value string\n"); - return 1; - } - } - - tmpVarPtr = variable_find( - variables, - tmpVar.name, - position - ); - - if (tmpVarPtr == NULL) { - if (position != NULL) { - *position = variables->length - 1; - } - variable_add(variables, &tmpVar); - } else { - strncpy( - tmpVarPtr->value, - tmpVar.value, - VARIABLE_LENGTH_STRING - ); - } - return 0; -} \ No newline at end of file diff --git a/src/variable.h b/src/variable.h index dfbdc91..d4bd525 100644 --- a/src/variable.h +++ b/src/variable.h @@ -1,37 +1,29 @@ #ifndef __VARIABLE__ #define __VARIABLE__ -#include "VoArray/voArray.h" - /* Macros */ -#define VARIABLE_LENGTH 10 -#define VARIABLE_LENGTH_STRING 100 +#define LENGTH_VARTYPE 10 +#define LENGTH_BUFFER 255 + +/* Enums */ +enum variable_types { + VARTYPE_VO, + VARTYPE_S8, + VARTYPE_U8, + VARTYPE_S16, + VARTYPE_U16, + VARTYPE_S32, + VARTYPE_U32, + VARTYPE_STR, + VARTYPE_OBJ, + VARTYPE_ARR +}; /* Structs */ typedef struct { - char name[VARIABLE_LENGTH_STRING]; - char value[VARIABLE_LENGTH_STRING]; + enum variable_types type; + char name[LENGTH_BUFFER]; + void *value; } variable_t; -/* VoArrays */ -VOARRAY(variables_t, variable_t); - -/* Functions */ -int variable_add( - variables_t *vars, - const variable_t *var -); - -variable_t *variable_find( - variables_t *vars, - const char *find, - VOARRAY_TYPE_SIZE *position -); - -int variable_getStr( - variables_t *vars, - char *str, - VOARRAY_TYPE_SIZE *position -); - #endif \ No newline at end of file diff --git a/src/verbose.c b/src/verbose.c deleted file mode 100644 index c92d6f2..0000000 --- a/src/verbose.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -char verbose_enabled = 0; \ No newline at end of file diff --git a/src/verbose.h b/src/verbose.h deleted file mode 100644 index 90b61cd..0000000 --- a/src/verbose.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __VERBOSE__ -#define __VERBOSE__ - -#include - -/* Macros */ -#ifndef __FILE_NAME__ - #define __FILE_NAME__ __FILE__ -#endif - -#define VERBOSE_PRINTF(...) \ - if (verbose_enabled) { \ - printf( \ - "%s: %i - %s: ", \ - __FILE_NAME__, \ - __LINE__, \ - __func__ \ - ); \ - printf(__VA_ARGS__); \ - } - -/* Functions */ -extern char verbose_enabled; - -#endif \ No newline at end of file diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index 37c95eb..617d68e 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -1,25 +1,26 @@ " Vim syntax file " Language: ESMake " Maintainer: StevenSYS -" Last Change: 23-03-2026 if exists("b:current_syntax") finish endif -runtime! syntax/c.vim +" Region +syn region emString start="\"" end="\"" -syn match emVariable "^[%>]\S\+" -syn match emItem "^[+-]\S\+" -syn match emItemOut "^|\S\+" -syn match emEscape "^\\.\+" -syn region emComment start="^!" skip="\\$" end="$" +" Match +syn match emComment "//.\+" +syn match emNumber " [0-9]\+" + +" Keyword +syn keyword emVarType vo s8 u8 s16 u16 s32 u32 str obj arr + +hi def link emString string -" Settings -hi def link emVariable keyword -hi def link emItem structure -hi def link emItemOut function -hi def link emEscape special hi def link emComment comment +" hi def link emNumber number + +hi def link emVarType structure let b:current_syntax = "esmake" \ No newline at end of file From 6809e01fc823b98cae0d2ad0c99d1c898d9c0de7 Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Wed, 1 Apr 2026 04:26:57 +0000 Subject: [PATCH 04/12] Updated "README.md". --- README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/README.md b/README.md index 69222b0..54843a9 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,3 @@ # [ESMake](https://github.com/StevenSYS/ESMake) -A program that helps with making errors strings and enums the way I do it - -| Legend | Meaning | -| ------ | --------------------------- | -| % | Setting | -| + | Item | -| - | Item (Switch Default) | -| ! | Comment | -| \ | Escape | \ No newline at end of file +A program that helps with making errors strings and enums the way I do it \ No newline at end of file From bbde9cd8e77d8d7c499c06e86f0f36ef95a02dee Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Wed, 1 Apr 2026 17:00:40 +0000 Subject: [PATCH 05/12] Added functions for variables, numbers to the Vim syntax file and some other things. --- src/variable.c | 136 ++++++++++++++++++++++++++++++++++++++++++ src/variable.h | 60 ++++++++++++++++--- testing.em | 2 + vim/syntax/esmake.vim | 6 +- 4 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 src/variable.c create mode 100644 testing.em diff --git a/src/variable.c b/src/variable.c new file mode 100644 index 0000000..827441e --- /dev/null +++ b/src/variable.c @@ -0,0 +1,136 @@ +#include +#include +#include + +#include "variable.h" + +#define STR_ERROR_REQUIRED_ARGS "ERROR: Required argument(s) is/are NULL\n" + +int variable_init( + variable_t *var, + size_t nameSize, + size_t valSize +) { + if (var = NULL) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return 1; + } + + if (nameSize) { + var->name = malloc(nameSize); + } else { + var->name = NULL; + } + + if (valSize) { + var->value.ptr = malloc(valSize); + } else { + var->value.ptr = NULL; + } + return 0; +} + +void variable_uninit(variable_t *var) { + if (var == NULL) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return; + } + + var->used = 0; + var->type = VARTYPE_VO; + + if (var->name != NULL) { + free(var->name); + var->name = NULL; + } + + if (var->value.ptr != NULL) { + free(var->value.ptr); + var->value.ptr = NULL; + } + return; +} + +/* Object */ +void variable_clearObj(varObj_t *object) { + VOARRAY_TYPE_SIZE i; + + for (i = 0; i < object->length; i++) { + object->i[i].used = 0; + object->i[i].type = VARTYPE_VO; + object->i[i].name = NULL; + object->i[i].value.ptr = NULL; + } + return; +} + +variable_t *variable_addObj( + varObj_t *object, + variable_t *var, + VOARRAY_TYPE_SIZE *position +) { + if ( + object == NULL || + var == NULL || + position == NULL + ) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return NULL; + } + + for (*position = 0; *position < object->length; *position++) { + if (!object->i[*position].used) { + break; + } + } + + object->i[*position].used = 1; + object->i[*position].type = var->type; + object->i[*position].name = var->name; + object->i[*position].value.ptr = var->value.ptr; + + object->length++; + VOARRAY_RESIZE(variable_t, (*object), NULL); + return &object->i[*position]; +} + +variable_t *variable_findObj( + varObj_t *object, + const char *name, + VOARRAY_TYPE_SIZE *position +) { + if ( + object == NULL || + name == NULL || + position == NULL + ) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return NULL; + } + + if (*position > (object->length - 1)) { + *position = 0; + } + + for (; *position < (object->length - 1); *position++) { + if (strcmp(object->i[*position].name, name) == 0) { + return &object->i[*position]; + } + } + return NULL; +} + +int variable_uninitObj(varObj_t *object) { + VOARRAY_TYPE_SIZE i; + + for (i = 0; i < (object->length - 1); i++) { + if (object->i[i].type == VARTYPE_OBJ) { + if (variable_uninitObj(object->i[i].value.obj)) { + return 1; + } + } + variable_uninit(&object->i[i]); + } + VOARRAY_UNINIT((*object)); + return 0; +} \ No newline at end of file diff --git a/src/variable.h b/src/variable.h index d4bd525..5e44b50 100644 --- a/src/variable.h +++ b/src/variable.h @@ -1,9 +1,9 @@ #ifndef __VARIABLE__ #define __VARIABLE__ -/* Macros */ -#define LENGTH_VARTYPE 10 -#define LENGTH_BUFFER 255 +#include + +#include "VoArray/voArray.h" /* Enums */ enum variable_types { @@ -14,16 +14,62 @@ enum variable_types { VARTYPE_U16, VARTYPE_S32, VARTYPE_U32, + VARTYPE_FLT, + VARTYPE_DOU, VARTYPE_STR, VARTYPE_OBJ, - VARTYPE_ARR + + VARTYPE_COUNT }; +/* VoArrays */ +VOARRAY(varObj_t, struct variable_s); + /* Structs */ -typedef struct { +typedef struct variable_s { + char used; enum variable_types type; - char name[LENGTH_BUFFER]; - void *value; + char *name; + union { + int8_t *s8; + uint8_t *u8; + int16_t *s16; + uint16_t *u16; + int32_t *s32; + uint32_t *u32; + float *flt; + double *dou; + char *str; + varObj_t *obj; + + void *ptr; + } value; } variable_t; +/* Functions */ +int variable_init( + variable_t *var, + size_t nameSize, + size_t valSize +); + +void variable_uninit(variable_t *var); + +/* Object */ +void variable_clearObj(varObj_t *object); + +variable_t *variable_addObj( + varObj_t *object, + variable_t *var, + VOARRAY_TYPE_SIZE *position +); + +variable_t *variable_findObj( + varObj_t *object, + const char *name, + VOARRAY_TYPE_SIZE *position +); + +int variable_uninitObj(varObj_t *object); + #endif \ No newline at end of file diff --git a/testing.em b/testing.em new file mode 100644 index 0000000..4735a9c --- /dev/null +++ b/testing.em @@ -0,0 +1,2 @@ +u8 testU8 = 10; +str testString = "Testing"; \ No newline at end of file diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index 617d68e..4834e7d 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -11,15 +11,15 @@ syn region emString start="\"" end="\"" " Match syn match emComment "//.\+" -syn match emNumber " [0-9]\+" +syn match emNumber "\<\d\+\(_\d\+\)*\>" " Keyword -syn keyword emVarType vo s8 u8 s16 u16 s32 u32 str obj arr +syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj hi def link emString string hi def link emComment comment -" hi def link emNumber number +hi def link emNumber number hi def link emVarType structure From c8138d6a3c97e78702267ad8fa9d40bd751f5e2c Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Thu, 2 Apr 2026 05:36:29 +0000 Subject: [PATCH 06/12] Reading a variable's type and name from a file is now possible. --- example.em | 30 +++++----- src/main.c | 21 +++++-- src/variable.c | 151 +++++++++++++++++++++++++++++++++++++++++++------ src/variable.h | 15 ++++- testing.em | 4 +- 5 files changed, 181 insertions(+), 40 deletions(-) diff --git a/example.em b/example.em index 966553d..ddda880 100644 --- a/example.em +++ b/example.em @@ -1,25 +1,25 @@ -obj outputs = { - str ret = "ret.h"; - str enum = "enum.h"; - str lang1 = "lang1.h"; - str lang2 = "lang2.h"; +obj outputs { + str ret "ret.h"; + str enum "enum.h"; + str lang1 "lang1.h"; + str lang2 "lang2.h"; }; -obj variables = { - str preEnum = "ERROR_"; - str preLang = "LANG_ERROR_"; +obj variables { + str preEnum "ERROR_"; + str preLang "LANG_ERROR_"; }; -obj items = { - obj EXAMPLE = { - str lang1 = "lang1 - Example"; - str lang2 = "lang2 - Example"; +obj items { + obj EXAMPLE { + str lang1 "lang1 - Example"; + str lang2 "lang2 - Example"; }; // This is the default in the return switch - obj DEFEXAMPLE = { + obj DEFEXAMPLE { vo def; - str lang1 = "lang1 - Default Example"; - str lang2 = "lang2 - Default Example"; + str lang1 "lang1 - Default Example"; + str lang2 "lang2 - Default Example"; }; }; \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1f8aed1..62d9df2 100644 --- a/src/main.c +++ b/src/main.c @@ -2,13 +2,15 @@ #include #include "file.h" +#include "variable.h" #include "progInfo.h" int main( int argc, char *argv[] ) { - FILE *fileInput; + FILE *file; + variable_t var; if (argc < 2) { fprintf(stderr, "ERROR: File wasn't specified\n"); @@ -16,17 +18,28 @@ int main( } if (file_open( - &fileInput, + &file, argv[1], "r" )) { return 1; } - /*if (errorMake_readFile(fileInput)) { + if (variable_getFile(file, &var)) { + return 1; + } + + printf( + "Type: \"%s\"\n" + "Name: \"%s\"\n", + variable_typeNames[var.type], + var.name + ); + + /*if (errorMake_readFile(file)) { return 1; }*/ - fclose(fileInput); + fclose(file); return 0; } \ No newline at end of file diff --git a/src/variable.c b/src/variable.c index 827441e..1c06489 100644 --- a/src/variable.c +++ b/src/variable.c @@ -1,17 +1,53 @@ +#define VARIABLE_NOEXTERNS #include +#include #include #include #include "variable.h" +#include "progInfo.h" #define STR_ERROR_REQUIRED_ARGS "ERROR: Required argument(s) is/are NULL\n" +#define STR_ERROR_FILE_READ "ERROR: Failed to read from file\n" +#define STR_ERROR_VAR_TYPE_UNKNOWN "ERROR: Unknown variable type: %s\n" +#define STR_ERROR_VAR_NAME "ERROR: Failed to get variable name\n" + +#define SKIP_SPACE() \ + byte[0] = 0; \ + do { \ + if (!fread(byte, sizeof(char), 1, file)) { \ + fprintf(stderr, STR_ERROR_FILE_READ); \ + return 1; \ + } \ + \ + if (!isspace(byte[0])) { \ + fseek(file, position, SEEK_SET); \ + break; \ + } \ + } while (!isspace(byte[0])); \ + byte[0] = 0; + + +const char *variable_typeNames[VARTYPE_COUNT] = { + "vo", + "s8", + "u8", + "s16", + "u16", + "s32", + "u32", + "flt", + "dou", + "str", + "obj" +}; int variable_init( variable_t *var, size_t nameSize, size_t valSize ) { - if (var = NULL) { + if (var == NULL) { fprintf(stderr, STR_ERROR_REQUIRED_ARGS); return 1; } @@ -67,54 +103,54 @@ void variable_clearObj(varObj_t *object) { variable_t *variable_addObj( varObj_t *object, variable_t *var, - VOARRAY_TYPE_SIZE *position + VOARRAY_TYPE_SIZE *i ) { if ( object == NULL || var == NULL || - position == NULL + i == NULL ) { fprintf(stderr, STR_ERROR_REQUIRED_ARGS); return NULL; } - for (*position = 0; *position < object->length; *position++) { - if (!object->i[*position].used) { + for (*i = 0; *i < object->length; *i++) { + if (!object->i[*i].used) { break; } } - object->i[*position].used = 1; - object->i[*position].type = var->type; - object->i[*position].name = var->name; - object->i[*position].value.ptr = var->value.ptr; + object->i[*i].used = 1; + object->i[*i].type = var->type; + object->i[*i].name = var->name; + object->i[*i].value.ptr = var->value.ptr; object->length++; VOARRAY_RESIZE(variable_t, (*object), NULL); - return &object->i[*position]; + return &object->i[*i]; } variable_t *variable_findObj( varObj_t *object, const char *name, - VOARRAY_TYPE_SIZE *position + VOARRAY_TYPE_SIZE *i ) { if ( object == NULL || name == NULL || - position == NULL + i == NULL ) { fprintf(stderr, STR_ERROR_REQUIRED_ARGS); return NULL; } - if (*position > (object->length - 1)) { - *position = 0; + if (*i > (object->length - 1)) { + *i = 0; } - for (; *position < (object->length - 1); *position++) { - if (strcmp(object->i[*position].name, name) == 0) { - return &object->i[*position]; + for (; *i < (object->length - 1); *i++) { + if (strcmp(object->i[*i].name, name) == 0) { + return &object->i[*i]; } } return NULL; @@ -133,4 +169,85 @@ int variable_uninitObj(varObj_t *object) { } VOARRAY_UNINIT((*object)); return 0; +} + +/* From File */ +int variable_getFile( + FILE *file, + variable_t *var +) { + char check = 0; + char byte[2] = { 0, 0 }; + char buffer[LENGTH_BUFFER] = { 0 }; + size_t position; + VOARRAY_TYPE_SIZE i = 0; + + position = ftell(file); + + SKIP_SPACE(); + + do { + if (byte[0]) { + buffer[i] = byte[0]; + i++; + } + + if (!fread(byte, sizeof(char), 1, file)) { + fprintf(stderr, STR_ERROR_FILE_READ); + return 1; + } + } while (!isspace(byte[0])); + + for (i = 0; i < VARTYPE_COUNT; i++) { + if (strcmp(buffer, variable_typeNames[i]) == 0) { + check = 1; + var->type = (enum variable_types)i; + break; + } + } + + if (!check) { + fprintf(stderr, STR_ERROR_VAR_TYPE_UNKNOWN, buffer); + return 1; + } + + position = ftell(file); + + check = 0; + + name: + i = 0; + + fseek(file, position, SEEK_SET); + + SKIP_SPACE(); + + do { + if (byte[0]) { + if (check) { + var->name[i] = byte[0]; + } + i++; + } + + if (!fread(byte, sizeof(char), 1, file)) { + fprintf(stderr, STR_ERROR_FILE_READ); + return 1; + } + } while (!isspace(byte[0])); + + if (!i) { + fprintf(stderr, STR_ERROR_VAR_NAME); + return 1; + } + + if (!check) { + var->name = malloc( + sizeof(char[i]) + ); + + check = 1; + goto name; + } + return 0; } \ No newline at end of file diff --git a/src/variable.h b/src/variable.h index 5e44b50..e063e1f 100644 --- a/src/variable.h +++ b/src/variable.h @@ -61,15 +61,26 @@ void variable_clearObj(varObj_t *object); variable_t *variable_addObj( varObj_t *object, variable_t *var, - VOARRAY_TYPE_SIZE *position + VOARRAY_TYPE_SIZE *i ); variable_t *variable_findObj( varObj_t *object, const char *name, - VOARRAY_TYPE_SIZE *position + VOARRAY_TYPE_SIZE *i ); int variable_uninitObj(varObj_t *object); +/* From File */ +int variable_getFile( + FILE *file, + variable_t *var +); + +#ifndef VARIABLE_NOEXTERNS +/* Externs */ +extern const char *variable_typeNames[VARTYPE_COUNT]; +#endif + #endif \ No newline at end of file diff --git a/testing.em b/testing.em index 4735a9c..5e50a04 100644 --- a/testing.em +++ b/testing.em @@ -1,2 +1,2 @@ -u8 testU8 = 10; -str testString = "Testing"; \ No newline at end of file +u8 testU8 10; +str testString "Testing"; \ No newline at end of file From 51b1f32f78396c5c425fdf00cae95c9e17d7f475 Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Thu, 2 Apr 2026 05:39:19 +0000 Subject: [PATCH 07/12] Added "au" to the Vim syntax file and improved code safety by changing "strcmp" to "strncmp". "au" is short for "auto". --- src/variable.c | 6 +++++- vim/syntax/esmake.vim | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/variable.c b/src/variable.c index 1c06489..46abe85 100644 --- a/src/variable.c +++ b/src/variable.c @@ -199,7 +199,11 @@ int variable_getFile( } while (!isspace(byte[0])); for (i = 0; i < VARTYPE_COUNT; i++) { - if (strcmp(buffer, variable_typeNames[i]) == 0) { + if (strncmp( + buffer, + variable_typeNames[i], + LENGTH_BUFFER + ) == 0) { check = 1; var->type = (enum variable_types)i; break; diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index 4834e7d..a2ecbbd 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -14,7 +14,7 @@ syn match emComment "//.\+" syn match emNumber "\<\d\+\(_\d\+\)*\>" " Keyword -syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj +syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj au hi def link emString string From b8e7d56a3caf05717876ebd0a5314d261c9af8e6 Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:46:13 +0000 Subject: [PATCH 08/12] Improved the `variable_getFile` function. --- src/variable.c | 16 ++++++++-------- src/variable.h | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/variable.c b/src/variable.c index 46abe85..1450479 100644 --- a/src/variable.c +++ b/src/variable.c @@ -19,15 +19,13 @@ fprintf(stderr, STR_ERROR_FILE_READ); \ return 1; \ } \ - \ - if (!isspace(byte[0])) { \ - fseek(file, position, SEEK_SET); \ - break; \ - } \ - } while (!isspace(byte[0])); \ + } while ( \ + !byte[0] || \ + isspace(byte[0]) \ + ); \ + fseek(file, -1, SEEK_CUR); \ byte[0] = 0; - const char *variable_typeNames[VARTYPE_COUNT] = { "vo", "s8", @@ -39,7 +37,9 @@ const char *variable_typeNames[VARTYPE_COUNT] = { "flt", "dou", "str", - "obj" + "obj", + + "au" }; int variable_init( diff --git a/src/variable.h b/src/variable.h index e063e1f..233b40a 100644 --- a/src/variable.h +++ b/src/variable.h @@ -19,6 +19,8 @@ enum variable_types { VARTYPE_STR, VARTYPE_OBJ, + VARTYPE_AU, + VARTYPE_COUNT }; From d046dabe05151f368794da2e1b9a8a754809be7d Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:41:39 +0000 Subject: [PATCH 09/12] The program now uninitializes the variable it creates. --- src/main.c | 2 ++ src/variable.c | 69 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/main.c b/src/main.c index 62d9df2..95c0427 100644 --- a/src/main.c +++ b/src/main.c @@ -40,6 +40,8 @@ int main( return 1; }*/ + variable_uninit(&var); + fclose(file); return 0; } \ No newline at end of file diff --git a/src/variable.c b/src/variable.c index 1450479..e0570f6 100644 --- a/src/variable.c +++ b/src/variable.c @@ -91,6 +91,11 @@ void variable_uninit(variable_t *var) { void variable_clearObj(varObj_t *object) { VOARRAY_TYPE_SIZE i; + if (object == NULL) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return; + } + for (i = 0; i < object->length; i++) { object->i[i].used = 0; object->i[i].type = VARTYPE_VO; @@ -103,56 +108,76 @@ void variable_clearObj(varObj_t *object) { variable_t *variable_addObj( varObj_t *object, variable_t *var, - VOARRAY_TYPE_SIZE *i + VOARRAY_TYPE_SIZE *position ) { + VOARRAY_TYPE_SIZE i = 0; + if ( object == NULL || - var == NULL || - i == NULL + var == NULL ) { fprintf(stderr, STR_ERROR_REQUIRED_ARGS); return NULL; } - for (*i = 0; *i < object->length; *i++) { - if (!object->i[*i].used) { + if ( + position != NULL && + *position < object->length + ) { + i = *position; + } + + for (; i < object->length; i++) { + if (!object->i[i].used) { break; } } - object->i[*i].used = 1; - object->i[*i].type = var->type; - object->i[*i].name = var->name; - object->i[*i].value.ptr = var->value.ptr; + object->i[i].used = 1; + object->i[i].type = var->type; + object->i[i].name = var->name; + object->i[i].value.ptr = var->value.ptr; object->length++; VOARRAY_RESIZE(variable_t, (*object), NULL); - return &object->i[*i]; + + if (position != NULL) { + *position = i; + } + return &object->i[i]; } variable_t *variable_findObj( varObj_t *object, const char *name, - VOARRAY_TYPE_SIZE *i + VOARRAY_TYPE_SIZE *position ) { + VOARRAY_TYPE_SIZE i = 0; + if ( object == NULL || - name == NULL || - i == NULL + name == NULL ) { fprintf(stderr, STR_ERROR_REQUIRED_ARGS); return NULL; } - if (*i > (object->length - 1)) { - *i = 0; + if ( + position != NULL && + *position < object->length + ) { + i = *position; } - for (; *i < (object->length - 1); *i++) { - if (strcmp(object->i[*i].name, name) == 0) { - return &object->i[*i]; + for (; i < (object->length - 1); i++) { + if (strcmp(object->i[i].name, name) == 0) { + return &object->i[i]; } } + + if (position != NULL) { + *position = i; + } return NULL; } @@ -182,6 +207,14 @@ int variable_getFile( size_t position; VOARRAY_TYPE_SIZE i = 0; + if ( + file == NULL || + var == NULL + ) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return 1; + } + position = ftell(file); SKIP_SPACE(); From 2d52a535cebf6128c53d17ca8c024fdc04abb7db Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:43:28 +0000 Subject: [PATCH 10/12] Changed the argument names in "variable.h" to match their names in "variable.c". --- src/variable.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/variable.h b/src/variable.h index 233b40a..6da1441 100644 --- a/src/variable.h +++ b/src/variable.h @@ -63,13 +63,13 @@ void variable_clearObj(varObj_t *object); variable_t *variable_addObj( varObj_t *object, variable_t *var, - VOARRAY_TYPE_SIZE *i + VOARRAY_TYPE_SIZE *position ); variable_t *variable_findObj( varObj_t *object, const char *name, - VOARRAY_TYPE_SIZE *i + VOARRAY_TYPE_SIZE *position ); int variable_uninitObj(varObj_t *object); From ac35ec42a6e78e48994ff20a155ee6ad83b3640b Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Fri, 3 Apr 2026 03:35:54 +0000 Subject: [PATCH 11/12] Added a check for the variable flags. --- src/errorString.h | 8 +++ src/main.c | 4 -- src/progInfo.h.in | 16 ------ src/varFlag.c | 38 +++++++++++++++ src/varFlag.h | 29 +++++++++++ src/variable.c | 111 +++++++++++++++++++++++++++--------------- src/variable.h | 33 ++++++++----- testing.em | 7 ++- vim/syntax/esmake.vim | 4 +- 9 files changed, 177 insertions(+), 73 deletions(-) create mode 100644 src/errorString.h create mode 100644 src/varFlag.c create mode 100644 src/varFlag.h diff --git a/src/errorString.h b/src/errorString.h new file mode 100644 index 0000000..955477a --- /dev/null +++ b/src/errorString.h @@ -0,0 +1,8 @@ +#ifndef __ERRORSTRING__ +#define __ERRORSTRING__ + #define STR_ERROR_REQUIRED_ARGS "ERROR: Required argument(s) is/are NULL\n" + #define STR_ERROR_FILE_READ "ERROR: Failed to read from file\n" + #define STR_ERROR_VAR_TYPE_UNKNOWN "ERROR: Unknown variable type: %s\n" + #define STR_ERROR_VAR_NAME "ERROR: Failed to get variable name\n" + #define STR_ERROR_VAR_EXISTS_OBJ "ERROR: Variable already exists in object\n" +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 95c0427..12da9d0 100644 --- a/src/main.c +++ b/src/main.c @@ -36,10 +36,6 @@ int main( var.name ); - /*if (errorMake_readFile(file)) { - return 1; - }*/ - variable_uninit(&var); fclose(file); diff --git a/src/progInfo.h.in b/src/progInfo.h.in index cde05cb..ceffcf1 100644 --- a/src/progInfo.h.in +++ b/src/progInfo.h.in @@ -16,22 +16,6 @@ /* - Length - */ #define LENGTH_BUFFER 255 -/* - Legend - */ -#define LEGEND_OUTPUT '>' -#define LEGEND_VARIABLE '%' -#define LEGEND_ITEM '+' -#define LEGEND_ITEM_DEFAULT '-' -#define LEGEND_ITEM_OUT '|' -#define LEGEND_COMMENT '!' -#define LEGEND_ESCAPE '\\' - -/* - Type - */ -#define TYPE_ENUM "enum" -#define TYPE_LANG "lang" - -/* - Argument - */ -#define ARGUMENT_VERBOSE "-v" - /* - Misc. - */ #define AUTOGEN_TEXT \ "/*\n" \ diff --git a/src/varFlag.c b/src/varFlag.c new file mode 100644 index 0000000..ec7077c --- /dev/null +++ b/src/varFlag.c @@ -0,0 +1,38 @@ +#include +#include + +#include "varFlag.h" +#include "errorString.h" + +const char *varFlag_names[VARFLAG_COUNT] = { + "nn", // No Name + "ad" // Allow Duplicate +}; + +enum varFlags varFlag_check( + const char *str, + size_t maxLen +) { + size_t i; + size_t len = 0; + size_t nameLen = 0; + + if (str == NULL) { + fprintf(stderr, STR_ERROR_REQUIRED_ARGS); + return 1; + } + + for (i = 0; i < VARFLAG_COUNT; i++) { + len = strnlen(str, maxLen); + nameLen = strlen(varFlag_names[i]); + + if (len != nameLen) { + break; + } + + if (strncmp(str, varFlag_names[i], len) == 0) { + return (enum varFlags)i; + } + } + return VARFLAG_NONE; +} \ No newline at end of file diff --git a/src/varFlag.h b/src/varFlag.h new file mode 100644 index 0000000..58c7ea4 --- /dev/null +++ b/src/varFlag.h @@ -0,0 +1,29 @@ +#ifndef __VARFLAG__ +#define __VARFLAG__ + +/* MACROS */ +#define VARFLAG_BM(_val) (1 << _val) + +/* Enums */ +enum varFlags { + VARFLAG_NN, + VARFLAG_AD, + + VARFLAG_COUNT, + + /* Specials */ + VARFLAG_NONE +}; + +/* Functions */ +enum varFlags varFlag_check( + const char *str, + size_t maxLen +); + +#ifndef VARFLAG_NOEXTERNS +/* Externs */ +extern const char *varFlag_names[VARFLAG_COUNT]; +#endif + +#endif \ No newline at end of file diff --git a/src/variable.c b/src/variable.c index e0570f6..5ab356b 100644 --- a/src/variable.c +++ b/src/variable.c @@ -4,13 +4,10 @@ #include #include +#include "varFlag.h" #include "variable.h" #include "progInfo.h" - -#define STR_ERROR_REQUIRED_ARGS "ERROR: Required argument(s) is/are NULL\n" -#define STR_ERROR_FILE_READ "ERROR: Failed to read from file\n" -#define STR_ERROR_VAR_TYPE_UNKNOWN "ERROR: Unknown variable type: %s\n" -#define STR_ERROR_VAR_NAME "ERROR: Failed to get variable name\n" +#include "errorString.h" #define SKIP_SPACE() \ byte[0] = 0; \ @@ -37,9 +34,7 @@ const char *variable_typeNames[VARTYPE_COUNT] = { "flt", "dou", "str", - "obj", - - "au" + "obj" }; int variable_init( @@ -52,6 +47,8 @@ int variable_init( return 1; } + var->used = 1; + if (nameSize) { var->name = malloc(nameSize); } else { @@ -73,7 +70,7 @@ void variable_uninit(variable_t *var) { } var->used = 0; - var->type = VARTYPE_VO; + var->type = VARTYPE_UNSET; if (var->name != NULL) { free(var->name); @@ -133,6 +130,18 @@ variable_t *variable_addObj( } } + if ( + !(var->flags & VARFLAG_BM(VARFLAG_AD)) && + variable_findObj( + object, + var->name, + NULL + ) != NULL + ) { + fprintf(stderr, STR_ERROR_VAR_EXISTS_OBJ); + return NULL; + } + object->i[i].used = 1; object->i[i].type = var->type; object->i[i].name = var->name; @@ -204,8 +213,9 @@ int variable_getFile( char check = 0; char byte[2] = { 0, 0 }; char buffer[LENGTH_BUFFER] = { 0 }; + enum varFlags flag = VARFLAG_NONE; size_t position; - VOARRAY_TYPE_SIZE i = 0; + VOARRAY_TYPE_SIZE i; if ( file == NULL || @@ -215,6 +225,12 @@ int variable_getFile( return 1; } + var->flags = 0; + var->name = NULL; + var->value.ptr = NULL; + + type: + i = 0; position = ftell(file); SKIP_SPACE(); @@ -231,6 +247,18 @@ int variable_getFile( } } while (!isspace(byte[0])); + flag = varFlag_check( + buffer, + LENGTH_BUFFER + ); + + if (flag != VARFLAG_NONE) { + if (!(var->flags & VARFLAG_BM(flag))) { + var->flags += VARFLAG_BM(flag); + } + goto type; + } + for (i = 0; i < VARTYPE_COUNT; i++) { if (strncmp( buffer, @@ -252,39 +280,46 @@ int variable_getFile( check = 0; - name: - i = 0; - - fseek(file, position, SEEK_SET); - - SKIP_SPACE(); - - do { - if (byte[0]) { - if (check) { - var->name[i] = byte[0]; + if (!(var->flags & VARFLAG_BM(VARFLAG_NN))) { + name: + i = 0; + + fseek(file, position, SEEK_SET); + + SKIP_SPACE(); + + do { + if ( + byte[0] && + byte[0] != VARIABLE_CHAR_END + ) { + if (check) { + var->name[i] = byte[0]; + } + i++; } - i++; - } + + if (!fread(byte, sizeof(char), 1, file)) { + fprintf(stderr, STR_ERROR_FILE_READ); + return 1; + } + } while (!isspace(byte[0])); - if (!fread(byte, sizeof(char), 1, file)) { - fprintf(stderr, STR_ERROR_FILE_READ); + if (!i) { + fprintf(stderr, STR_ERROR_VAR_NAME); return 1; } - } while (!isspace(byte[0])); - - if (!i) { - fprintf(stderr, STR_ERROR_VAR_NAME); - return 1; - } - - if (!check) { - var->name = malloc( - sizeof(char[i]) - ); - check = 1; - goto name; + if (!check) { + variable_init( + var, + sizeof(char[i]), + 0 + ); + + check = 1; + goto name; + } } return 0; } \ No newline at end of file diff --git a/src/variable.h b/src/variable.h index 6da1441..2b841de 100644 --- a/src/variable.h +++ b/src/variable.h @@ -5,23 +5,29 @@ #include "VoArray/voArray.h" +/* Macros */ + +/* - Char - */ +#define VARIABLE_CHAR_END ';' + /* Enums */ enum variable_types { - VARTYPE_VO, - VARTYPE_S8, - VARTYPE_U8, - VARTYPE_S16, - VARTYPE_U16, - VARTYPE_S32, - VARTYPE_U32, - VARTYPE_FLT, - VARTYPE_DOU, - VARTYPE_STR, - VARTYPE_OBJ, + VARTYPE_VO, // void + VARTYPE_S8, // int8_t + VARTYPE_U8, // uint8_t + VARTYPE_S16, // int16_t + VARTYPE_U16, // uint16_t + VARTYPE_S32, // int32_t + VARTYPE_U32, // uint32_t + VARTYPE_FLT, // float + VARTYPE_DOU, // double + VARTYPE_STR, // char * + VARTYPE_OBJ, // varObj_t - VARTYPE_AU, + VARTYPE_COUNT, - VARTYPE_COUNT + /* Specials */ + VARTYPE_UNSET }; /* VoArrays */ @@ -30,6 +36,7 @@ VOARRAY(varObj_t, struct variable_s); /* Structs */ typedef struct variable_s { char used; + unsigned char flags; enum variable_types type; char *name; union { diff --git a/testing.em b/testing.em index 5e50a04..57b4217 100644 --- a/testing.em +++ b/testing.em @@ -1,2 +1,7 @@ u8 testU8 10; -str testString "Testing"; \ No newline at end of file +str testString "Testing"; +obj testArray { + nn u8 5; + nn u8 10; + nn str "510"; +}; \ No newline at end of file diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index a2ecbbd..85cccce 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -14,7 +14,8 @@ syn match emComment "//.\+" syn match emNumber "\<\d\+\(_\d\+\)*\>" " Keyword -syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj au +syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj +syn keyword emVarModifier nn ad hi def link emString string @@ -22,5 +23,6 @@ hi def link emComment comment hi def link emNumber number hi def link emVarType structure +hi def link emVarModifier keyword let b:current_syntax = "esmake" \ No newline at end of file From 5d3ce163c838eee3413e29b618d7f06f17673d71 Mon Sep 17 00:00:00 2001 From: StevenSYS <139715581+StevenSYS@users.noreply.github.com> Date: Fri, 3 Apr 2026 04:24:56 +0000 Subject: [PATCH 12/12] Added value reading and made the code messier. I'm thinking of making it read per line again instead of per character. --- example.em | 1 - src/main.c | 31 +++++--- src/varFlag.c | 1 + src/variable.c | 173 +++++++++++++++++++++++++++++++++--------- src/variable.h | 16 +--- testing.em | 7 +- vim/syntax/esmake.vim | 10 +-- 7 files changed, 173 insertions(+), 66 deletions(-) diff --git a/example.em b/example.em index ddda880..5c664f4 100644 --- a/example.em +++ b/example.em @@ -16,7 +16,6 @@ obj items { str lang2 "lang2 - Example"; }; - // This is the default in the return switch obj DEFEXAMPLE { vo def; str lang1 "lang1 - Default Example"; diff --git a/src/main.c b/src/main.c index 12da9d0..60cadaf 100644 --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,7 @@ int main( int argc, char *argv[] ) { + int result = 0; FILE *file; variable_t var; @@ -25,18 +26,30 @@ int main( return 1; } - if (variable_getFile(file, &var)) { + getVar: + result = variable_getFile(file, &var); + + if (result > 0) { return 1; } - printf( - "Type: \"%s\"\n" - "Name: \"%s\"\n", - variable_typeNames[var.type], - var.name - ); - - variable_uninit(&var); + if (result == 0) { + printf( + "Type: \"%s\"\n" + "Name: \"%s\"\n", + variable_typeNames[var.type], + var.name + ); + + if (var.type == VARTYPE_STR) { + printf("Value: %s\n", var.value.str); + } else { + printf("Value: %d\n", *var.value.num); + } + + variable_uninit(&var); + goto getVar; + } fclose(file); return 0; diff --git a/src/varFlag.c b/src/varFlag.c index ec7077c..11ca1df 100644 --- a/src/varFlag.c +++ b/src/varFlag.c @@ -1,3 +1,4 @@ +#define VARFLAG_NOEXTERNS #include #include diff --git a/src/variable.c b/src/variable.c index 5ab356b..18fea3c 100644 --- a/src/variable.c +++ b/src/variable.c @@ -9,28 +9,32 @@ #include "progInfo.h" #include "errorString.h" -#define SKIP_SPACE() \ - byte[0] = 0; \ +#define FREADEC(_ptr, _size, _count, _file) \ + if (!fread(_ptr, _size, _count, _file)) { \ + fprintf(stderr, STR_ERROR_FILE_READ); \ + return 1; \ + } + +#define SKIPSPACE() \ + byte = 0; \ do { \ - if (!fread(byte, sizeof(char), 1, file)) { \ - fprintf(stderr, STR_ERROR_FILE_READ); \ - return 1; \ + byte = getc(file); \ + if ( \ + byte == EOF || \ + byte == VARIABLE_CHAR_STOP \ + ) { \ + return -1; \ } \ } while ( \ - !byte[0] || \ - isspace(byte[0]) \ + !byte || \ + isspace(byte) \ ); \ fseek(file, -1, SEEK_CUR); \ - byte[0] = 0; + byte = 0; const char *variable_typeNames[VARTYPE_COUNT] = { "vo", - "s8", - "u8", - "s16", - "u16", - "s32", - "u32", + "num", "flt", "dou", "str", @@ -51,14 +55,10 @@ int variable_init( if (nameSize) { var->name = malloc(nameSize); - } else { - var->name = NULL; } if (valSize) { var->value.ptr = malloc(valSize); - } else { - var->value.ptr = NULL; } return 0; } @@ -210,8 +210,8 @@ int variable_getFile( FILE *file, variable_t *var ) { + char byte = 0; char check = 0; - char byte[2] = { 0, 0 }; char buffer[LENGTH_BUFFER] = { 0 }; enum varFlags flag = VARFLAG_NONE; size_t position; @@ -233,19 +233,19 @@ int variable_getFile( i = 0; position = ftell(file); - SKIP_SPACE(); + SKIPSPACE(); do { - if (byte[0]) { - buffer[i] = byte[0]; + if (byte) { + buffer[i] = byte; i++; } - if (!fread(byte, sizeof(char), 1, file)) { - fprintf(stderr, STR_ERROR_FILE_READ); - return 1; - } - } while (!isspace(byte[0])); + byte = getc(file); + } while ( + byte && + !isspace(byte) + ); flag = varFlag_check( buffer, @@ -286,24 +286,24 @@ int variable_getFile( fseek(file, position, SEEK_SET); - SKIP_SPACE(); + SKIPSPACE(); do { if ( - byte[0] && - byte[0] != VARIABLE_CHAR_END + byte && + byte != VARIABLE_CHAR_END ) { if (check) { - var->name[i] = byte[0]; + var->name[i] = byte; } i++; } - if (!fread(byte, sizeof(char), 1, file)) { - fprintf(stderr, STR_ERROR_FILE_READ); - return 1; - } - } while (!isspace(byte[0])); + byte = getc(file); + } while ( + byte && + !isspace(byte) + ); if (!i) { fprintf(stderr, STR_ERROR_VAR_NAME); @@ -321,5 +321,106 @@ int variable_getFile( goto name; } } + + position = ftell(file); + + i = 0; + check = 0; + byte = 0; + buffer[0] = 0; + + switch (var->type) { + case VARTYPE_NUM: + variable_init( + var, + 0, + sizeof(uint8_t) + ); + + do { + if (byte) { + buffer[i] = byte; + i++; + } + + byte = getc(file); + } while ( + byte && + byte != VARIABLE_CHAR_END && + !isspace(byte) + ); + + if (byte != VARIABLE_CHAR_END) { + fprintf(stderr, "§ERROR: Missing line end\n"); + return 1; + } + + *var->value.num = (int32_t)atoi(buffer); + break; + case VARTYPE_STR: + do { + byte = getc(file); + } while ( + byte && + byte != VARIABLE_CHAR_STR && + isspace(byte) + ); + + if (byte != VARIABLE_CHAR_STR) { + fprintf(stderr, "§ERROR: Missing start of string\n"); + return 1; + } + + position = ftell(file); + + do { + if ( + byte && + byte != VARIABLE_CHAR_STR + ) { + i++; + } + byte = getc(file); + } while ( + byte && + byte != VARIABLE_CHAR_STR + ); + + if (byte != VARIABLE_CHAR_STR) { + fprintf(stderr, "§ERROR: Missing end of string\n"); + return 1; + } + + fseek(file, position, SEEK_SET); + + if (i) { + variable_init( + var, + 0, + sizeof(char[i]) + ); + + FREADEC(var->value.str, sizeof(char), i, file); + var->value.str[i] = 0; + } + + fseek(file, 1, SEEK_CUR); + + do { + byte = getc(file); + } while ( + byte && + byte != VARIABLE_CHAR_END && + isspace(byte) + ); + + if (byte != VARIABLE_CHAR_END) { + fprintf(stderr, "§ERROR: Missing line end\n"); + return 1; + } + break; + default: + break; + } return 0; } \ No newline at end of file diff --git a/src/variable.h b/src/variable.h index 2b841de..4f446e4 100644 --- a/src/variable.h +++ b/src/variable.h @@ -8,17 +8,14 @@ /* Macros */ /* - Char - */ +#define VARIABLE_CHAR_STR '"' #define VARIABLE_CHAR_END ';' +#define VARIABLE_CHAR_STOP '!' /* Enums */ enum variable_types { VARTYPE_VO, // void - VARTYPE_S8, // int8_t - VARTYPE_U8, // uint8_t - VARTYPE_S16, // int16_t - VARTYPE_U16, // uint16_t - VARTYPE_S32, // int32_t - VARTYPE_U32, // uint32_t + VARTYPE_NUM, // int32_t VARTYPE_FLT, // float VARTYPE_DOU, // double VARTYPE_STR, // char * @@ -40,12 +37,7 @@ typedef struct variable_s { enum variable_types type; char *name; union { - int8_t *s8; - uint8_t *u8; - int16_t *s16; - uint16_t *u16; - int32_t *s32; - uint32_t *u32; + int32_t *num; float *flt; double *dou; char *str; diff --git a/testing.em b/testing.em index 57b4217..b29ed7b 100644 --- a/testing.em +++ b/testing.em @@ -1,7 +1,8 @@ -u8 testU8 10; +num testNum 10; str testString "Testing"; +! obj testArray { - nn u8 5; - nn u8 10; + nn num 5; + nn num 10; nn str "510"; }; \ No newline at end of file diff --git a/vim/syntax/esmake.vim b/vim/syntax/esmake.vim index 85cccce..407dac1 100644 --- a/vim/syntax/esmake.vim +++ b/vim/syntax/esmake.vim @@ -8,21 +8,21 @@ endif " Region syn region emString start="\"" end="\"" +syn region emStop start="!" end=".+" " Match -syn match emComment "//.\+" syn match emNumber "\<\d\+\(_\d\+\)*\>" " Keyword -syn keyword emVarType vo s8 u8 s16 u16 s32 u32 flt dou str obj -syn keyword emVarModifier nn ad +syn keyword emVarType vo num flt dou str obj +syn keyword emVarFlag nn ad hi def link emString string +hi def link emStop comment -hi def link emComment comment hi def link emNumber number hi def link emVarType structure -hi def link emVarModifier keyword +hi def link emVarFlag keyword let b:current_syntax = "esmake" \ No newline at end of file