]> granicus.if.org Git - neomutt/commitdiff
STAILQify struct ColorLine 811/head
authorPietro Cerutti <gahr@gahr.ch>
Mon, 2 Oct 2017 11:46:28 +0000 (11:46 +0000)
committerRichard Russon <rich@flatcap.org>
Tue, 3 Oct 2017 19:13:04 +0000 (20:13 +0100)
color.c
curs_main.c
menu.c
mutt_curses.h
pager.c

diff --git a/color.c b/color.c
index b1bccfec1e295dfe223a231721393e6b7f24bb1f..d1683303436636ede388a869665319bddd7ffbfb 100644 (file)
--- a/color.c
+++ b/color.c
 int *ColorQuote = NULL;
 int ColorQuoteUsed;
 int ColorDefs[MT_COLOR_MAX];
-struct ColorLine *ColorHdrList = NULL;
-struct ColorLine *ColorBodyList = NULL;
-struct ColorLine *ColorAttachList = NULL;
-struct ColorLine *ColorStatusList = NULL;
-struct ColorLine *ColorIndexList = NULL;
-struct ColorLine *ColorIndexAuthorList = NULL;
-struct ColorLine *ColorIndexFlagsList = NULL;
-struct ColorLine *ColorIndexSubjectList = NULL;
-struct ColorLine *ColorIndexTagList = NULL;
+struct ColorLineHead ColorHdrList = STAILQ_HEAD_INITIALIZER(ColorHdrList);
+struct ColorLineHead ColorBodyList = STAILQ_HEAD_INITIALIZER(ColorBodyList);
+struct ColorLineHead ColorAttachList = STAILQ_HEAD_INITIALIZER(ColorAttachList);
+struct ColorLineHead ColorStatusList = STAILQ_HEAD_INITIALIZER(ColorStatusList);
+struct ColorLineHead ColorIndexList = STAILQ_HEAD_INITIALIZER(ColorIndexList);
+struct ColorLineHead ColorIndexAuthorList = STAILQ_HEAD_INITIALIZER(ColorIndexAuthorList);
+struct ColorLineHead ColorIndexFlagsList = STAILQ_HEAD_INITIALIZER(ColorIndexFlagsList);
+struct ColorLineHead ColorIndexSubjectList = STAILQ_HEAD_INITIALIZER(ColorIndexSubjectList);
+struct ColorLineHead ColorIndexTagList = STAILQ_HEAD_INITIALIZER(ColorIndexTagList);
 
 /* local to this file */
 static int ColorQuoteSize;
@@ -156,15 +156,11 @@ static struct ColorLine *new_color_line(void)
   return p;
 }
 
-static void free_color_line(struct ColorLine **l, int free_colors)
+static void free_color_line(struct ColorLine *tmp, int free_colors)
 {
-  struct ColorLine *tmp = NULL;
-
-  if (!l || !*l)
+  if (!tmp)
     return;
 
-  tmp = *l;
-
 #ifdef HAVE_COLOR
   if (free_colors && tmp->fg != -1 && tmp->bg != -1)
     mutt_free_color(tmp->fg, tmp->bg);
@@ -177,7 +173,7 @@ static void free_color_line(struct ColorLine **l, int free_colors)
   regfree(&tmp->regex);
   mutt_pattern_free(&tmp->color_pattern);
   FREE(&tmp->pattern);
-  FREE(l);
+  FREE(&tmp);
 }
 
 void ci_start_color(void)
@@ -441,49 +437,48 @@ static int parse_color_name(const char *s, int *col, int *attr, int is_fg, struc
 #endif
 
 static void do_uncolor(struct Buffer *buf, struct Buffer *s,
-                       struct ColorLine **cl, int *do_cache, bool parse_uncolor)
+                       struct ColorLineHead *cl, int *do_cache, bool parse_uncolor)
 {
-  struct ColorLine *tmp = NULL, *last = NULL;
-
+  struct ColorLine *np = NULL, *tmp = NULL;
   do
   {
     mutt_extract_token(buf, s, 0);
     if (mutt_strcmp("*", buf->data) == 0)
     {
-      for (tmp = *cl; tmp;)
+      np = STAILQ_FIRST(cl);
+      while (np)
       {
+        tmp = STAILQ_NEXT(np, entries);
         if (!*do_cache)
         {
           *do_cache = 1;
         }
-        last = tmp;
-        tmp = tmp->next;
-        free_color_line(&last, parse_uncolor);
+        free_color_line(np, parse_uncolor);
+        np = tmp;
       }
-      *cl = NULL;
+      STAILQ_INIT(cl);
+      return;
     }
     else
     {
-      for (last = NULL, tmp = *cl; tmp; last = tmp, tmp = tmp->next)
+      tmp = NULL;
+      STAILQ_FOREACH(np, cl, entries)
       {
-        if (mutt_strcmp(buf->data, tmp->pattern) == 0)
+        if (mutt_strcmp(buf->data, np->pattern) == 0)
         {
           if (!*do_cache)
           {
             *do_cache = 1;
           }
           mutt_debug(1, "Freeing pattern \"%s\" from ColorList\n", tmp->pattern);
-          if (last)
-          {
-            last->next = tmp->next;
-          }
+          if (tmp)
+            STAILQ_REMOVE_AFTER(cl, tmp, entries);
           else
-          {
-            *cl = tmp->next;
-          }
-          free_color_line(&tmp, parse_uncolor);
+            STAILQ_REMOVE_HEAD(cl, entries);
+          free_color_line(np, parse_uncolor);
           break;
         }
+        tmp = np;
       }
     }
   } while (MoreArgs(s));
@@ -597,16 +592,16 @@ int mutt_parse_unmono(struct Buffer *buf, struct Buffer *s, unsigned long data,
   return _mutt_parse_uncolor(buf, s, data, err, 0);
 }
 
-static int add_pattern(struct ColorLine **top, const char *s, int sensitive, int fg,
+static int add_pattern(struct ColorLineHead *top, const char *s, int sensitive, int fg,
                        int bg, int attr, struct Buffer *err, int is_index, int match)
 {
   /* is_index used to store compiled pattern
    * only for `index' color object
    * when called from mutt_parse_color() */
 
-  struct ColorLine *tmp = *top;
+  struct ColorLine *tmp = NULL;
 
-  while (tmp)
+  STAILQ_FOREACH(tmp, top, entries)
   {
     if (sensitive)
     {
@@ -618,7 +613,6 @@ static int add_pattern(struct ColorLine **top, const char *s, int sensitive, int
       if (mutt_strcasecmp(s, tmp->pattern) == 0)
         break;
     }
-    tmp = tmp->next;
   }
 
   if (tmp)
@@ -651,7 +645,7 @@ static int add_pattern(struct ColorLine **top, const char *s, int sensitive, int
       mutt_check_simple(buf, sizeof(buf), NONULL(SimpleSearch));
       if ((tmp->color_pattern = mutt_pattern_comp(buf, MUTT_FULL_MSG, err)) == NULL)
       {
-        free_color_line(&tmp, 1);
+        free_color_line(tmp, 1);
         return -1;
       }
       /* force re-caching of index colors */
@@ -661,10 +655,9 @@ static int add_pattern(struct ColorLine **top, const char *s, int sensitive, int
     else if ((r = REGCOMP(&tmp->regex, s, (sensitive ? mutt_which_case(s) : REG_ICASE))) != 0)
     {
       regerror(r, &tmp->regex, err->data, err->dsize);
-      free_color_line(&tmp, 1);
+      free_color_line(tmp, 1);
       return -1;
     }
-    tmp->next = *top;
     tmp->pattern = safe_strdup(s);
     tmp->match = match;
 #ifdef HAVE_COLOR
@@ -676,7 +669,7 @@ static int add_pattern(struct ColorLine **top, const char *s, int sensitive, int
     }
 #endif
     tmp->pair = attr;
-    *top = tmp;
+    STAILQ_INSERT_HEAD(top, tmp, entries);
   }
 
   return 0;
index f480403c8a7fc0dd22220bc9c075197d0210f0d7..7742d8ca638e41970533268874a97f03d712df96 100644 (file)
@@ -724,7 +724,7 @@ void mutt_draw_statusline(int cols, const char *buf, int buflen)
       break;
 
     /* loop through each "color status regex" */
-    for (cl = ColorStatusList; cl; cl = cl->next)
+    STAILQ_FOREACH(cl, &ColorStatusList, entries)
     {
       regmatch_t pmatch[cl->match + 1];
 
@@ -3326,11 +3326,13 @@ void mutt_set_header_color(struct Context *ctx, struct Header *curhdr)
 
   memset(&cache, 0, sizeof(cache));
 
-  for (color = ColorIndexList; color; color = color->next)
+  STAILQ_FOREACH(color, &ColorIndexList, entries)
+  {
     if (mutt_pattern_exec(color->color_pattern, MUTT_MATCH_FULL_ADDRESS, ctx, curhdr, &cache))
     {
       curhdr->pair = color->pair;
       return;
     }
+  }
   curhdr->pair = ColorDefs[MT_COLOR_NORMAL];
 }
diff --git a/menu.c b/menu.c
index 5f30cb1ede9db3d0e825519e23ad12bcfde97c55..bea90c04b801812e61d2abcf718777f77e20e2b4 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -56,39 +56,42 @@ static struct Menu **MenuStack = NULL;
 
 static int get_color(int index, unsigned char *s)
 {
-  struct ColorLine *color = NULL;
+  struct ColorLineHead *color = NULL;
+  struct ColorLine *np = NULL;
   struct Header *hdr = Context->hdrs[Context->v2r[index]];
   int type = *s;
 
   switch (type)
   {
     case MT_COLOR_INDEX_AUTHOR:
-      color = ColorIndexAuthorList;
+      color = &ColorIndexAuthorList;
       break;
     case MT_COLOR_INDEX_FLAGS:
-      color = ColorIndexFlagsList;
+      color = &ColorIndexFlagsList;
       break;
     case MT_COLOR_INDEX_SUBJECT:
-      color = ColorIndexSubjectList;
+      color = &ColorIndexSubjectList;
       break;
     case MT_COLOR_INDEX_TAG:
-      for (color = ColorIndexTagList; color; color = color->next)
+      STAILQ_FOREACH(np, &ColorIndexTagList, entries)
       {
-        if (strncmp((const char *) (s + 1), color->pattern, strlen(color->pattern)) == 0)
-          return color->pair;
-        const char *transform = hash_find(TagTransforms, color->pattern);
+        if (strncmp((const char *) (s + 1), np->pattern, strlen(np->pattern)) == 0)
+          return np->pair;
+        const char *transform = hash_find(TagTransforms, np->pattern);
         if (transform &&
             (strncmp((const char *) (s + 1), transform, strlen(transform)) == 0))
-          return color->pair;
+          return np->pair;
       }
       return 0;
     default:
       return ColorDefs[type];
   }
 
-  for (; color; color = color->next)
-    if (mutt_pattern_exec(color->color_pattern, MUTT_MATCH_FULL_ADDRESS, Context, hdr, NULL))
-      return color->pair;
+  STAILQ_FOREACH(np, color, entries)
+  {
+    if (mutt_pattern_exec(np->color_pattern, MUTT_MATCH_FULL_ADDRESS, Context, hdr, NULL))
+      return np->pair;
+  }
 
   return 0;
 }
index c6820c75f407993c4d34e0327d1ec32bf7861f17..269524af9379745fec51b06a2e8ef10e98ce9712 100644 (file)
@@ -27,6 +27,7 @@
 #include <regex.h>
 #include "lib/lib.h"
 #include "options.h"
+#include "queue.h"
 
 #ifdef USE_SLANG_CURSES
 
@@ -186,6 +187,7 @@ enum ColorId
 /**
  * struct ColorLine - A regular expression and a color to highlight a line
  */
+STAILQ_HEAD(ColorLineHead, ColorLine);
 struct ColorLine
 {
   regex_t regex;
@@ -196,7 +198,7 @@ struct ColorLine
   short fg;
   short bg;
   int pair;
-  struct ColorLine *next;
+  STAILQ_ENTRY(ColorLine) entries;
 };
 
 #define MUTT_PROGRESS_SIZE (1 << 0) /**< traffic-based progress */
@@ -268,15 +270,15 @@ static inline int mutt_window_wrap_cols(struct MuttWindow *win, short wrap)
 extern int *ColorQuote;
 extern int ColorQuoteUsed;
 extern int ColorDefs[];
-extern struct ColorLine *ColorHdrList;
-extern struct ColorLine *ColorBodyList;
-extern struct ColorLine *ColorAttachList;
-extern struct ColorLine *ColorStatusList;
-extern struct ColorLine *ColorIndexList;
-extern struct ColorLine *ColorIndexAuthorList;
-extern struct ColorLine *ColorIndexFlagsList;
-extern struct ColorLine *ColorIndexSubjectList;
-extern struct ColorLine *ColorIndexTagList;
+extern struct ColorLineHead ColorHdrList;
+extern struct ColorLineHead ColorBodyList;
+extern struct ColorLineHead ColorAttachList;
+extern struct ColorLineHead ColorStatusList;
+extern struct ColorLineHead ColorIndexList;
+extern struct ColorLineHead ColorIndexAuthorList;
+extern struct ColorLineHead ColorIndexFlagsList;
+extern struct ColorLineHead ColorIndexSubjectList;
+extern struct ColorLineHead ColorIndexTagList;
 
 void ci_start_color(void);
 
diff --git a/pager.c b/pager.c
index dfb0882f8cd051aaba0bf69708e142e7ecb52b8c..d0878b796ead48f68013b2f858c9b6b32298ce37 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -794,7 +794,7 @@ static void resolve_types(char *buf, char *raw, struct Line *line_info, int n,
        */
       if (!option(OPT_HEADER_COLOR_PARTIAL))
       {
-        for (color_line = ColorHdrList; color_line; color_line = color_line->next)
+        STAILQ_FOREACH(color_line, &ColorHdrList, entries)
         {
           if (REGEXEC(color_line->regex, buf) == 0)
           {
@@ -908,11 +908,12 @@ static void resolve_types(char *buf, char *raw, struct Line *line_info, int n,
 
       found = false;
       null_rx = false;
+      struct ColorLineHead *head = NULL;
       if (line_info[n].type == MT_COLOR_HDEFAULT)
-        color_line = ColorHdrList;
+        head = &ColorHdrList;
       else
-        color_line = ColorBodyList;
-      while (color_line)
+        head = &ColorBodyList;
+      STAILQ_FOREACH(color_line, head, entries)
       {
         if (regexec(&color_line->regex, buf + offset, 1, pmatch,
                     (offset ? REG_NOTBOL : 0)) == 0)
@@ -949,7 +950,6 @@ static void resolve_types(char *buf, char *raw, struct Line *line_info, int n,
           else
             null_rx = true; /* empty regex; don't add it, but keep looking */
         }
-        color_line = color_line->next;
       }
 
       if (null_rx)
@@ -981,7 +981,7 @@ static void resolve_types(char *buf, char *raw, struct Line *line_info, int n,
 
       found = false;
       null_rx = false;
-      for (color_line = ColorAttachList; color_line; color_line = color_line->next)
+      STAILQ_FOREACH(color_line, &ColorAttachList, entries)
       {
         if (regexec(&color_line->regex, buf + offset, 1, pmatch,
                     (offset ? REG_NOTBOL : 0)) == 0)