[PATCH] Choose syntax with dynamic list allocation



Hi,

Well, it turned out my pointer arithmetic wasn't that bad, but testing
for (! count % NENTRIES) to reallocate the list is not entirely correct
;).

Here is a patch which allocates the syntax list dynamically. NENTRIES is
currently defined as 3, but that is for testing purposes only.

Maybe we should save the syntax list instead of creating it on every
invocation of the editor?

Leonard.

-- 
mount -t life -o ro /dev/dna /genetic/research

diff -pruN MC_4_6_1_PRE/mc/edit/choosesyntax.c MC_4_6_1_PRE.syntax/mc/edit/choosesyntax.c
--- MC_4_6_1_PRE/mc/edit/choosesyntax.c	1970-01-01 01:00:00.000000000 +0100
+++ MC_4_6_1_PRE.syntax/mc/edit/choosesyntax.c	2005-07-20 14:39:07.000000000 +0200
@@ -0,0 +1,94 @@
+/* User interface for syntax selection.
+
+   Copyright (C) 2005 Leonard den Ottolander <leonard den ottolander nl>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include "edit.h"
+#include "../src/wtools.h"
+
+#define MAX_ENTRY_LEN 40
+#define LIST_LINES 14
+#define N_DFLT_ENTRIES 1
+
+int
+exec_edit_syntax_dialog (const char **names) {
+    int i;
+
+    Listbox *syntaxlist = create_listbox_window (MAX_ENTRY_LEN, LIST_LINES,
+	N_(" Choose syntax highlighting "), NULL);
+    LISTBOX_APPEND_TEXT (syntaxlist, 'A', N_("< Auto >"), NULL);
+
+    for (i = 0; names[i]; i++) {
+	LISTBOX_APPEND_TEXT (syntaxlist, 0, names[i], NULL);
+	if (! option_auto_syntax && option_syntax_type &&
+	    (strcmp (names[i], option_syntax_type) == 0))
+    	    listbox_select_by_number (syntaxlist->list, i + N_DFLT_ENTRIES);
+    }
+
+    return run_listbox (syntaxlist);
+}
+
+void
+edit_syntax_dialog (void) {
+    char *old_syntax_type;
+    int old_auto_syntax, syntax;
+    char **names;
+    int i;
+
+    names = (char**) g_malloc (sizeof (char*));
+    names[0] = NULL;
+    /* We fill the list of syntax files every time the editor is invoked.
+       Instead we could save the list to a file and update it once the syntax
+       file gets updated (either by testing or by explicit user command). */
+    edit_load_syntax (NULL, &names, NULL);
+
+    if ((syntax = exec_edit_syntax_dialog ((const char**) names)) < 0) {
+	for (i = 0; names[i]; i++) {
+	    g_free (names[i]);
+	}
+	g_free (names);
+	return;
+    }
+
+    old_auto_syntax = option_auto_syntax;
+    old_syntax_type = g_strdup (option_syntax_type);
+
+    /* Using a switch as we might want to define more specific commands, f.e.
+       "Refill syntax list" (compare N_DFLT_ENTRIES). */
+    switch (syntax) {
+	case 0: /* auto syntax */
+	    option_auto_syntax = 1;
+	    break;
+	default:
+	    option_auto_syntax = 0;
+	    g_free (option_syntax_type);
+	    option_syntax_type = g_strdup (names[syntax - N_DFLT_ENTRIES]);
+    }
+
+    /* Load or unload syntax rules if the option has changed */
+    if (option_auto_syntax && !old_auto_syntax || old_auto_syntax ||
+	old_syntax_type && option_syntax_type &&
+	(strcmp (old_syntax_type, option_syntax_type) != 0))
+	edit_load_syntax (wedit, NULL, option_syntax_type);
+
+    for (i = 0; names[i]; i++) {
+	g_free (names[i]);
+    }
+    g_free (names);
+    g_free (old_syntax_type);
+}
diff -pruN MC_4_6_1_PRE/mc/edit/edit.c MC_4_6_1_PRE.syntax/mc/edit/edit.c
--- MC_4_6_1_PRE/mc/edit/edit.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/edit.c	2005-07-20 14:39:07.000000000 +0200
@@ -499,6 +499,7 @@ edit_init (WEdit *edit, int lines, int c
 	   long line)
 {
     int to_free = 0;
+    option_auto_syntax = 1; /* Resetting to auto on every invokation */
 
     if (!edit) {
 #ifdef ENABLE_NLS
diff -pruN MC_4_6_1_PRE/mc/edit/editcmd.c MC_4_6_1_PRE.syntax/mc/edit/editcmd.c
--- MC_4_6_1_PRE/mc/edit/editcmd.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/editcmd.c	2005-07-20 14:39:07.000000000 +0200
@@ -512,7 +512,7 @@ edit_save_as_cmd (WEdit *edit)
 		edit->modified = 0;
 		edit->delete_file = 0;
 		if (different_filename)
-		    edit_load_syntax (edit, 0, 0);
+		    edit_load_syntax (edit, NULL, option_syntax_type);
 		edit->force |= REDRAW_COMPLETELY;
 		return 1;
 	    } else {
diff -pruN MC_4_6_1_PRE/mc/edit/edit.h MC_4_6_1_PRE.syntax/mc/edit/edit.h
--- MC_4_6_1_PRE/mc/edit/edit.h	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/edit.h	2005-07-20 14:39:07.000000000 +0200
@@ -234,7 +234,7 @@ void edit_paste_from_history (WEdit *edi
 
 void edit_set_filename (WEdit *edit, const char *name);
 
-void edit_load_syntax (WEdit * edit, char **names, const char *type);
+void edit_load_syntax (WEdit * edit, char ***names, const char *type);
 void edit_free_syntax_rules (WEdit * edit);
 void edit_get_syntax_color (WEdit * edit, long byte_index, int *color);
 
@@ -252,6 +252,7 @@ int line_is_blank (WEdit *edit, long lin
 int edit_indent_width (WEdit *edit, long p);
 void edit_insert_indent (WEdit *edit, int indent);
 void edit_options_dialog (void);
+void edit_syntax_dialog (void);
 void edit_mail_dialog (WEdit *edit);
 void format_paragraph (WEdit *edit, int force);
 
@@ -311,6 +312,8 @@ extern int option_save_position;
 extern int option_backup_ext_int;
 extern int option_max_undo;
 extern int option_syntax_highlighting;
+extern int option_auto_syntax;
+extern char *option_syntax_type;
 extern int editor_option_check_nl_at_eof;
 
 extern int option_edit_right_extreme;
diff -pruN MC_4_6_1_PRE/mc/edit/editmenu.c MC_4_6_1_PRE.syntax/mc/edit/editmenu.c
--- MC_4_6_1_PRE/mc/edit/editmenu.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/editmenu.c	2005-07-20 14:39:07.000000000 +0200
@@ -272,6 +272,13 @@ menu_options (void)
 {
     edit_options_dialog ();
 }
+
+static void
+menu_syntax (void)
+{
+    edit_syntax_dialog ();
+}
+
 static void
 menu_user_menu_cmd (void)
 {
@@ -394,7 +401,8 @@ static menu_entry OptMenu[] =
 {
     {' ', N_("&General...  "), 'G', menu_options},
     {' ', N_("&Save mode..."), 'S', menu_save_mode_cmd},
-    {' ', N_("learn &Keys..."), 'K', learn_keys}
+    {' ', N_("Learn &Keys..."), 'K', learn_keys},
+    {' ', N_("Syntax &Highlighting..."), 'H', menu_syntax}
 };
 
 #define OptMenuEmacs OptMenu
diff -pruN MC_4_6_1_PRE/mc/edit/editoptions.c MC_4_6_1_PRE.syntax/mc/edit/editoptions.c
--- MC_4_6_1_PRE/mc/edit/editoptions.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/editoptions.c	2005-07-20 14:39:07.000000000 +0200
@@ -200,5 +200,5 @@ edit_options_dialog (void)
 
     /* Load or unload syntax rules if the option has changed */
     if (option_syntax_highlighting != old_syntax_hl)
-	edit_load_syntax (wedit, 0, 0);
+	edit_load_syntax (wedit, NULL, option_syntax_type);
 }
diff -pruN MC_4_6_1_PRE/mc/edit/Makefile.am MC_4_6_1_PRE.syntax/mc/edit/Makefile.am
--- MC_4_6_1_PRE/mc/edit/Makefile.am	2003-04-02 21:36:10.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/Makefile.am	2005-07-20 14:39:07.000000000 +0200
@@ -9,6 +9,6 @@ endif
 libedit_a_SOURCES = \
 	bookmark.c edit.c editcmd.c editwidget.c editdraw.c editkeys.c \
 	editmenu.c editoptions.c editcmddef.h edit.h edit-widget.h \
-	editlock.c editlock.h syntax.c wordproc.c
+	editlock.c editlock.h syntax.c wordproc.c choosesyntax.c
 
 EXTRA_DIST = ChangeLog
diff -pruN MC_4_6_1_PRE/mc/edit/syntax.c MC_4_6_1_PRE.syntax/mc/edit/syntax.c
--- MC_4_6_1_PRE/mc/edit/syntax.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/edit/syntax.c	2005-07-20 14:39:07.000000000 +0200
@@ -85,6 +85,8 @@ struct _syntax_marker {
 };
 
 int option_syntax_highlighting = 1;
+int option_auto_syntax = 1;
+char *option_syntax_type = NULL;
 
 #define syntax_g_free(x) do {g_free(x); (x)=0;} while (0)
 
@@ -953,10 +955,11 @@ void edit_free_syntax_rules (WEdit * edi
 
 /* returns -1 on file error, line number on error in file syntax */
 static int
-edit_read_syntax_file (WEdit * edit, char **names, const char *syntax_file,
+edit_read_syntax_file (WEdit * edit, char ***pnames, const char *syntax_file,
 		       const char *editor_file, const char *first_line,
 		       const char *type)
 {
+#define NENTRIES 3
     FILE *f, *g = NULL;
     regex_t r;
     regmatch_t pmatch[1];
@@ -967,6 +970,7 @@ edit_read_syntax_file (WEdit * edit, cha
     int count = 0;
     char *lib_file;
     int found = 0;
+    char **tmpnames = NULL;
 
     f = fopen (syntax_file, "r");
     if (!f){
@@ -1005,10 +1009,18 @@ edit_read_syntax_file (WEdit * edit, cha
 	    result = line;
 	    break;
 	}
-	if (names) {
+	if (pnames && *pnames) {
 /* 1: just collecting a list of names of rule sets */
-	    names[count++] = g_strdup (args[2]);
-	    names[count] = 0;
+/* Reallocate the list if required */
+	    if (count % NENTRIES == 0) {
+		if ((tmpnames = (char**) g_realloc (*pnames, (count + NENTRIES
+		    + 1) * sizeof (char*))) != NULL)
+		    *pnames = tmpnames;
+		else
+		    abort ();
+	    }
+	    (*pnames)[count++] = g_strdup (args[2]);
+	    (*pnames)[count] = NULL;
 	} else if (type) {
 /* 2: rule set was explicitly specified by the caller */
 	    if (!strcmp (type, args[2]))
@@ -1086,22 +1098,25 @@ static char *get_first_editor_line (WEdi
 }
 
 /*
- * Load rules into edit struct.  Either edit or names must be NULL.  If
+ * Load rules into edit struct.  Either edit or *pnames must be NULL.  If
  * edit is NULL, a list of types will be stored into names.  If type is
  * NULL, then the type will be selected according to the filename.
  */
 void
-edit_load_syntax (WEdit *edit, char **names, const char *type)
+edit_load_syntax (WEdit *edit, char ***pnames, const char *type)
 {
     int r;
     char *f;
 
+    if (option_auto_syntax)
+	type = NULL;
+
     edit_free_syntax_rules (edit);
 
     if (!use_colors)
 	return;
 
-    if (!option_syntax_highlighting)
+    if (!option_syntax_highlighting && (!pnames || !*pnames))
 	return;
 
     if (edit) {
@@ -1111,7 +1126,7 @@ edit_load_syntax (WEdit *edit, char **na
 	    return;
     }
     f = catstrs (home_dir, SYNTAX_FILE, (char *) NULL);
-    r = edit_read_syntax_file (edit, names, f, edit ? edit->filename : 0,
+    r = edit_read_syntax_file (edit, pnames, f, edit ? edit->filename : 0,
 			       get_first_editor_line (edit), type);
     if (r == -1) {
 	edit_free_syntax_rules (edit);
diff -pruN MC_4_6_1_PRE/mc/src/wtools.h MC_4_6_1_PRE.syntax/mc/src/wtools.h
--- MC_4_6_1_PRE/mc/src/wtools.h	2004-09-17 05:19:21.000000000 +0200
+++ MC_4_6_1_PRE.syntax/mc/src/wtools.h	2005-07-20 14:39:07.000000000 +0200
@@ -1,8 +1,7 @@
 #ifndef __WTOOLS_H
 #define __WTOOLS_H
 
-struct Dlg_head;
-struct WListbox;
+#include "widget.h"
 
 /* Listbox utility functions */
 typedef struct {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]