SF.net SVN: geany: [474] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sat Jun 24 14:36:48 UTC 2006


Revision: 474
Author:   eht16
Date:     2006-06-24 07:36:35 -0700 (Sat, 24 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=474&view=rev

Log Message:
-----------
Replaced 'blank' by 'include "..."'. Fixed a bug in utils_brace_match() which prevents correctly matching.
Made auto completion work only for the current filetype (i.e. it hides symbols from other filetypes).
Removed unneeded code.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/document.c
    trunk/src/filetypes.c
    trunk/src/filetypes.h
    trunk/src/geany.h
    trunk/src/sci_cb.c
    trunk/src/utils.c
    trunk/tagmanager/options.c
    trunk/tagmanager/options.h
    trunk/tagmanager/parse.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/ChangeLog	2006-06-24 14:36:35 UTC (rev 474)
@@ -1,3 +1,18 @@
+2006-06-24  Enrico Troeger  <enrico.troeger at uvena.de>
+
+ * src/utils.c: Replaced 'blank' by 'include "..."'. Fixed a bug in
+                utils_brace_match() which prevents correctly matching.
+ * src/document.c, src/sci_cb.c, src/filetypes.c:
+   Made auto completion work only for the current filetype
+   (i.e. it hides symbols from other filetypes).
+ * tagmanager/options.c, tagmanager/parse.c: Removed unneeded code.
+ * tagmanager/tm_workspace.c, tagmanager/tm_source_file
+   tagmanager/tm_tag.c, tagmanager/tm_project, tagmanager/parsers.h,
+   tagmanager/tm_file_entry.c, tagmanager/entry.c, src/highlighting.c,
+   data/latex.tags, data/php.tags, Makefile.am:
+   Added global auto completion tags for PHP and LaTeX.   
+
+
 2006-06-23  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/msgwindow.c: Add a timestamp to messages in the Status window

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/document.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -930,17 +930,13 @@
 	if (doc_list[idx].tm_file == NULL)
 	{
 		gchar *locale_filename = g_locale_from_utf8(doc_list[idx].file_name, -1, NULL, NULL, NULL);
-		doc_list[idx].tm_file = tm_source_file_new(locale_filename, FALSE);
+		doc_list[idx].tm_file = tm_source_file_new(locale_filename, FALSE,
+												   doc_list[idx].file_type->name);
 		g_free(locale_filename);
 		if (! doc_list[idx].tm_file) return;
 		tm_workspace_add_object(doc_list[idx].tm_file);
 		if (update)
-		{
-			// parse the file after setting the filetype
-			// this is necessary to switch between filetypes
-			TM_SOURCE_FILE(doc_list[idx].tm_file)->lang = getNamedLanguage((doc_list[idx].file_type)->name);
 			tm_source_file_update(doc_list[idx].tm_file, TRUE, FALSE, TRUE);
-		}
 		utils_update_tag_list(idx, TRUE);
 	}
 	else

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/filetypes.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -48,6 +48,7 @@
 #define C	// these macros are only to ease navigation
 	filetypes[GEANY_FILETYPES_C] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_C]->id = GEANY_FILETYPES_C;
+	filetypes[GEANY_FILETYPES_C]->lang = 0;
 	filetypes[GEANY_FILETYPES_C]->name = g_strdup("C");
 	filetypes[GEANY_FILETYPES_C]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_C]->title = g_strdup(_("C source file"));
@@ -66,6 +67,8 @@
 #define CPP
 	filetypes[GEANY_FILETYPES_CPP] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_CPP]->id = GEANY_FILETYPES_CPP;
+	// C++ has langType 1, but to get the global tags for C, too, we use the langType of C
+	filetypes[GEANY_FILETYPES_CPP]->lang = 0;
 	filetypes[GEANY_FILETYPES_CPP]->name = g_strdup("C++");
 	filetypes[GEANY_FILETYPES_CPP]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_CPP]->title = g_strdup(_("C++ source file"));
@@ -93,6 +96,7 @@
 	filetypes[GEANY_FILETYPES_JAVA] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_JAVA]->id = GEANY_FILETYPES_JAVA;
 	filetypes[GEANY_FILETYPES_JAVA]->name = g_strdup("Java");
+	filetypes[GEANY_FILETYPES_JAVA]->lang = 2;
 	filetypes[GEANY_FILETYPES_JAVA]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_JAVA]->title = g_strdup(_("Java source file"));
 	filetypes[GEANY_FILETYPES_JAVA]->extension = g_strdup("java");
@@ -109,6 +113,7 @@
 #define PERL
 	filetypes[GEANY_FILETYPES_PERL] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_PERL]->id = GEANY_FILETYPES_PERL;
+	filetypes[GEANY_FILETYPES_PERL]->lang = 5;
 	filetypes[GEANY_FILETYPES_PERL]->name = g_strdup("Perl");
 	filetypes[GEANY_FILETYPES_PERL]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_PERL]->title = g_strdup(_("Perl source file"));
@@ -127,6 +132,7 @@
 #define PHP
 	filetypes[GEANY_FILETYPES_PHP] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_PHP]->id = GEANY_FILETYPES_PHP;
+	filetypes[GEANY_FILETYPES_PHP]->lang = 6;
 	filetypes[GEANY_FILETYPES_PHP]->name = g_strdup("PHP");
 	filetypes[GEANY_FILETYPES_PHP]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_PHP]->title = g_strdup(_("PHP / HTML source file"));
@@ -149,6 +155,7 @@
 #define XML
 	filetypes[GEANY_FILETYPES_XML] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_XML]->id = GEANY_FILETYPES_XML;
+	filetypes[GEANY_FILETYPES_XML]->lang = -2;
 	filetypes[GEANY_FILETYPES_XML]->name = g_strdup("XML");
 	filetypes[GEANY_FILETYPES_XML]->has_tags = FALSE;
 	filetypes[GEANY_FILETYPES_XML]->title = g_strdup(_("XML source file"));
@@ -166,6 +173,7 @@
 #define DOCBOOK
 	filetypes[GEANY_FILETYPES_DOCBOOK] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_DOCBOOK]->id = GEANY_FILETYPES_DOCBOOK;
+	filetypes[GEANY_FILETYPES_DOCBOOK]->lang = 12;
 	filetypes[GEANY_FILETYPES_DOCBOOK]->name = g_strdup("Docbook");
 	filetypes[GEANY_FILETYPES_DOCBOOK]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_DOCBOOK]->title = g_strdup(_("Docbook source file"));
@@ -182,6 +190,7 @@
 #define PYTHON
 	filetypes[GEANY_FILETYPES_PYTHON] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_PYTHON]->id = GEANY_FILETYPES_PYTHON;
+	filetypes[GEANY_FILETYPES_PYTHON]->lang = 7;
 	filetypes[GEANY_FILETYPES_PYTHON]->name = g_strdup("Python");
 	filetypes[GEANY_FILETYPES_PYTHON]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_PYTHON]->title = g_strdup(_("Python source file"));
@@ -199,6 +208,7 @@
 #define LATEX
 	filetypes[GEANY_FILETYPES_LATEX] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_LATEX]->id = GEANY_FILETYPES_LATEX;
+	filetypes[GEANY_FILETYPES_LATEX]->lang = 8;
 	filetypes[GEANY_FILETYPES_LATEX]->name = g_strdup("LaTeX");
 	filetypes[GEANY_FILETYPES_LATEX]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_LATEX]->title = g_strdup(_("LaTeX source file"));
@@ -217,6 +227,7 @@
 #define PASCAL
 	filetypes[GEANY_FILETYPES_PASCAL] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_PASCAL]->id = GEANY_FILETYPES_PASCAL;
+	filetypes[GEANY_FILETYPES_PASCAL]->lang = 4;
 	filetypes[GEANY_FILETYPES_PASCAL]->name = g_strdup("Pascal");
 	filetypes[GEANY_FILETYPES_PASCAL]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_PASCAL]->title = g_strdup(_("Pascal source file"));
@@ -238,6 +249,7 @@
 #define SH
 	filetypes[GEANY_FILETYPES_SH] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_SH]->id = GEANY_FILETYPES_SH;
+	filetypes[GEANY_FILETYPES_SH]->lang = 16;
 	filetypes[GEANY_FILETYPES_SH]->name = g_strdup("Sh");
 	filetypes[GEANY_FILETYPES_SH]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_SH]->title = g_strdup(_("Shell script file"));
@@ -260,6 +272,7 @@
 #define MAKE
 	filetypes[GEANY_FILETYPES_MAKE] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_MAKE]->id = GEANY_FILETYPES_MAKE;
+	filetypes[GEANY_FILETYPES_MAKE]->lang = 3;
 	filetypes[GEANY_FILETYPES_MAKE]->name = g_strdup("Make");
 	filetypes[GEANY_FILETYPES_MAKE]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_MAKE]->title = g_strdup(_("Makefile"));
@@ -277,6 +290,7 @@
 #define CSS
 	filetypes[GEANY_FILETYPES_CSS] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_CSS]->id = GEANY_FILETYPES_CSS;
+	filetypes[GEANY_FILETYPES_CSS]->lang = 13;
 	filetypes[GEANY_FILETYPES_CSS]->name = g_strdup("CSS");
 	filetypes[GEANY_FILETYPES_CSS]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_CSS]->title = g_strdup(_("Cascading StyleSheet"));
@@ -293,6 +307,7 @@
 #define CONF
 	filetypes[GEANY_FILETYPES_CONF] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_CONF]->id = GEANY_FILETYPES_CONF;
+	filetypes[GEANY_FILETYPES_CONF]->lang = 10;
 	filetypes[GEANY_FILETYPES_CONF]->name = g_strdup("Conf");
 	filetypes[GEANY_FILETYPES_CONF]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_CONF]->title = g_strdup(_("Config file"));
@@ -312,8 +327,9 @@
 #define ASM
 	filetypes[GEANY_FILETYPES_ASM] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_ASM]->id = GEANY_FILETYPES_ASM;
+	filetypes[GEANY_FILETYPES_ASM]->lang = 9;
 	filetypes[GEANY_FILETYPES_ASM]->name = g_strdup("ASM");
-	filetypes[GEANY_FILETYPES_ASM]->has_tags = FALSE;
+	filetypes[GEANY_FILETYPES_ASM]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_ASM]->title = g_strdup(_("Assembler source file"));
 	filetypes[GEANY_FILETYPES_ASM]->extension = g_strdup("asm");
 	filetypes[GEANY_FILETYPES_ASM]->pattern = g_new0(gchar*, 2);
@@ -328,6 +344,7 @@
 #define SQL
 	filetypes[GEANY_FILETYPES_SQL] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_SQL]->id = GEANY_FILETYPES_SQL;
+	filetypes[GEANY_FILETYPES_SQL]->lang = 11;
 	filetypes[GEANY_FILETYPES_SQL]->name = g_strdup("SQL");
 	filetypes[GEANY_FILETYPES_SQL]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_SQL]->title = g_strdup(_("SQL Dump file"));
@@ -344,6 +361,7 @@
 #define CAML
 	filetypes[GEANY_FILETYPES_CAML] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_CAML]->id = GEANY_FILETYPES_CAML;
+	filetypes[GEANY_FILETYPES_CAML]->lang = -2;
 	filetypes[GEANY_FILETYPES_CAML]->name = g_strdup("CAML");
 	filetypes[GEANY_FILETYPES_CAML]->has_tags = FALSE;
 	filetypes[GEANY_FILETYPES_CAML]->title = g_strdup(_("(O)Caml source file"));
@@ -361,6 +379,7 @@
 #define OMS
 	filetypes[GEANY_FILETYPES_OMS] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_OMS]->id = GEANY_FILETYPES_OMS;
+	filetypes[GEANY_FILETYPES_OMS]->lang = -2;
 	filetypes[GEANY_FILETYPES_OMS]->name = g_strdup("O-Matrix");
 	filetypes[GEANY_FILETYPES_OMS]->has_tags = FALSE;
 	filetypes[GEANY_FILETYPES_OMS]->title = g_strdup(_("O-Matrix source file"));
@@ -377,6 +396,7 @@
 #define RUBY
 	filetypes[GEANY_FILETYPES_RUBY] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_RUBY]->id = GEANY_FILETYPES_RUBY;
+	filetypes[GEANY_FILETYPES_RUBY]->lang = 14;
 	filetypes[GEANY_FILETYPES_RUBY]->name = g_strdup("Ruby");
 	filetypes[GEANY_FILETYPES_RUBY]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_RUBY]->title = g_strdup(_("Ruby source file"));
@@ -395,6 +415,7 @@
 #define TCL
 	filetypes[GEANY_FILETYPES_TCL] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_TCL]->id = GEANY_FILETYPES_TCL;
+	filetypes[GEANY_FILETYPES_TCL]->lang = 15;
 	filetypes[GEANY_FILETYPES_TCL]->name = g_strdup("Tcl");
 	filetypes[GEANY_FILETYPES_TCL]->has_tags = TRUE;
 	filetypes[GEANY_FILETYPES_TCL]->title = g_strdup(_("Tcl source file"));
@@ -414,6 +435,7 @@
 	filetypes[GEANY_FILETYPES_ALL] = g_new0(filetype, 1);
 	filetypes[GEANY_FILETYPES_ALL]->id = GEANY_FILETYPES_ALL;
 	filetypes[GEANY_FILETYPES_ALL]->name = g_strdup("None");
+	filetypes[GEANY_FILETYPES_ALL]->lang = -2;
 	filetypes[GEANY_FILETYPES_ALL]->has_tags = FALSE;
 	filetypes[GEANY_FILETYPES_ALL]->title = g_strdup(_("All files"));
 	filetypes[GEANY_FILETYPES_ALL]->extension = g_strdup("*");

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/filetypes.h	2006-06-24 14:36:35 UTC (rev 474)
@@ -73,6 +73,8 @@
 typedef struct filetype
 {
 	guint	 		  id;
+	langType 		  lang;				// represents the langType of tagmanager(see the table
+										// in tagmanager/parsers.h), -1 represents all, -2 none
 	gchar	 		 *name;				// will be used as name for tagmanager
 	gboolean 		  has_tags;			// indicates whether there is a tag parser for it or not
 	gchar	 		 *title;			// will be shown in the file open dialog

Modified: trunk/src/geany.h
===================================================================
--- trunk/src/geany.h	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/geany.h	2006-06-24 14:36:35 UTC (rev 474)
@@ -65,7 +65,7 @@
 #define GEANY_SESSION_FILES				25
 #define GEANY_MAX_TAGS_COUNT			1000
 #define GEANY_CHECK_FILE_DELAY			30
-#define GEANY_WORDCHARS					"_#&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+#define GEANY_WORDCHARS					"_#&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\\"
 #define GEANY_MAX_WORD_LENGTH			192
 #define GEANY_MAX_AUTOCOMPLETE_WORDS	30
 #define GEANY_STRING_UNTITLED			_("untitled")
@@ -263,9 +263,6 @@
 	GIGABYTE = (MEGABYTE*1024)
 };
 
-// prototype from tagmanager/parse.h, used in document.c, ugly but it works
-extern langType getNamedLanguage(const char *const name);
-
 // implementation in main.c
 void geany_debug(gchar const *format, ...);
 

Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/sci_cb.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -182,6 +182,7 @@
 				case '{':
 				{	// Tex auto-closing
 					sci_cb_auto_close_bracket(sci, pos, nt->ch);	// Tex auto-closing
+					sci_cb_show_calltip(sci, pos);
 					break;
 				}
 				case '}':
@@ -365,24 +366,26 @@
 	gint lexer = SSM(sci, SCI_GETLEXER, 0, 0);
 	gint style;
 	gchar word[GEANY_MAX_WORD_LENGTH];
+	gint idx = document_find_by_sci(sci);
 	const GPtrArray *tags;
 
 	word[0] = '\0';
 	if (pos == -1)
 	{	// position of '(' is unknown, so go backwards to find it
 		pos = SSM(sci, SCI_GETCURRENTPOS, 0, 0);
-		while (pos >= 0 && SSM(sci, SCI_GETCHARAT, pos, 0) != '(') pos--;
+		// I'm not sure if utils_isbrace() is a good idea, but it is the simplest way, but we need
+		// something more intelligent than only check for '(' because e.g. LaTeX uses {, [ or (
+		while (pos >= 0 && ! utils_isbrace(SSM(sci, SCI_GETCHARAT, pos, 0))) pos--;
 	}
 
 	style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
-	if (lexer != SCLEX_CPP) return FALSE;
 	if (lexer == SCLEX_CPP && (style == SCE_C_COMMENT ||
 			style == SCE_C_COMMENTLINE || style == SCE_C_COMMENTDOC)) return FALSE;
 
 	utils_find_current_word(sci, pos - 1, word, sizeof word);
 	if (word[0] == '\0') return FALSE;
 
-	tags = tm_workspace_find(word, tm_tag_max_t, NULL, FALSE);
+	tags = tm_workspace_find(word, tm_tag_max_t, NULL, FALSE, doc_list[idx].file_type->lang);
 	if (tags->len == 1 && TM_TAG(tags->pdata[0])->atts.entry.arglist)
 	{
 		SSM(sci, SCI_CALLTIPSHOW, pos, (sptr_t) TM_TAG(tags->pdata[0])->atts.entry.arglist);
@@ -439,25 +442,27 @@
 		g_strfreev(ents);
 	}
 	else
-	{	// C and C++ tag autocompletion
+	{	// PHP, LaTeX, C and C++ tag autocompletion
 		gint i = 0;
+		gint idx = document_find_by_sci(sci);
+		TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
 
 		while ((line_pos - i >= 0) && ! g_ascii_isspace(linebuf[line_pos - i])) i++;
 		if (i < 4) return FALSE;	// go home if typed less than 4 chars
 
-		tags = tm_workspace_find(root, tm_tag_max_t, NULL, TRUE);
+		tags = tm_workspace_find(root, tm_tag_max_t, attrs, TRUE, doc_list[idx].file_type->lang);
 		if (NULL != tags && tags->len > 0)
 		{
 			GString *words = g_string_sized_new(150);
-			TMTag *tag;
 			guint j;
+
 			for (j = 0; ((j < tags->len) && (j < GEANY_MAX_AUTOCOMPLETE_WORDS)); ++j)
 			{
-				tag = (TMTag *) tags->pdata[j];
 				if (j > 0) g_string_append_c(words, ' ');
-				g_string_append(words, tag->name);
+				g_string_append(words, ((TMTag *) tags->pdata[j])->name);
 			}
 			SSM(sci, SCI_AUTOCSHOW, rootlen, (sptr_t) words->str);
+			//geany_debug("string size: %d", words->len);
 			g_string_free(words, TRUE);
 		}
 	}

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/src/utils.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -308,19 +308,18 @@
 			case '>':	return TRUE;
 		}
 	}
-	else
+
+	switch (c)
 	{
-		switch (c)
-		{
-			case '(':
-			case ')':
-			case '{':
-			case '}':
-			case '[':
-			case ']':	return TRUE;
-			default:	return FALSE;
-		}
+		case '(':
+		case ')':
+		case '{':
+		case '}':
+		case '[':
+		case ']':	return TRUE;
+		default:	return FALSE;
 	}
+
 	return FALSE;
 }
 
@@ -1827,16 +1826,24 @@
 		"iterator", "functional", "string", "complex", "valarray", NULL
 	};
 	
-	blank = gtk_menu_item_new_with_label(_("(blank)"));
+	blank = gtk_menu_item_new_with_label("#include \"...\"");
 	gtk_container_add(GTK_CONTAINER(menu_edit), blank);
 	gtk_widget_show(blank);
 	g_signal_connect((gpointer) blank, "activate", G_CALLBACK(on_insert_include_activate),
 																	(gpointer) "blank");
-	blank = gtk_menu_item_new_with_label(_("(blank)"));
+	blank = gtk_separator_menu_item_new ();
+	gtk_container_add(GTK_CONTAINER(menu_edit), blank);
+	gtk_widget_show(blank);
+
+	blank = gtk_menu_item_new_with_label("#include \"...\"");
 	gtk_container_add(GTK_CONTAINER(menu_popup), blank);
 	gtk_widget_show(blank);
 	g_signal_connect((gpointer) blank, "activate", G_CALLBACK(on_insert_include_activate),
 																	(gpointer) "blank");
+	blank = gtk_separator_menu_item_new ();
+	gtk_container_add(GTK_CONTAINER(menu_popup), blank);
+	gtk_widget_show(blank);
+
 	insert_items(menu_edit, menu_popup, (gchar**) c_includes_stdlib, _("C Standard Library"));
 	insert_items(menu_edit, menu_popup, (gchar**) c_includes_c99, _("ISO C99"));
 	insert_items(menu_edit, menu_popup, (gchar**) c_includes_cpp, _("C++ (C Standard Library)"));

Modified: trunk/tagmanager/options.c
===================================================================
--- trunk/tagmanager/options.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/tagmanager/options.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -24,20 +24,11 @@
 #include "options.h"
 #include "parse.h"
 
-/*
-*   MACROS
-*/
-#define INVOCATION  "Usage: %s [options] [file(s)]\n"
 
 #define CTAGS_ENVIRONMENT	"CTAGS"
-#define ETAGS_ENVIRONMENT	"ETAGS"
 
 #define CTAGS_FILE	"tags"
-#define ETAGS_FILE	"TAGS"
 
-#ifndef ETAGS
-# define ETAGS	"etags"		/* name which causes default use of to -e */
-#endif
 
 /*  The following separators are permitted for list options.
  */
@@ -56,44 +47,12 @@
 
 #define isCompoundOption(c)	(boolean) (strchr ("fohiILpDb", (c)) != NULL)
 
-/*
-*   Data declarations
-*/
 
-enum eOptionLimits {
-    MaxHeaderExtensions	= 100,	/* maximum number of extensions in -h option */
-    MaxSupportedTagFormat = 2
-};
 
-typedef struct sOptionDescription {
-    int usedByEtags;
-    const char *const description;
-} optionDescription;
-
-typedef void (*parametricOptionHandler) (const char *const option, const char *const parameter);
-
-typedef const struct {
-    const char* name;		/* name of option as specified by user */
-    parametricOptionHandler handler;	/* routine to handle option */
-    boolean initOnly;		/* option must be specified before any files */
-} parametricOption;
-
-typedef const struct {
-    const char* name;		/* name of option as specified by user */
-    boolean* pValue;		/* pointer to option value */
-    boolean initOnly;		/* option must be specified before any files */
-} booleanOption;
-
 /*
 *   DATA DEFINITIONS
 */
 
-static boolean ParsedLeadingOptions = FALSE;
-
-static const char *const HeaderExtensions [] = {
-    "h", "H", "hh", "hpp", "hxx", "h++", "inc", "def", NULL
-};
-
 optionValues Option = {
     {
 	FALSE,		/* --extra=f */
@@ -130,7 +89,6 @@
     NULL,		/* -L */
     NULL,		/* -o */
     NULL,		/* -h */
-    NULL,		/* --etags-include */
     DEFAULT_FILE_FORMAT,/* --format */
     FALSE,		/* --if0 */
     FALSE,		/* --kind-long */
@@ -143,117 +101,13 @@
     FALSE,		/* --totals */
     FALSE,		/* --line-directives */
 	FALSE,
-#ifdef TM_DEBUG
-    0, 0		/* -D, -b */
-#endif
 };
 
-/*
--   Locally used only
-*/
 
-static optionDescription LongOptionDescription [] = {
- {1,"  --version"},
- {1,"       Print version identifier to standard output."},
- {1, NULL}
-};
-
-static const char* const License =
-"This program is free software; you can redistribute it and/or\n\
-modify it under the terms of the GNU General Public License\n\
-as published by the Free Software Foundation; either version 2\n\
-of the License, or (at your option) any later version.\n\
-\n\
-This program is distributed in the hope that it will be useful,\n\
-but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
-GNU General Public License for more details.\n\
-\n\
-You should have received a copy of the GNU General Public License\n\
-along with this program; if not, write to the Free Software\n\
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n";
-
-/*  Contains a set of strings describing the set of "features" compiled into
- *  the code.
- */
-static const char *const Features [] = {
-#ifdef WIN32
-    "win32",
-#endif
-#ifdef DJGPP
-    "msdos_32",
-#else
-# ifdef MSDOS
-    "msdos_16",
-# endif
-#endif
-#ifdef OS2
-    "os2",
-#endif
-#ifdef AMIGA
-    "amiga",
-#endif
-#ifdef VMS
-    "vms",
-#endif
-#ifdef HAVE_FNMATCH
-    "wildcards",
-#endif
-#ifdef HAVE_REGEX
-    "regex",
-#endif
-#ifndef EXTERNAL_SORT
-    "internal-sort",
-#endif
-#ifdef CUSTOM_CONFIGURATION_FILE
-    "custom-conf",
-#endif
-#if (defined (MSDOS) || defined (WIN32) || defined (OS2)) && defined (UNIX_PATH_SEPARATOR)
-    "unix-path-separator",
-#endif
-#ifdef TM_DEBUG
-    "debug",
-#endif
-    NULL
-};
-
-/*
-*   FUNCTION PROTOTYPES
-*/
-static boolean parseFileOptions (const char *const fileName);
-
-/*
-*   FUNCTION DEFINITIONS
-*/
-
 extern void verbose (const char *const format, ...)
 {
-    if (Option.verbose)
-    {
-	va_list ap;
-	va_start (ap, format);
-	vprintf (format, ap);
-	va_end (ap);
-    }
 }
 
-static char *stringCopy (const char *const string)
-{
-    char* result = NULL;
-    if (string != NULL)
-	result = eStrdup (string);
-    return result;
-}
-
-static void freeString (char **const pString)
-{
-    if (*pString != NULL)
-    {
-	eFree (*pString);
-	*pString = NULL;
-    }
-}
-
 extern void freeList (stringList** const pList)
 {
     if (*pList != NULL)
@@ -265,306 +119,17 @@
 
 extern void setDefaultTagFileName (void)
 {
-    if (Option.tagFileName != NULL)
-	;		/* accept given name */
-    else if (Option.etags)
-	Option.tagFileName = stringCopy (ETAGS_FILE);
-    else
-	Option.tagFileName = stringCopy (CTAGS_FILE);
+	Option.tagFileName = eStrdup (CTAGS_FILE);
 }
 
-extern void checkOptions (void)
-{
-    const char* notice;
-    if (Option.xref)
-    {
-	notice = "xref output";
-	if (Option.include.fileNames)
-	{
-	    error (WARNING, "%s disables file name tags", notice);
-	    Option.include.fileNames = FALSE;
-	}
-    }
-    if (Option.append)
-    {
-	notice = "append mode is not compatible with";
-	if (isDestinationStdout ())
-	    error (FATAL, "%s tags to stdout", notice);
-    }
-    if (Option.filter)
-    {
-	notice = "filter mode";
-	if (Option.printTotals)
-	{
-	    error (WARNING, "%s disables totals", notice);
-	    Option.printTotals = FALSE;
-	}
-	if (Option.tagFileName != NULL)
-	    error (WARNING, "%s ignores output tag file name", notice);
-    }
-#ifdef UPDATE_ENABLED
-    if (Option.update)
-    {
-	notice = "update option is not compatible with";
-	if (Option.etags)
-	    error (FATAL, "%s emacs-style tags", notice);
-	if (Option.filter)
-	    error (FATAL, "%s filter option", notice);
-	if (isDestinationStdout ())
-	    error (FATAL, "%s tags to stdout", notice);
-	Option.append = TRUE;
-    }
-#endif
-}
-
-static void setEtagsMode (void)
-{
-    Option.etags = TRUE;
-    Option.sorted = FALSE;
-    Option.lineDirectives = FALSE;
-    Option.tagRelative = TRUE;
-}
-
-extern void testEtagsInvocation (void)
-{
-    char* const execName = eStrdup (getExecutableName ());
-    char* const etags = eStrdup (ETAGS);
-#ifdef CASE_INSENSITIVE_FILENAMES
-    toLowerString (execName);
-    toLowerString (etags);
-#endif
-    if (strstr (execName, etags) != NULL)
-    {
-	verbose ("Running in etags mode\n");
-	setEtagsMode ();
-    }
-}
-
 /*
- *  Cooked argument parsing
- */
-
-static void parseShortOption (cookedArgs *const args)
-{
-    args->simple [0] = *args->shortOptions++;
-    args->simple [1] = '\0';
-    args->item = args->simple;
-    if (! isCompoundOption (*args->simple))
-	args->parameter = "";
-    else if (*args->shortOptions == '\0')
-    {
-	argForth (args->args);
-	if (argOff (args->args))
-	    args->parameter = NULL;
-	else
-	    args->parameter = argItem (args->args);
-	args->shortOptions = NULL;
-    }
-    else
-    {
-	args->parameter = args->shortOptions;
-	args->shortOptions = NULL;
-    }
-}
-
-static void parseLongOption (cookedArgs *const args, const char *item)
-{
-    const char* const equal = strchr (item, '=');
-    if (equal == NULL)
-    {
-	args->item = eStrdup (item);
-	args->parameter = "";
-    }
-    else
-    {
-	const size_t length = equal - item;
-	args->item = xMalloc (length + 1, char);
-	strncpy (args->item, item, length);
-	args->item [length] = '\0';
-	args->parameter = equal + 1;
-    }
-}
-
-static void cArgRead (cookedArgs *const current)
-{
-    char* item;
-
-    Assert (current != NULL);
-    if (! argOff (current->args))
-    {
-	item = argItem (current->args);
-	current->shortOptions = NULL;
-	Assert (item != NULL);
-	if (strncmp (item, "--", (size_t) 2) == 0)
-	{
-	    current->isOption = TRUE;
-	    current->longOption = TRUE;
-	    parseLongOption (current, item + 2);
-	}
-	else if (*item == '-')
-	{
-	    current->isOption = TRUE;
-	    current->longOption = FALSE;
-	    current->shortOptions = item + 1;
-	    parseShortOption (current);
-	}
-	else
-	{
-	    current->isOption = FALSE;
-	    current->longOption = FALSE;
-	    current->item = item;
-	    current->parameter = "";
-	}
-    }
-}
-
-extern cookedArgs* cArgNewFromString (const char* string)
-{
-    cookedArgs* const result = xMalloc (1, cookedArgs);
-    memset (result, 0, sizeof (cookedArgs));
-    result->args = argNewFromString (string);
-    cArgRead (result);
-    return result;
-}
-
-extern cookedArgs* cArgNewFromArgv (char* const* const argv)
-{
-    cookedArgs* const result = xMalloc (1, cookedArgs);
-    memset (result, 0, sizeof (cookedArgs));
-    result->args = argNewFromArgv (argv);
-    cArgRead (result);
-    return result;
-}
-
-extern cookedArgs* cArgNewFromFile (FILE* const fp)
-{
-    cookedArgs* const result = xMalloc (1, cookedArgs);
-    memset (result, 0, sizeof (cookedArgs));
-    result->args = argNewFromFile (fp);
-    cArgRead (result);
-    return result;
-}
-
-extern cookedArgs* cArgNewFromLineFile (FILE* const fp)
-{
-    cookedArgs* const result = xMalloc (1, cookedArgs);
-    memset (result, 0, sizeof (cookedArgs));
-    result->args = argNewFromLineFile (fp);
-    cArgRead (result);
-    return result;
-}
-
-extern void cArgDelete (cookedArgs* const current)
-{
-    Assert (current != NULL);
-    argDelete (current->args);
-    memset (current, 0, sizeof (cookedArgs));
-    eFree (current);
-}
-
-static boolean cArgOptionPending (cookedArgs* const current)
-{
-    boolean result = FALSE;
-    if (current->shortOptions != NULL)
-	if (*current->shortOptions != '\0')
-	    result = TRUE;
-    return result;
-}
-
-extern boolean cArgOff (cookedArgs* const current)
-{
-    Assert (current != NULL);
-    return (boolean) (argOff (current->args) && ! cArgOptionPending (current));
-}
-
-extern boolean cArgIsOption (cookedArgs* const current)
-{
-    Assert (current != NULL);
-    return current->isOption;
-}
-
-extern const char* cArgItem (cookedArgs* const current)
-{
-    Assert (current != NULL);
-    return current->item;
-}
-
-extern void cArgForth (cookedArgs* const current)
-{
-    Assert (current != NULL);
-    Assert (! cArgOff (current));
-    if (cArgOptionPending (current))
-	parseShortOption (current);
-    else
-    {
-	Assert (! argOff (current->args));
-	argForth (current->args);
-	if (! argOff (current->args))
-	    cArgRead (current);
-	else
-	{
-	    current->isOption = FALSE;
-	    current->longOption = FALSE;
-	    current->shortOptions = NULL;
-	    current->item = NULL;
-	    current->parameter = NULL;
-	}
-    }
-}
-
-/*
  *  File extension and language mapping
  */
-
-static void addExtensionList (stringList *const slist,
-			      const char *const elist, const boolean clear)
-{
-    char *const extensionList = eStrdup (elist);
-    const char *extension = NULL;
-    boolean first = TRUE;
-
-    if (clear)
-    {
-	verbose ("      clearing\n");
-	stringListClear (slist);
-    }
-    verbose ("      adding: ");
-    if (elist != NULL  &&  *elist != '\0')
-    {
-	extension = extensionList;
-	if (elist [0] == EXTENSION_SEPARATOR)
-	    ++extension;
-    }
-    while (extension != NULL)
-    {
-	char *separator = strchr (extension, EXTENSION_SEPARATOR);
-	if (separator != NULL)
-	    *separator = '\0';
-	verbose ("%s%s", first ? "" : ", ",
-		*extension == '\0' ? "(NONE)" : extension);
-	stringListAdd (slist, vStringNewInit (extension));
-	first = FALSE;
-	if (separator == NULL)
-	    extension = NULL;
-	else
-	    extension = separator + 1;
-    }
-    if (Option.verbose)
-    {
-	printf ("\n      now: ");
-	stringListPrint (slist);
-	putchar ('\n');
-    }
-    eFree (extensionList);
-}
-
 extern const char *fileExtension (const char *const fileName)
 {
     const char *extension;
     const char *pDelimiter = NULL;
-#ifdef QDOS
-    pDelimiter = strrchr (fileName, '_');
-#endif
+
     if (pDelimiter == NULL)
         pDelimiter = strrchr (fileName, '.');
 
@@ -582,330 +147,19 @@
  */
 extern boolean isIncludeFile (const char *const fileName)
 {
-    boolean result = FALSE;
-    const char *const extension = fileExtension (fileName);
-    if (Option.headerExt != NULL)
-	result = stringListExtensionMatched (Option.headerExt, extension);
-    return result;
+    return FALSE;
 }
 
-static void processLanguageForceOption (const char *const option,
-					const char *const parameter)
-{
-    langType language;
-    if (stricmp (parameter, "auto") == 0)
-	language = LANG_AUTO;
-    else
-	language = getNamedLanguage (parameter);
 
-    if (strcmp (option, "lang") == 0  ||  strcmp (option, "language") == 0)
-	error (WARNING,
-	       "\"--%s\" option is obsolete; use \"--language-force\" instead",
-	       option);
-    if (language == LANG_IGNORE)
-	error (FATAL, "Uknown language specified in \"%s\" option", option);
-    else
-	Option.language = language;
-}
-
-static char* skipPastMap (char* p)
-{
-    while (*p != EXTENSION_SEPARATOR  &&
-	    *p != PATTERN_START  &&  *p != ','  &&  *p != '\0')
-	++p;
-    return p;
-}
-
-/* Parses the mapping beginning at `map', adds it to the language map, and
- * returns first character past the map.
- */
-static char* addLanguageMap (const langType language, char* map)
-{
-    char* p = NULL;
-    const char first = *map;
-    if (first == EXTENSION_SEPARATOR)	    /* extension map */
-    {
-	++map;
-	p = skipPastMap (map);
-	if (*p == '\0')
-	{
-	    verbose (" .%s", map);
-	    addLanguageExtensionMap (language, map);
-	    p = map + strlen (map);
-	}
-	else
-	{
-	    const char separator = *p;
-	    *p = '\0';
-	    verbose (" .%s", map);
-	    addLanguageExtensionMap (language, map);
-	    *p = separator;
-	}
-    }
-    else if (first == PATTERN_START)	    /* pattern map */
-    {
-	++map;
-	for (p = map  ;  *p != PATTERN_STOP  &&  *p != '\0'  ;  ++p)
-	{
-	    if (*p == '\\'  &&  *(p + 1) == PATTERN_STOP)
-		++p;
-	}
-	if (*p == '\0')
-	    error (FATAL, "Unterminated file name pattern for %s language",
-	       getLanguageName (language));
-	else
-	{
-	    *p++ = '\0';
-	    verbose (" (%s)", map);
-	    addLanguagePatternMap (language, map);
-	}
-    }
-    else
-	error (FATAL, "Badly formed language map for %s language",
-		getLanguageName (language));
-    return p;
-}
-
-static char* processLanguageMap (char* map)
-{
-    char* const separator = strchr (map, ':');
-    char* result = NULL;
-    if (separator != NULL)
-    {
-	langType language;
-	char *list = separator + 1;
-	boolean clear = FALSE;
-	*separator = '\0';
-	language = getNamedLanguage (map);
-	if (language != LANG_IGNORE)
-	{
-	    char* p;
-	    if (*list == '+')
-		++list;
-	    else
-		clear = TRUE;
-	    for (p = list  ;  *p != ','  &&  *p != '\0'  ;  ++p) /*no-op*/ ;
-	    if (strnicmp (list, "default", p - list) == 0)
-	    {
-		verbose ("    Restoring default %s language map: ", getLanguageName (language));
-		installLanguageMapDefault (language);
-		list = p;
-	    }
-	    else
-	    {
-		if (clear)
-		{
-		    verbose ("    Setting %s language map:", getLanguageName (language));
-		    clearLanguageMap (language);
-		}
-		else
-		    verbose ("    Adding to %s language map:", getLanguageName (language));
-		while (list != NULL  &&  *list != '\0'  &&  *list != ',')
-		    list = addLanguageMap (language, list);
-		verbose ("\n");
-	    }
-	    if (list != NULL  &&  *list == ',')
-		++list;
-	    result = list;
-	}
-    }
-    return result;
-}
-
-static void processLanguageMapOption (const char *const option,
-				      const char *const parameter)
-{
-    char *const maps = eStrdup (parameter);
-    char *map = maps;
-
-    if (strcmp (parameter, "default") == 0)
-    {
-	verbose ("    Restoring default language maps:\n");
-	installLanguageMapDefaults ();
-    }
-    else while (map != NULL  &&  *map != '\0')
-    {
-	char* const next = processLanguageMap (map);
-	if (next == NULL)
-	    error (WARNING, "Unknown language specified in \"%s\" option", option);
-	map = next;
-    }
-    eFree (maps);
-}
-
-static void processLanguageListOption (const char *const option,
-				       const char *const parameter)
-{
-    char *const langs = eStrdup (parameter);
-    enum { Add, Remove, Replace } mode = Replace;
-    boolean first = TRUE;
-    char *lang = langs;
-    const char* prefix = "";
-    verbose ("    Enabled languages: ");
-    while (lang != NULL)
-    {
-	char *const end = strchr (lang, ',');
-	if (lang [0] == '+')
-	{
-	    ++lang;
-	    mode = Add;
-	    prefix = "+ ";
-	}
-	else if (lang [0] == '-')
-	{
-	    ++lang;
-	    mode = Remove;
-	    prefix = "- ";
-	}
-	if (mode == Replace)
-	    enableLanguages (FALSE);
-	if (end != NULL)
-	    *end = '\0';
-	if (lang [0] != '\0')
-	{
-	    if (strcmp (lang, "all") == 0)
-		enableLanguages ((boolean) (mode != Remove));
-	    else
-	    {
-		const langType language = getNamedLanguage (lang);
-		if (language == LANG_IGNORE)
-		    error (WARNING, "Unknown language specified in \"%s\" option", option);
-		else
-		    enableLanguage (language, (boolean) (mode != Remove));
-	    }
-	    verbose ("%s%s%s", (first ? "" : ", "), prefix, lang);
-	    prefix = "";
-	    first = FALSE;
-	    if (mode == Replace)
-		mode = Add;
-	}
-	lang = (end != NULL ? end + 1 : NULL);
-    }
-    verbose ("\n");
-    eFree (langs);
-}
-
-static void processOptionFile (const char *const option,
-			       const char *const parameter)
-{
-    if (parameter == NULL  ||  parameter [0] == '\0')
-	error (WARNING, "no option file supplied for \"%s\"", option);
-    else if (! parseFileOptions (parameter))
-	error (FATAL | PERROR, "cannot open option file \"%s\"", parameter);
-}
-
-static void installHeaderListDefaults (void)
-{
-    Option.headerExt = stringListNewFromArgv (HeaderExtensions);
-    if (Option.verbose)
-    {
-	printf ("    Setting default header extensions: ");
-	stringListPrint (Option.headerExt);
-	putchar ('\n');
-    }
-}
-
-static void processHeaderListOption (const int option, const char *parameter)
-{
-    /*  Check to make sure that the user did not enter "ctags -h *.c"
-     *  by testing to see if the list is a filename that exists.
-     */
-    if (doesFileExist (parameter))
-	error (FATAL, "-%c: Invalid list", option);
-    if (strcmp (parameter, "default") == 0)
-	installHeaderListDefaults ();
-    else
-    {
-	boolean clear = TRUE;
-
-	if (parameter [0] == '+')
-	{
-	    ++parameter;
-	    clear = FALSE;
-	}
-	if (Option.headerExt == NULL)
-	    Option.headerExt = stringListNew ();
-	verbose ("    Header Extensions:\n");
-	addExtensionList (Option.headerExt, parameter, clear);
-    }
-}
-
-/*
- *  Token ignore processing
- */
-
 /*  Determines whether or not "name" should be ignored, per the ignore list.
  */
 extern boolean isIgnoreToken (const char *const name,
 			      boolean *const pIgnoreParens,
 			      const char **const replacement)
 {
-    boolean result = FALSE;
-
-    if (Option.ignore != NULL)
-    {
-	const size_t nameLen = strlen (name);
-	unsigned int i;
-
-	if (pIgnoreParens != NULL)
-	    *pIgnoreParens = FALSE;
-
-	for (i = 0  ;  i < stringListCount (Option.ignore)  ;  ++i)
-	{
-	    vString *token = stringListItem (Option.ignore, i);
-
-	    if (strncmp (vStringValue (token), name, nameLen) == 0)
-	    {
-		const size_t tokenLen = vStringLength (token);
-
-		if (nameLen == tokenLen)
-		{
-		    result = TRUE;
-		    break;
-		}
-		else if (tokenLen == nameLen + 1  &&
-			vStringChar (token, tokenLen - 1) == '+')
-		{
-		    result = TRUE;
-		    if (pIgnoreParens != NULL)
-			*pIgnoreParens = TRUE;
-		    break;
-		}
-		else if (vStringChar (token, nameLen) == '=')
-		{
-		    if (replacement != NULL)
-			*replacement = vStringValue (token) + nameLen + 1;
-		    break;
-		}
-	    }
-	}
-    }
-    return result;
+    return FALSE;
 }
 
-static void saveIgnoreToken (vString *const ignoreToken)
-{
-    if (Option.ignore == NULL)
-	Option.ignore = stringListNew ();
-    stringListAdd (Option.ignore, ignoreToken);
-    verbose ("    ignore token: %s\n", vStringValue (ignoreToken));
-}
-
-static void readIgnoreList (const char *const list)
-{
-    char* newList = stringCopy (list);
-    const char *token = strtok (newList, IGNORE_SEPARATORS);
-
-    while (token != NULL)
-    {
-	vString *const entry = vStringNewInit (token);
-
-	saveIgnoreToken (entry);
-	token = strtok (NULL, IGNORE_SEPARATORS);
-    }
-    eFree (newList);
-}
-
 void addIgnoreListFromFile (const char *const fileName)
 {
     stringList* tokens = stringListNewFromFile (fileName);
@@ -915,569 +169,13 @@
 	stringListCombine (Option.ignore, tokens);
 }
 
-static void processIgnoreOption (const char *const list)
-{
-    if (strchr ("@./\\", list [0]) != NULL)
-    {
-	const char* fileName = (*list == '@') ? list + 1 : list;
-	addIgnoreListFromFile (fileName);
-    }
-#if defined (MSDOS) || defined (WIN32) || defined (OS2)
-    else if (isalpha (list [0])  &&  list [1] == ':')
-	addIgnoreListFromFile (list);
-#endif
-    else if (strcmp (list, "-") == 0)
-    {
-	freeList (&Option.ignore);
-	verbose ("    clearing list\n");
-    }
-    else
-	readIgnoreList (list);
-}
 
-/*
- *  Specific option processing
- */
 
-static void printfFeatureList (void)
-{
-    int i;
-
-    for (i = 0 ; Features [i] != NULL ; ++i)
-    {
-	if (i == 0)
-	    printf ("  Optional compiled features: ");
-	printf ("%s+%s", (i>0 ? ", " : ""), Features [i]);
-#ifdef CUSTOM_CONFIGURATION_FILE
-	if (strcmp (Features [i], "custom-conf") == 0)
-	    printf ("=%s", CUSTOM_CONFIGURATION_FILE);
-#endif
-    }
-    if (i > 0)
-	putchar ('\n');
-}
-
-static void printProgramIdentification (void)
-{
-    printf ("%s %s, Copyright (C) 1996-2001 %s\n",
-	    PROGRAM_NAME, PROGRAM_VERSION, AUTHOR_NAME);
-    printf ("  Addresses: <%s>, %s\n", AUTHOR_EMAIL, PROGRAM_URL);
-    printfFeatureList ();
-}
-
-static void printInvocationDescription (void)
-{
-    printf (INVOCATION, getExecutableName ());
-}
-
-static void printOptionDescriptions (const optionDescription *const optDesc)
-{
-    int i;
-    for (i = 0 ; optDesc [i].description != NULL ; ++i)
-    {
-	if (! Option.etags || optDesc [i].usedByEtags)
-	    puts (optDesc [i].description);
-    }
-}
-
-static void printHelp (const optionDescription *const optDesc)
-{
-
-    printProgramIdentification ();
-    putchar ('\n');
-    printInvocationDescription ();
-    putchar ('\n');
-    printOptionDescriptions (optDesc);
-}
-
-static void processExcmdOption (const char *const option,
-				const char *const parameter)
-{
-    switch (*parameter)
-    {
-	case 'm': Option.locate = EX_MIX;	break;
-	case 'n': Option.locate = EX_LINENUM;	break;
-	case 'p': Option.locate = EX_PATTERN;	break;
-	default:
-	    error (FATAL, "Invalid value for \"%s\" option", option);
-	    break;
-    }
-}
-
-static void processFormatOption (const char *const option,
-				 const char *const parameter)
-{
-    unsigned int format;
-
-    if (sscanf (parameter, "%u", &format) < 1)
-	error (FATAL, "Invalid value for \"%s\" option",option);
-    else if (format <= (unsigned int) MaxSupportedTagFormat)
-	Option.tagFileFormat = format;
-    else
-	error (FATAL, "Unsupported value for \"%s\" option", option);
-}
-
-static void processEtagsInclude (const char *const __unused__ option,
-				 const char *const parameter)
-{
-    vString *const file = vStringNewInit (parameter);
-    if (Option.etagsInclude == NULL)
-	Option.etagsInclude = stringListNew ();
-    stringListAdd (Option.etagsInclude, file);
-}
-
-static void processFilterTerminatorOption (const char *const __unused__ option,
-					   const char *const parameter)
-{
-    freeString (&Option.filterTerminator);
-    Option.filterTerminator = stringCopy (parameter);
-}
-
-static void processExtensionFieldsOption (const char *const option,
-					  const char *const parameter)
-{
-    struct sExtFields *const field = &Option.extensionFields;
-    const char *p = parameter;
-    boolean mode = TRUE;
-    int c;
-
-    if (*p != '+'  &&  *p != '-')
-    {
-	field->access		= FALSE;
-	field->fileScope	= FALSE;
-	field->implementation	= FALSE;
-	field->inheritance	= FALSE;
-	field->kind		= FALSE;
-	field->kindKey		= FALSE;
-	field->kindLong		= FALSE;
-	field->language		= FALSE;
-	field->scope		= FALSE;
-	field->argList		= FALSE;
-    }
-    while ((c = *p++) != '\0') switch (c)
-    {
-	case '+': mode = TRUE;			break;
-	case '-': mode = FALSE;			break;
-
-	case 'a': field->access		= mode;	break;
-	case 'f': field->fileScope	= mode;	break;
-	case 'm': field->implementation	= mode;	break;
-	case 'i': field->inheritance	= mode;	break;
-	case 'k': field->kind		= mode;	break;
-	case 'K': field->kindLong	= mode;	break;
-	case 'l': field->language	= mode;	break;
-	case 'n': field->lineNumber	= mode;	break;
-	case 's': field->scope		= mode;	break;
-	case 'z': field->kindKey	= mode;	break;
-	case 'P': field->filePosition	= mode;	break;
-	case 'A': field->argList	= mode;	break;
-
-	default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option",
-		       c, option);
-	    break;
-    }
-}
-
-static void processExtraTagsOption (const char *const option,
-				    const char *const parameter)
-{
-    struct sInclude *const inc = &Option.include;
-    const char *p = parameter;
-    boolean mode = TRUE;
-    int c;
-
-    if (*p != '+'  &&  *p != '-')
-    {
-	inc->fileNames		= FALSE;
-	inc->qualifiedTags	= FALSE;
-#if 0
-	inc->fileScope		= FALSE;
-#endif
-    }
-    while ((c = *p++) != '\0') switch (c)
-    {
-	case '+': mode = TRUE;			break;
-	case '-': mode = FALSE;			break;
-
-	case 'f': inc->fileNames	= mode;	break;
-	case 'q': inc->qualifiedTags	= mode;	break;
-#if 0
-	case 'F': inc->fileScope	= mode;	break;
-#endif
-
-	default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option",
-		       c, option);
-	    break;
-    }
-}
-
 /*
- *  Option tables
- */
-
-static parametricOption ParametricOptions [] = {
-    { "etags-include",		processEtagsInclude,		FALSE	},
-    { "exclude",		processExcludeOption,		FALSE	},
-    { "excmd",			processExcmdOption,		FALSE	},
-    { "extra",			processExtraTagsOption,		FALSE	},
-    { "fields",			processExtensionFieldsOption,	FALSE	},
-    { "filter-terminator",	processFilterTerminatorOption,	TRUE	},
-    { "format",			processFormatOption,		TRUE	},
-    { "lang",			processLanguageForceOption,	FALSE	},
-    { "language",		processLanguageForceOption,	FALSE	},
-    { "language-force",		processLanguageForceOption,	FALSE	},
-    { "languages",		processLanguageListOption,	FALSE	},
-    { "langdef",		processLanguageDefineOption,	FALSE	},
-    { "langmap",		processLanguageMapOption,	FALSE	},
-    { "options",		processOptionFile,		FALSE	},
-};
-
-static booleanOption BooleanOptions [] = {
-    { "append",		&Option.append,			TRUE	},
-    { "file-scope",	&Option.include.fileScope,	FALSE	},
-    { "file-tags",	&Option.include.fileNames,	FALSE	},
-    { "filter",		&Option.filter,			TRUE	},
-    { "if0",		&Option.if0,			FALSE	},
-    { "kind-long",	&Option.kindLong,		TRUE	},
-    { "line-directives",&Option.lineDirectives,		FALSE	},
-    { "nest",&Option.nestFunction,		FALSE	},
-    { "links",		&Option.followLinks,		FALSE	},
-#ifdef RECURSE_SUPPORTED
-    { "recurse",	&Option.recurse,		FALSE	},
-#endif
-    { "sort",		&Option.sorted,			TRUE	},
-    { "tag-relative",	&Option.tagRelative,		TRUE	},
-    { "totals",		&Option.printTotals,		TRUE	},
-    { "verbose",	&Option.verbose,		FALSE	},
-};
-
-/*
  *  Generic option parsing
  */
+#define readOptionConfiguration
+#define initOptions
+#define freeOptionResources
 
-static void checkOptionOrder (const char* const option)
-{
-    if (ParsedLeadingOptions)
-	error (FATAL, "-%s option may not follow a file name", option);
-}
-
-static boolean processParametricOption (const char *const option,
-					const char *const parameter)
-{
-    const int count = sizeof (ParametricOptions) / sizeof (parametricOption);
-    boolean found = FALSE;
-    int i;
-
-    for (i = 0  ;  i < count  &&  ! found  ;  ++i)
-    {
-	parametricOption* const entry = &ParametricOptions [i];
-	if (strcmp (option, entry->name) == 0)
-	{
-	    found = TRUE;
-	    if (entry->initOnly)
-		checkOptionOrder (option);
-	    (entry->handler) (option, parameter);
-	}
-    }
-    return found;
-}
-
-static boolean getBooleanOption (const char *const option,
-				 const char *const parameter)
-{
-    boolean selection = TRUE;
-
-    if (parameter [0] == '\0')
-	selection = TRUE;
-    else if (strcmp (parameter, "0"  ) == 0  ||
-	     strcmp (parameter, "no" ) == 0  ||
-	     strcmp (parameter, "off") == 0)
-	selection = FALSE;
-    else if (strcmp (parameter, "1"  ) == 0  ||
-	     strcmp (parameter, "yes") == 0  ||
-	     strcmp (parameter, "on" ) == 0)
-	selection = TRUE;
-    else
-	error (FATAL, "Invalid value for \"%s\" option", option);
-
-    return selection;
-}
-
-static boolean processBooleanOption (const char *const option,
-				     const char *const parameter)
-{
-    const int count = sizeof (BooleanOptions) / sizeof (booleanOption);
-    boolean found = FALSE;
-    int i;
-
-    for (i = 0  ;  i < count  &&  ! found  ;  ++i)
-    {
-	booleanOption* const entry = &BooleanOptions [i];
-	if (strcmp (option, entry->name) == 0)
-	{
-	    found = TRUE;
-	    if (entry->initOnly)
-		checkOptionOrder (option);
-	    *entry->pValue = getBooleanOption (option, parameter);
-	}
-    }
-    return found;
-}
-
-static void processLongOption (const char *const option,
-			       const char *const parameter)
-{
-    if (parameter == NULL  ||  *parameter == '\0')
-	verbose ("  Option: --%s\n", option);
-    else
-	verbose ("  Option: --%s=%s\n", option, parameter);
-
-    if (processBooleanOption (option, parameter))
-	;
-    else if (processParametricOption (option, parameter))
-	;
-    else if (processKindOption (option, parameter))
-	;
-#ifdef HAVE_REGEX
-    else if (processRegexOption (option, parameter))
-	;
-#endif
-#define isOption(item)	(boolean) (strcmp (item,option) == 0)
-    else if (isOption ("help"))
-    {
-	printHelp (LongOptionDescription);
-	printKindOptions ();
-	exit (0);
-    }
-    else if (isOption ("license"))
-    {
-	printProgramIdentification ();
-	puts ("");
-	puts (License);
-	exit (0);
-    }
-    else if (isOption ("version"))
-    {
-	printProgramIdentification ();
-	exit (0);
-    }
-#ifndef RECURSE_SUPPORTED
-    else if (isOption ("recurse"))
-	error (WARNING, "%s option not supported on this host", option);
-#endif
-    else
-	error (FATAL, "Unknown option: --%s", option);
-#undef isOption
-}
-
-static void processShortOption (const char *const option,
-				const char *const parameter)
-{
-    if (parameter == NULL  ||  *parameter == '\0')
-	verbose ("  Option: -%s\n", option);
-    else
-	verbose ("  Option: -%s %s\n", option, parameter);
-
-    if (isCompoundOption (*option) && *parameter == '\0')
-	error (FATAL, "Missing parameter for \"%s\" option", option);
-    else switch (*option)
-    {
-	case '?':
-	    printHelp (LongOptionDescription);
-	    exit (0);
-	    break;
-	case 'a':
-	    checkOptionOrder (option);
-	    Option.append = TRUE;
-	    break;
-	case 'B':
-	    Option.backward = TRUE;
-	    break;
-	case 'e':
-	    checkOptionOrder (option);
-	    setEtagsMode ();
-	    break;
-	case 'f':
-	case 'o':
-	    checkOptionOrder (option);
-	    if (Option.tagFileName != NULL)
-	    {
-		error (WARNING,
-		    "-%s option specified more than once, last value used",
-		    option);
-		freeString (&Option.tagFileName);
-	    }
-	    else if (parameter [0] == '-'  &&  parameter [1] != '\0')
-		error (FATAL, "output file name may not begin with a '-'");
-	    Option.tagFileName = stringCopy (parameter);
-	    break;
-	case 'F':
-	    Option.backward = FALSE;
-	    break;
-	case 'h':
-	    processHeaderListOption (*option, parameter);
-	    break;
-	case 'i':
-	    processLegacyKindOption (parameter);
-	    break;
-	case 'I':
-	    processIgnoreOption (parameter);
-	    break;
-	case 'L':
-	    if (Option.fileList != NULL)
-	    {
-		error (WARNING,
-		    "-%s option specified more than once, last value used",
-		    option);
-		freeString (&Option.fileList);
-	    }
-	    Option.fileList = stringCopy (parameter);
-	    break;
-	case 'n':
-	    Option.locate = EX_LINENUM;
-	    break;
-	case 'N':
-	    Option.locate = EX_PATTERN;
-	    break;
-	case 'R':
-#ifdef RECURSE_SUPPORTED
-	    Option.recurse = TRUE;
-#else
-	    error (WARNING, "-%s option not supported on this host", option);
-#endif
-	    break;
-	case 'u':
-	    checkOptionOrder (option);
-	    Option.sorted = FALSE;
-	    break;
-	case 'V':
-	    Option.verbose = TRUE;
-	    break;
-	case 'w':
-	    /* silently ignored */
-	    break;
-	case 'x':
-	    checkOptionOrder (option);
-	    Option.xref = TRUE;
-	    break;
-	default:
-	    error (FATAL, "Unknown option: -%s", option);
-	    break;
-    }
-}
-
-extern void parseOption (cookedArgs* const args)
-{
-    Assert (! cArgOff (args));
-    if (args->isOption)
-    {
-	if (args->longOption)
-	    processLongOption (args->item, args->parameter);
-	else
-	{
-	    const char *parameter = args->parameter;
-	    while (*parameter == ' ')
-		++parameter;
-	    processShortOption (args->item, parameter);
-	}
-	cArgForth (args);
-    }
-}
-
-extern void parseOptions (cookedArgs* const args)
-{
-    while (! cArgOff (args)  &&  cArgIsOption (args))
-	parseOption (args);
-    if (! cArgOff (args)  &&  ! cArgIsOption (args))
-	ParsedLeadingOptions = TRUE;
-}
-
-static boolean parseFileOptions (const char* const fileName)
-{
-    boolean fileFound = FALSE;
-    FILE* const fp = fopen (fileName, "r");
-    if (fp != NULL)
-    {
-	cookedArgs* const args = cArgNewFromLineFile (fp);
-	verbose ("Reading options from %s\n", fileName);
-	parseOptions (args);
-	cArgDelete (args);
-	fclose (fp);
-	fileFound = TRUE;
-    }
-    return fileFound;
-}
-
-extern void previewFirstOption (cookedArgs* const args)
-{
-    if (cArgIsOption (args) &&
-	(strcmp (args->item, "V") == 0 || strcmp (args->item, "verbose") == 0))
-    {
-	parseOption (args);
-    }
-}
-
-static void parseConfigurationFileOptions (void)
-{
-    const char* const home = getenv ("HOME");
-    parseFileOptions ("/etc/ctags.conf");
-    parseFileOptions ("/usr/local/etc/ctags.conf");
-#ifdef CUSTOM_CONFIGURATION_FILE
-    parseFileOptions (CUSTOM_CONFIGURATION_FILE);
-#endif
-    if (home != NULL)
-    {
-	vString* const dotFile = combinePathAndFile (home, ".ctags");
-	parseFileOptions (vStringValue (dotFile));
-	vStringDelete (dotFile);
-    }
-    parseFileOptions (".ctags");
-}
-
-static void parseEnvironmentOptions (void)
-{
-    const char *envOptions = NULL;
-
-    if (Option.etags)
-	envOptions = getenv (ETAGS_ENVIRONMENT);
-    if (envOptions == NULL)
-	envOptions = getenv (CTAGS_ENVIRONMENT);
-    if (envOptions != NULL  &&  envOptions [0] != '\0')
-    {
-	cookedArgs* const args = cArgNewFromString (envOptions);
-	verbose ("Reading options from $CTAGS\n");
-	parseOptions (args);
-	cArgDelete (args);
-    }
-}
-
-extern void readOptionConfiguration (void)
-{
-    parseConfigurationFileOptions ();
-    parseEnvironmentOptions ();
-}
-
-/*
-*   Option initialization
-*/
-
-extern void initOptions (void)
-{
-    verbose ("Setting option defaults\n");
-    installHeaderListDefaults ();
-    verbose ("    Installing default language mappings:\n");
-    installLanguageMapDefaults ();
-}
-
-extern void freeOptionResources (void)
-{
-    freeString (&Option.tagFileName);
-    freeString (&Option.fileList);
-    freeString (&Option.filterTerminator);
-
-    freeList (&Option.ignore);
-    freeList (&Option.headerExt);
-    freeList (&Option.etagsInclude);
-}
-
 /* vi:set tabstop=8 shiftwidth=4: */

Modified: trunk/tagmanager/options.h
===================================================================
--- trunk/tagmanager/options.h	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/tagmanager/options.h	2006-06-24 14:36:35 UTC (rev 474)
@@ -32,20 +32,7 @@
 *   DATA DECLARATIONS
 */
 
-typedef enum { OPTION_NONE, OPTION_SHORT, OPTION_LONG } optionType;
 
-typedef struct sCookedArgs {
-/* private */
-    Arguments* args;
-    char *shortOptions;
-    char simple[2];
-    boolean isOption;
-    boolean longOption;
-    const char* parameter;
-/* public */
-    char* item;
-} cookedArgs;
-
 /*  This stores the command line options.
  */
 typedef struct sOptionValues {
@@ -71,7 +58,6 @@
     stringList* ignore;	    /* -I  name of file containing tokens to ignore */
     boolean append;	    /* -a  append to "tags" file */
     boolean backward;	    /* -B  regexp patterns search backwards */
-    boolean etags;	    /* -e  output Emacs style tags file */
     enum eLocate {
 	EX_MIX,		    /* line numbers for defines, patterns otherwise */
 	EX_LINENUM,	    /* -n  only line numbers in tag file */
@@ -97,10 +83,6 @@
     boolean printTotals;    /* --totals  print cumulative statistics */
     boolean lineDirectives; /* --linedirectives  process #line directives */
 	boolean nestFunction; /* --nest Nest inside function blocks for tags */
-#ifdef TM_DEBUG
-    long debugLevel;	    /* -D  debugging output */
-    unsigned long breakLine;/* -b  source line at which to call lineBreak() */
-#endif
 } optionValues;
 
 /*
@@ -114,25 +96,10 @@
 extern void verbose (const char *const format, ...) __printf__ (1, 2);
 extern void freeList (stringList** const pString);
 extern void setDefaultTagFileName (void);
-extern void checkOptions (void);
-extern void testEtagsInvocation (void);
 
-extern cookedArgs* cArgNewFromString (const char* string);
-extern cookedArgs* cArgNewFromArgv (char* const* const argv);
-extern cookedArgs* cArgNewFromFile (FILE* const fp);
-extern cookedArgs* cArgNewFromLineFile (FILE* const fp);
-extern void cArgDelete (cookedArgs* const current);
-extern boolean cArgOff (cookedArgs* const current);
-extern boolean cArgIsOption (cookedArgs* const current);
-extern const char* cArgItem (cookedArgs* const current);
-extern void cArgForth (cookedArgs* const current);
-
 extern const char *fileExtension (const char *const fileName);
 extern boolean isIncludeFile (const char *const fileName);
 extern boolean isIgnoreToken (const char *const name, boolean *const pIgnoreParens, const char **const replacement);
-extern void parseOption (cookedArgs* const cargs);
-extern void parseOptions (cookedArgs* const cargs);
-extern void previewFirstOption (cookedArgs* const cargs);
 extern void readOptionConfiguration (void);
 extern void initOptions (void);
 extern void freeOptionResources (void);

Modified: trunk/tagmanager/parse.c
===================================================================
--- trunk/tagmanager/parse.c	2006-06-23 14:00:22 UTC (rev 473)
+++ trunk/tagmanager/parse.c	2006-06-24 14:36:35 UTC (rev 474)
@@ -239,9 +239,6 @@
 	LanguageTable [language]->currentExtensions =
 	    stringListNewFromArgv (LanguageTable [language]->extensions);
     }
-    if (Option.verbose)
-	printLanguageMap (language);
-    verbose ("\n");
 }
 
 extern void installLanguageMapDefaults (void)
@@ -249,7 +246,6 @@
     unsigned int i;
     for (i = 0  ;  i < LanguageCount  ;  ++i)
     {
-	//verbose ("    %s: ", getLanguageName (i));
 	installLanguageMapDefault (i);
     }
 }
@@ -307,7 +303,6 @@
     builtInCount = sizeof (BuiltInParsers) / sizeof (BuiltInParsers [0]);
     LanguageTable = xMalloc (builtInCount, parserDefinition*);
 
-    verbose ("Installing parsers: ");
     for (i = 0  ;  i < builtInCount  ;  ++i)
     {
 	parserDefinition* const def = (*BuiltInParsers [i]) ();
@@ -331,13 +326,11 @@
 		accepted = TRUE;
 	    if (accepted)
 	    {
-		verbose ("%s%s", i > 0 ? ", " : "", def->name);
 		def->id = LanguageCount++;
 		LanguageTable [def->id] = def;
 	    }
 	}
     }
-    verbose ("\n");
     enableLanguages (TRUE);
     initializeParsers ();
 }
@@ -603,8 +596,6 @@
 
     if (fileOpen (fileName, language))
     {
-	if (Option.etags)
-	    beginEtagsFile ();
 
 	makeFileTag (fileName);
 
@@ -613,8 +604,6 @@
 	else if (LanguageTable [language]->parser2 != NULL)
 	    retried = LanguageTable [language]->parser2 (passCount);
 
-	if (Option.etags)
-	    endEtagsFile (getSourceFileTagPath ());
 
 	fileClose ();
     }
@@ -649,23 +638,13 @@
     if (Option.language == LANG_AUTO)
 	language = getFileLanguage (fileName);
     Assert (language != LANG_AUTO);
-    if (language == LANG_IGNORE)
-	verbose ("ignoring %s (unknown language)\n", fileName);
-    else if (! LanguageTable [language]->enabled)
-	verbose ("ignoring %s (language disabled)\n", fileName);
-    else
-    {
 	if (Option.filter)
 	    openTagFile ();
 
 	tagFileResized = createTagsWithFallback (fileName, language);
 
-	if (Option.filter)
-	    closeTagFile (tagFileResized);
 	addTotals (1, 0L, 0L);
 
-	return tagFileResized;
-    }
     return tagFileResized;
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Commits mailing list