]> git.refcnt.org Git - colorize.git/commitdiff
Don't fail if color string exists as file
authorSteven Schubiger <stsc@refcnt.org>
Tue, 29 Oct 2013 19:12:42 +0000 (20:12 +0100)
committerSteven Schubiger <stsc@refcnt.org>
Tue, 29 Oct 2013 19:12:42 +0000 (20:12 +0100)
colorize.c

index 35d14dccd491062c74b705b1977fce7600e45b29..67a48612d6cac55a3e032512d73759cc8f325f15 100644 (file)
@@ -196,6 +196,7 @@ static void *realloc_wrap_debug (void *, size_t, const char *, unsigned int);
 static void free_wrap (void **);
 static char *strdup_wrap (const char *);
 static char *str_concat (const char *, const char *);
+static bool has_color_name (const char *, const char *);
 static void vfprintf_diag (const char *, ...);
 static void vfprintf_fail (const char *, ...);
 static void stack_var (void ***, unsigned int *, unsigned int, void *);
@@ -443,14 +444,18 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct
             for (i = 0; i < tables[FOREGROUND].count; i++)
               {
                 const struct color *entry = &tables[FOREGROUND].entries[i];
-                char *p;
-                if ((p = strstr (color, entry->name)) && p == color)
+                if (has_color_name (color, entry->name))
                   {
-                    color = p + strlen (entry->name);
+                    color += strlen (entry->name);
                     matched = true;
                     break;
                   }
               }
+            if (!matched && has_color_name (color, "random"))
+              {
+                color += strlen ("random");
+                matched = true;
+              }
             if (matched && *color == COLOR_SEP_CHAR && *(color + 1))
               color++;
             else
@@ -982,6 +987,23 @@ str_concat (const char *str1, const char *str2)
     return str;
 }
 
+static bool
+has_color_name (const char *str, const char *name)
+{
+    char *p;
+
+    assert (strlen (str));
+    assert (strlen (name));
+
+    if (!(*str == *name || *str == toupper (*name)))
+      return false;
+    else if (*(name + 1) != '\0'
+     && !((p = strstr (str + 1, name + 1)) && p == str + 1))
+      return false;
+
+    return true;
+}
+
 #define DO_VFPRINTF(fmt)                    \
     va_list ap;                             \
     fprintf (stderr, "%s: ", program_name); \