diff --git a/ChangeLog b/ChangeLog index 7aeca7a105b3274bd8959a020838381e7dda6445..e52576c6424bf59f1df411d8ad62c0d1f13816ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -51,7 +51,9 @@ CVS code - color_to_short()), and parse_colors(). (DLR) - Change color handling to save only the extension and color regex strings constantly, and to actually compile them on an - as-needed basis. Changes to update_color(), + as-needed basis. Also, make a color syntax specified on the + command line override the syntax associated with the current + file extension. Changes to update_color(), thanks_for_all_the_fish(), nregcomp(), parse_syntax(), and parse_colors(). (Brand Huntsman and DLR) - Various other color fixes. Handle unspecified foreground diff --git a/src/color.c b/src/color.c index 79073bf80c2253ebcd21af5d155a8b8454b1bfbc..c74ee905ad393106cf56088ca7dbff6bb4c1e185 100644 --- a/src/color.c +++ b/src/color.c @@ -113,47 +113,55 @@ void color_update(void) assert(openfile != NULL); openfile->colorstrings = NULL; - for (tmpsyntax = syntaxes; tmpsyntax != NULL; - tmpsyntax = tmpsyntax->next) { - exttype *e; - - for (e = tmpsyntax->extensions; e != NULL; e = e->next) { - bool not_compiled = (e->ext == NULL); - - /* e->ext_regex has already been checked for validity - * elsewhere. Compile its specified regex if we haven't - * already. */ - if (not_compiled) { - e->ext = (regex_t *)nmalloc(sizeof(regex_t)); - regcomp(e->ext, e->ext_regex, REG_EXTENDED); - } - /* Set colorstrings if we matched the extension regex. */ - if (regexec(e->ext, openfile->filename, 0, NULL, 0) == 0) + /* If we specified a syntax override string, use it. */ + if (syntaxstr != NULL) { + for (tmpsyntax = syntaxes; tmpsyntax != NULL; + tmpsyntax = tmpsyntax->next) { + if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0) openfile->colorstrings = tmpsyntax->color; if (openfile->colorstrings != NULL) break; - - /* Decompile e->ext_regex's specified regex if we aren't - * going to use it. */ - if (not_compiled) { - regfree(e->ext); - free(e->ext); - e->ext = NULL; - } } } - /* If we haven't found a match, use the override string. */ - if (openfile->colorstrings == NULL && syntaxstr != NULL) { + /* If we didn't specify a syntax override string, or if we did and + * there was no syntax by that name, get the syntax based on the + * file extension. */ + if (openfile->colorstrings == NULL) { for (tmpsyntax = syntaxes; tmpsyntax != NULL; tmpsyntax = tmpsyntax->next) { - if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0) - openfile->colorstrings = tmpsyntax->color; - - if (openfile->colorstrings != NULL) - break; + exttype *e; + + for (e = tmpsyntax->extensions; e != NULL; e = e->next) { + bool not_compiled = (e->ext == NULL); + + /* e->ext_regex has already been checked for validity + * elsewhere. Compile its specified regex if we haven't + * already. */ + if (not_compiled) { + e->ext = (regex_t *)nmalloc(sizeof(regex_t)); + regcomp(e->ext, e->ext_regex, REG_EXTENDED); + } + + /* Set colorstrings if we matched the extension + * regex. */ + if (regexec(e->ext, openfile->filename, 0, NULL, + 0) == 0) + openfile->colorstrings = tmpsyntax->color; + + if (openfile->colorstrings != NULL) + break; + + /* Decompile e->ext_regex's specified regex if we aren't + * going to use it. */ + if (not_compiled) { + regfree(e->ext); + free(e->ext); + e->ext = NULL; + } + } } }