From 1c287a912e0226cf2ba23a540e7a454905c27f87 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Sat, 28 Jan 2023 19:48:24 -0600 Subject: [PATCH] Code editor lexer configuration files working. --- src/editor.c | 66 +++++++++++++++++++++++++++++++++++++++------- src/project.c | 6 ++--- src/utils.c | 6 ++--- ui/editor-cpp.conf | 38 +++++++++++++------------- 4 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/editor.c b/src/editor.c index ac0ab3a..c47c5b7 100644 --- a/src/editor.c +++ b/src/editor.c @@ -82,11 +82,15 @@ EVENT void editorEditorNotify(GtkWidget *sciWidget, gint ctrlID, struct SCNotifi static void loadEditorConfig(char *lexer, EditorDataT *self) { - char *config = NULL; - FILE *in = NULL; - char *line = NULL; - size_t len = 0; - char *c = NULL; + char *config = NULL; + FILE *in = NULL; + char *line = NULL; + size_t len = 0; + char *c = NULL; + char *type = NULL; + char *name = NULL; + unsigned int number; + unsigned int integer; config = utilCreateString("%s%cjoeydev%ceditor-%s.conf", g_get_user_config_dir(), UTIL_PATH_CHAR, UTIL_PATH_CHAR, lexer); if (!utilFileExists(config)) { @@ -100,7 +104,7 @@ static void loadEditorConfig(char *lexer, EditorDataT *self) { if (in) { // Load config. - utilEnsureBufferSize(&line, &len, 1024); // Not technically needed, but fixes a pointer warning from memmaker. + utilEnsureBufferSize((unsigned char **)&line, (int *)&len, 4096); // Not technically needed, but fixes a pointer warning from memmaker. while (getline(&line, &len, in) != -1) { if (strlen(line) > 0) line[strlen(line) - 1] = 0; c = utilGetToken(line, " ", "\"", "\""); @@ -108,17 +112,59 @@ static void loadEditorConfig(char *lexer, EditorDataT *self) { // Is this a 'style' line? if (strcasecmp(c, "style") == 0) { - + // style number "tags" "description" ... (style keywords) + c = utilGetToken(NULL, " ", "\"", "\""); + number = strtol(c, NULL, 10); + c = utilGetToken(NULL, " ", "\"", "\""); + c = utilGetToken(NULL, " ", "\"", "\""); + c = utilGetToken(NULL, " ", "\"", "\""); + do { + if (strcmp(c, "fore") == 0) { + c = utilGetToken(NULL, " ", "\"", "\""); + integer = strtol(c, NULL, 16); + SSM(SCI_STYLESETFORE, number, integer); + } + if (strcmp(c, "back") == 0) { + c = utilGetToken(NULL, " ", "\"", "\""); + integer = strtol(c, NULL, 16); + SSM(SCI_STYLESETBACK, number, integer); + } + if (strcmp(c, "bold") == 0) { + SSM(SCI_STYLESETBOLD, number, 1); + } + if (strcmp(c, "italic") == 0) { + SSM(SCI_STYLESETITALIC, number, 1); + } + c = utilGetToken(NULL, " ", "\"", "\""); + } while (c != NULL); + continue; } // Is this a 'property' line? if (strcasecmp(c, "property") == 0) { - + // property type name "description" value + c = utilGetToken(NULL, " ", "\"", "\""); + type = strdup(c); + c = utilGetToken(NULL, " ", "\"", "\""); + name = strdup(c); + c = utilGetToken(NULL, " ", "\"", "\""); + c = utilGetToken(NULL, " ", "\"", "\""); + utilDequote(c); + SSM(SCI_SETPROPERTY, (sptr_t)name, (sptr_t)c); + DEL(name); + DEL(type); + continue; } // Is this a 'keywords' line? if (strcasecmp(c, "keywords") == 0) { - + // keywords number "description" wordlist + c = utilGetToken(NULL, " ", "\"", "\""); + number = strtol(c, NULL, 10); + c = utilGetToken(NULL, " ", "\"", "\""); + c = utilGetToken(NULL, "\n", "\"", "\""); + if (c && strlen(c) > 0) SSM(SCI_SETKEYWORDS, number, (sptr_t)c); + continue; } } DEL(line); @@ -321,7 +367,7 @@ static void writeEditorConfig(char *lexer, EditorDataT *self) { case SC_TYPE_BOOLEAN: fprintf(out, "boolean"); size = SSM(SCI_GETPROPERTYINT, (sptr_t)tags, 0); - config = utilCreateString("%s", size ? "true" : "false"); + config = utilCreateString("%d", size); break; case SC_TYPE_STRING: diff --git a/src/project.c b/src/project.c index 7fd68e6..c93eb91 100644 --- a/src/project.c +++ b/src/project.c @@ -164,7 +164,7 @@ static void addToTree(ProjectDataT *self, char *filename) { } DEL(temp); fileLen = 0; - utilEnsureBufferSize(&temp, &fileLen, 4); // fileLen is just a throwaway here. + utilEnsureBufferSize((unsigned char **)&temp, &fileLen, 4); // fileLen is just a throwaway here. snprintf(temp, 4, "%d", foundAt); gtk_tree_model_get_iter_from_string(model, &iter, temp); gtk_tree_store_append(GTK_TREE_STORE(model), &child, &iter); @@ -195,7 +195,7 @@ static void loadConfig(ProjectDataT *self) { if (utilFileExists(self->configName)) { in = fopen(self->configName, "rt"); if (in != NULL) { - utilEnsureBufferSize(&line, &len, 1024); // Not technically needed, but fixes a pointer warning from memmaker. + utilEnsureBufferSize((unsigned char **)&line, (int *)&len, 1024); // Not technically needed, but fixes a pointer warning from memmaker. while (getline(&line, &len, in) != -1) { if (strlen(line) > 0) line[strlen(line) - 1] = 0; switch (count) { @@ -276,7 +276,7 @@ static void loadProject(ProjectDataT *self) { cwk_path_get_dirname(path, &i); if (i > 0) path[i] = 0; // Load config. - utilEnsureBufferSize(&line, &len, 1024); // Not technically needed, but fixes a pointer warning from memmaker. + utilEnsureBufferSize((unsigned char **)&line, (int *)&len, 1024); // Not technically needed, but fixes a pointer warning from memmaker. while (getline(&line, &len, in) != -1) { if (strlen(line) > 0) line[strlen(line) - 1] = 0; c = utilGetToken(line, " ", "\"", "\""); diff --git a/src/utils.c b/src/utils.c index 602ab7c..2e86753 100644 --- a/src/utils.c +++ b/src/utils.c @@ -119,7 +119,7 @@ void utilEnsureBufferSize(unsigned char **buffer, int *length, int wanted) { unsigned char *temp = NULL; if (*length < wanted) { - *length = *length + 1024; + while (*length < wanted) *length = *length + 1024; temp = realloc(*buffer, *length); if (temp == NULL) { //***TODO*** Something bad happened. @@ -449,7 +449,7 @@ void utilWindowRegister(gpointer windowData) { int utilWindowsCloseAll(void) { WindowDataT *w; - debug("Windows Left Open: %d\n", hmlen(_windowList)); + debug("Windows Left Open: %ld\n", hmlen(_windowList)); while (hmlen(_windowList) > 0) { w = (WindowDataT *)_windowList[0].value; if (w->closeWindow(w->window, w) == TRUE) { @@ -476,7 +476,7 @@ gboolean utilWindowUnRegister(gpointer windowData) { WindowDataT *w = (WindowDataT *)windowData; result = hmdel(_windowList, w->window); - debug("Window Unregistered: %d\n", hmlen(_windowList)); + debug("Window Unregistered: %ld\n", hmlen(_windowList)); DEL(w->filename); DEL(w->title); diff --git a/ui/editor-cpp.conf b/ui/editor-cpp.conf index e1722be..51f1d9e 100644 --- a/ui/editor-cpp.conf +++ b/ui/editor-cpp.conf @@ -58,27 +58,27 @@ style 89 "inactive literal" "" fore 0xffffff style 90 "inactive comment taskmarker" "" fore 0xffffff style 91 "inactive literal string escapesequence" "" fore 0xffffff -property boolean styling.within.preprocessor "For C++ code, determines whether all preprocessor code is styled in the preprocessor style (0, the default) or only from the initial # to the end of the command word(1)." false -property boolean lexer.cpp.allow.dollars "Set to 0 to disallow the '$' character in identifiers with the cpp lexer." false -property boolean lexer.cpp.track.preprocessor "Set to 1 to interpret #if/#else/#endif to grey out code that is not active." true -property boolean lexer.cpp.update.preprocessor "Set to 1 to update preprocessor definitions when #define found." true -property boolean lexer.cpp.verbatim.strings.allow.escapes "Set to 1 to allow verbatim strings to contain escape sequences." true -property boolean lexer.cpp.triplequoted.strings "Set to 1 to enable highlighting of triple-quoted strings." false -property boolean lexer.cpp.hashquoted.strings "Set to 1 to enable highlighting of hash-quoted strings." false -property boolean lexer.cpp.backquoted.strings "Set to 1 to enable highlighting of back-quoted raw strings ." false -property boolean lexer.cpp.escape.sequence "Set to 1 to enable highlighting of escape sequences in strings" true -property boolean fold "" true -property boolean fold.cpp.syntax.based "Set this property to 0 to disable syntax based folding." true -property boolean fold.comment "This option enables folding multi-line comments and explicit fold points when using the C++ lexer. Explicit fold points allows adding extra folding by placing a //{ comment at the start and a //} at the end of a section that should fold." true -property boolean fold.cpp.comment.multiline "Set this property to 0 to disable folding multi-line comments when fold.comment=1." true -property boolean fold.cpp.comment.explicit "Set this property to 0 to disable folding explicit fold points when fold.comment=1." true +property boolean styling.within.preprocessor "For C++ code, determines whether all preprocessor code is styled in the preprocessor style (0, the default) or only from the initial # to the end of the command word(1)." 0 +property boolean lexer.cpp.allow.dollars "Set to 0 to disallow the '$' character in identifiers with the cpp lexer." 0 +property boolean lexer.cpp.track.preprocessor "Set to 1 to interpret #if/#else/#endif to grey out code that is not active." 1 +property boolean lexer.cpp.update.preprocessor "Set to 1 to update preprocessor definitions when #define found." 1 +property boolean lexer.cpp.verbatim.strings.allow.escapes "Set to 1 to allow verbatim strings to contain escape sequences." 1 +property boolean lexer.cpp.triplequoted.strings "Set to 1 to enable highlighting of triple-quoted strings." 0 +property boolean lexer.cpp.hashquoted.strings "Set to 1 to enable highlighting of hash-quoted strings." 0 +property boolean lexer.cpp.backquoted.strings "Set to 1 to enable highlighting of back-quoted raw strings ." 0 +property boolean lexer.cpp.escape.sequence "Set to 1 to enable highlighting of escape sequences in strings" 1 +property boolean fold "" 1 +property boolean fold.cpp.syntax.based "Set this property to 0 to disable syntax based folding." 1 +property boolean fold.comment "This option enables folding multi-line comments and explicit fold points when using the C++ lexer. Explicit fold points allows adding extra folding by placing a //{ comment at the start and a //} at the end of a section that should fold." 1 +property boolean fold.cpp.comment.multiline "Set this property to 0 to disable folding multi-line comments when fold.comment=1." 1 +property boolean fold.cpp.comment.explicit "Set this property to 0 to disable folding explicit fold points when fold.comment=1." 1 property string fold.cpp.explicit.start "The string to use for explicit fold start points, replacing the standard //{." "//{" property string fold.cpp.explicit.end "The string to use for explicit fold end points, replacing the standard //}." "//}" -property boolean fold.cpp.explicit.anywhere "Set this property to 1 to enable explicit fold points anywhere, not just in line comments." false -property boolean fold.cpp.preprocessor.at.else "This option enables folding on a preprocessor #else or #endif line of an #if statement." true -property boolean fold.preprocessor "This option enables folding preprocessor directives when using the C++ lexer. Includes C#'s explicit #region and #endregion folding directives." false -property boolean fold.compact "" false -property boolean fold.at.else "This option enables C++ folding on a "} else {" line of an if statement." true +property boolean fold.cpp.explicit.anywhere "Set this property to 1 to enable explicit fold points anywhere, not just in line comments." 0 +property boolean fold.cpp.preprocessor.at.else "This option enables folding on a preprocessor #else or #endif line of an #if statement." 1 +property boolean fold.preprocessor "This option enables folding preprocessor directives when using the C++ lexer. Includes C#'s explicit #region and #endregion folding directives." 0 +property boolean fold.compact "" 0 +property boolean fold.at.else "This option enables C++ folding on a "} else {" line of an if statement." 1 keywords 0 "Primary keywords and identifiers" auto break case char const continue default do double else enum extern float for goto if inline int long nullptr register restrict return short signed sizeof static struct switch typedef union unsigned void volitile while keywords 1 "Secondary keywords and identifiers" jlFree jlMalloc jlRealloc jlDisplayBorder jlDisplayPresent jlDrawBlit8x8 jlDrawBlit8x8a jlDrawBlitMap jlDrawBox jlDrawBoxFilled jlDrawCircle jlDrawClear jlDrawColorGet jlDrawColorSet jlDrawEllipse jlDrawFill jlDrawFillTo jlDrawLine jlDrawPixelGet jlDrawPixelSet jlSurfaceGet jlSurfaceSet jlGameGetAxis jlGameGetButton jlImgCopy jlImgCreate jlImgDisplay jlImgFree jlImgLoad jlImgSave jlImgSurfaceGet jlKeyPressed jlKeyRead jlKeyWaitForAny jlModContinue jlModFree jlModIsPlaying jlModLoad jlModPause jlModPlay jlModStop jlModVolume jlPaletteDefault jlPaletteSet jlPaletteSetFromImg jlSoundFree jlSoundIsPlaying jlSoundLoad jlSoundPlay jlSoundStop jlSoundSwapChannels jlStnFree jlStnLoad jlUtilByteSwap jlUtilDie jlUtilIdle jlUtilInputRead jlUtilIsOdd jlUtilMakePathname jlUtilMustExit jlUtilNibbleSwap jlUtilRandom jlUtilRandomSeedGet jlUtilRandomSeedSet jlUtilSay jlUtilSleep jlUtilStackPop jlUtilStackPush jlUtilTimer jlUtilTimeSpan jlUtilTitleSet jlVecDisplay jlVecFree jlVecLoad