[PATCH]: define keyword to substitute colors in syntax files

Andrew V. Samoilov sav at bcs.zp.ua
Tue Feb 25 08:16:21 UTC 2003


Hello,

this patch allows new "define" keyword in builtin editor syntax files.
Now only colors can be substituted, but it can be improved on request.
Next construction is legal now:

context default
    define comment brown
    keyword /\* comment
    keyword \*/ comment
    keyword //  comment

ChangeLog:

* syntax.c (defines): New static variable for list of defines.
(mc_defines_destroy): New function to release memory of key pair.
(destroy_defines): New function to destroy list of defines completely.
(this_try_alloc_color_pair): Use strncpy() instead of unsafe strcpy().
Use values from list of defines to substitute given parameters.
(edit_read_syntax_rules): Initialize list of defines and process 
new "define" keyword. Use strncpy() instead of unsafe strcpy().
(edit_free_syntax_rules): Destroy list of defines.

Index: syntax.c
===================================================================
RCS file: /cvs/gnome/mc/edit/syntax.c,v
retrieving revision 1.42
diff -u -p -r1.42 syntax.c
--- syntax.c	15 Dec 2002 18:55:53 -0000	1.42
+++ syntax.c	25 Feb 2003 07:40:49 -0000
@@ -83,6 +83,27 @@ int option_syntax_highlighting = 1;
 
 #define syntax_g_free(x) do {if(x) {g_free(x); (x)=0;}} while (0)
 
+/* List of defines */
+static GTree *defines;
+
+static gint
+mc_defines_destroy (gpointer key, gpointer value, gpointer data)
+{
+    g_free (key);
+    g_free (value);
+
+    return FALSE;
+}
+
+/* Completely destroys the defines tree */
+static void
+destroy_defines (void)
+{
+    g_tree_traverse (defines, mc_defines_destroy, G_POST_ORDER, NULL);
+    g_tree_destroy (defines);
+    defines = 0;
+}
+
 static long compare_word_to_right (WEdit * edit, long i, char *text, char *whole_left, char *whole_right, int line_start)
 {
@@ -534,18 +555,24 @@ this_try_alloc_color_pair (char *fg, cha
 	if (!*fg)
 	    fg = 0;
     if (fg) {
-	strcpy (f, fg);
+	p = g_tree_lookup (defines, fg);
+	if (p)
+	    fg = p;
+	strncpy (f, fg, sizeof (f) - 1);
+	f[sizeof (f) - 1] = 0;
 	p = strchr (f, '/');
 	if (p)
 	    *p = '\0';
-	fg = f;
     }
     if (bg) {
-	strcpy (b, bg);
+	p = g_tree_lookup (defines, bg);
+	if (p)
+	    bg = p;
+	strncpy (b, bg, sizeof (b) - 1);
+	b[sizeof (b) - 1] = 0;
 	p = strchr (b, '/');
 	if (p)
 	    *p = '\0';
-	bg = b;
     }
     return try_alloc_color_pair (fg, bg);
 }
@@ -596,6 +623,8 @@ static int edit_read_syntax_rules (WEdit
 
     r = edit->rules = g_malloc0 (MAX_CONTEXTS * sizeof (struct context_rule *));
 
+    defines = g_tree_new ((GCompareFunc) strcmp);
+
     for (;;) {
 	char **a;
 	line++;
@@ -705,8 +734,10 @@ static int edit_read_syntax_rules (WEdit
 	    bg = *a;
 	    if (*a)
 		a++;
-	    strcpy (last_fg, fg ? fg : "");
-	    strcpy (last_bg, bg ? bg : "");
+	    strncpy (last_fg, fg ? fg : "", sizeof (last_fg) - 1);
+	    last_fg[sizeof (last_fg) - 1] = 0;
+	    strncpy (last_bg, bg ? bg : "", sizeof (last_bg) - 1);
+	    last_bg[sizeof (last_bg) - 1] = 0;
 	    c->keyword[0]->color = this_try_alloc_color_pair (fg, bg);
 	    c->keyword[0]->keyword = g_strdup (" ");
 	    check_not_a;
@@ -762,6 +793,18 @@ static int edit_read_syntax_rules (WEdit
 	    /* do nothing for comment */
 	} else if (!strcmp (args[0], "file")) {
 	    break;
+	} else if (!strcmp (args[0], "define")) {
+	    gpointer t;
+	    char *key = *a++;
+	    char *value = *a;
+	    if (!key || !value)
+		break_a;
+	    if ((t = g_tree_lookup (defines, key))){
+		g_free (t);
+		t = g_strdup (value);
+	    } else {
+		g_tree_insert (defines, g_strdup (key), g_strdup (value));
+	    }
 	} else {		/* anything else is an error */
 	    break_a;
 	}
@@ -806,6 +849,8 @@ void edit_free_syntax_rules (WEdit * edi
 	return;
     if (!edit->rules)
 	return;
+    if (defines)
+	destroy_defines ();
     edit_get_rule (edit, -1);
     syntax_g_free (edit->syntax_type);
     edit->syntax_type = 0;





More information about the mc-devel mailing list