Re: [PATCH] Choose syntax



Hi Roland,

On Mon, 2005-07-11 at 08:33, Roland Illig wrote:
> #include "../src/global.h"
> (see HEAD/maint/headers.txt)

If you can explain me why I need this seemingly redundant #include I
might be convinced ;) . Please also put your reasonings down in
headers.txt.

Some improvements:
- g_free() the items of names before return.
- Use NULL in calls to edit_load_syntax()
- Use strcmp == or != to compare strings
- Redefined edit_load_syntax() and exec_edit_syntax_dialog() to accept
names as a char*[MAX_SYNTAX_FILES + 1] instead of a char**.

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-12 13:57:49.000000000 +0200
@@ -0,0 +1,90 @@
+/* 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[MAX_SYNTAX_FILES + 1]) {
+    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[MAX_SYNTAX_FILES + 1];
+    int i;
+
+    /* 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]);
+	}
+	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 (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-12 13:48:32.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-12 13:48:32.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-12 13:52:11.000000000 +0200
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 
 #include "../src/global.h"
+#include "syntax.h"
 
 #define N_menus 5
 
@@ -234,7 +235,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[MAX_SYNTAX_FILES + 1], const char *type);
 void edit_free_syntax_rules (WEdit * edit);
 void edit_get_syntax_color (WEdit * edit, long byte_index, int *color);
 
@@ -252,6 +253,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 +313,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-12 13:48:32.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-12 13:48:32.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-12 13:48:32.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-12 13:50:16.000000000 +0200
@@ -23,6 +23,7 @@
 #include <config.h>
 #include "edit.h"
 #include "edit-widget.h"
+#include "syntax.h"
 #include "../src/color.h"	/* use_colors */
 #include "../src/main.h"	/* mc_home */
 #include "../src/wtools.h"	/* message() */
@@ -85,6 +86,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)
 
@@ -1007,6 +1010,11 @@ edit_read_syntax_file (WEdit * edit, cha
 	}
 	if (names) {
 /* 1: just collecting a list of names of rule sets */
+/* This list could be allocated here dynamically as we don't know its size yet */
+	    if (count == MAX_SYNTAX_FILES) {
+		names[count] = 0;
+		break;
+	    }
 	    names[count++] = g_strdup (args[2]);
 	    names[count] = 0;
 	} else if (type) {
@@ -1091,17 +1099,20 @@ static char *get_first_editor_line (WEdi
  * 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 *names[MAX_SYNTAX_FILES + 1], 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 && !names)
 	return;
 
     if (edit) {
diff -pruN MC_4_6_1_PRE/mc/edit/syntax.h MC_4_6_1_PRE.syntax/mc/edit/syntax.h
--- MC_4_6_1_PRE/mc/edit/syntax.h	1970-01-01 01:00:00.000000000 +0100
+++ MC_4_6_1_PRE.syntax/mc/edit/syntax.h	2005-07-12 13:48:32.000000000 +0200
@@ -0,0 +1,6 @@
+#ifndef SYNTAX_H
+#define SYNTAX_H
+
+#define MAX_SYNTAX_FILES 1024
+
+#endif				/* !SYNTAX_H */
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-12 13:48:32.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]