nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 04262f09a49a9ecd6731350a87ce1197c0de01c2
parent ed296525f49fa42d992330d7db730980bd966f7a
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Thu, 10 Mar 2016 20:06:01 +0000

Turning the linked list of syntaxes upside-down, so that the last-defined one
comes first, so that a search can stop at the first match instead of always
having to run through the entire list.


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5716 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

Diffstat:
MChangeLog | 4++++
Msrc/color.c | 5+++++
Msrc/rcfile.c | 29+++++++++--------------------
3 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -5,6 +5,10 @@ formatter command into a single routine. * src/rcfile.c (parse_header_exp, parse_magic_exp, grab_and_store): Elide the first two functions, and reshuffle parameters in the last. + * src/rcfile.c (parse_syntax, parse_rcfile), src/color.c + (color_update): Turn the linked list of syntaxes upside-down, so that + the last-defined one comes first, so that searching can stop at the + first match instead of always having to run through the entire list. 2016-03-09 Benno Schulenberg <bensberg@justemail.net> * src/rcfile.c (parse_syntax): Produce an adequate error message diff --git a/src/color.c b/src/color.c @@ -186,6 +186,7 @@ void color_update(void) if (strcmp(sint->name, syntaxstr) == 0) { openfile->syntax = sint; openfile->colorstrings = sint->color; + break; } } @@ -216,6 +217,7 @@ void color_update(void) if (found_in_list(sint->extensions, fullname)) { openfile->syntax = sint; openfile->colorstrings = sint->color; + break; } } @@ -231,6 +233,7 @@ void color_update(void) if (found_in_list(sint->headers, openfile->fileage->data)) { openfile->syntax = sint; openfile->colorstrings = sint->color; + break; } } } @@ -271,6 +274,7 @@ void color_update(void) if (found_in_list(sint->magics, magicstring)) { openfile->syntax = sint; openfile->colorstrings = sint->color; + break; } } } @@ -287,6 +291,7 @@ void color_update(void) if (strcmp(sint->name, "default") == 0) { openfile->syntax = sint; openfile->colorstrings = sint->color; + break; } } } diff --git a/src/rcfile.c b/src/rcfile.c @@ -124,7 +124,7 @@ static bool opensyntax = FALSE; /* Whether we're allowed to add to the last syntax. When a file ends, * or when a new syntax command is seen, this bool becomes FALSE. */ static syntaxtype *endsyntax = NULL; - /* The end of the list of syntaxes. */ + /* The syntax that is currently being parsed. */ static colortype *endcolor = NULL; /* The end of the color list for the current syntax. */ #endif @@ -298,17 +298,8 @@ void parse_syntax(char *ptr) return; } - if (syntaxes == NULL) { - syntaxes = (syntaxtype *)nmalloc(sizeof(syntaxtype)); - endsyntax = syntaxes; - } else { - endsyntax->next = (syntaxtype *)nmalloc(sizeof(syntaxtype)); - endsyntax = endsyntax->next; -#ifdef DEBUG - fprintf(stderr, "Adding new syntax after first one\n"); -#endif - } - + /* Initialize a new syntax struct. */ + endsyntax = (syntaxtype *)nmalloc(sizeof(syntaxtype)); endsyntax->name = mallocstrcpy(NULL, nameptr); endsyntax->extensions = NULL; endsyntax->headers = NULL; @@ -318,7 +309,10 @@ void parse_syntax(char *ptr) endsyntax->color = NULL; endcolor = NULL; endsyntax->nmultis = 0; - endsyntax->next = NULL; + + /* Hook the new syntax in at the top of the list. */ + endsyntax->next = syntaxes; + syntaxes = endsyntax; opensyntax = TRUE; @@ -928,9 +922,6 @@ void parse_rcfile(FILE *rcstream char *buf = NULL; ssize_t len; size_t n = 0; -#ifndef DISABLE_COLOR - syntaxtype *end_syn_save = NULL; -#endif while ((len = getline(&buf, &n, rcstream)) > 0) { char *ptr, *keyword, *option; @@ -973,7 +964,6 @@ void parse_rcfile(FILE *rcstream opensyntax = FALSE; continue; } else { - end_syn_save = endsyntax; endsyntax = sint; opensyntax = TRUE; keyword = ptr; @@ -1047,9 +1037,8 @@ void parse_rcfile(FILE *rcstream #ifndef DISABLE_COLOR /* If we temporarily reset endsyntax to allow extending, * restore the value here. */ - if (end_syn_save != NULL) { - endsyntax = end_syn_save; - end_syn_save = NULL; + if (endsyntax != syntaxes) { + endsyntax = syntaxes; opensyntax = FALSE; } #endif