Re: [PATCH] Choose syntax
- From: Leonard den Ottolander <leonard den ottolander nl>
- To: MC Devel <mc-devel gnome org>
- Subject: Re: [PATCH] Choose syntax
- Date: Tue, 12 Jul 2005 00:25:14 +0200
Hi,
- Fixed a segfault that was caused by the names list not being filled or
NULLed in case option_syntax_highlight is off and edit_syntax_dialog()
is invoked. I currently test for names being non NULL to proceed with
edit_load_syntax() instead of aborting early.
- Now testing option_auto_syntax to set type to NULL in
edit_load_syntax(). This simplifies the calls to that function (look
mom, no brackets ;-) ).
- Don't use underscores for #define's.
- Blatantly ignoring any suggestion to use NULL, TRUE or FALSE.
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-11 23:32:14.000000000 +0200
@@ -0,0 +1,83 @@
+/* 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 "syntax.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))
+ listbox_select_by_number (syntaxlist->list, i + N_DFLT_ENTRIES);
+ }
+
+ return run_listbox (syntaxlist);
+}
+
+void
+edit_syntax_dialog () {
+ char *old_syntax_type;
+ int old_auto_syntax, syntax;
+ char *names[MAX_SYNTAX_FILES + 1];
+
+ /* 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, 0);
+
+ if ((syntax = exec_edit_syntax_dialog ((const char**) names)) < 0)
+ 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))
+ edit_load_syntax (wedit, 0, option_syntax_type);
+
+ 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-11 23:28:09.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-11 23:28:09.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, 0, 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-11 23:28:09.000000000 +0200
@@ -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-11 23:28:09.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-11 23:28:09.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, 0, 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-11 23:28:09.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 00:01:57.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 it's size yet */
+ if (count == MAX_SYNTAX_FILES) {
+ names[count] = 0;
+ break;
+ }
names[count++] = g_strdup (args[2]);
names[count] = 0;
} else if (type) {
@@ -1096,12 +1104,15 @@ edit_load_syntax (WEdit *edit, char **na
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-11 23:28:09.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-11 23:28:09.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]