SF.net SVN: geany: [869] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Fri Oct 6 23:23:15 UTC 2006


Revision: 869
          http://svn.sourceforge.net/geany/?rev=869&view=rev
Author:   eht16
Date:     2006-10-06 16:23:05 -0700 (Fri, 06 Oct 2006)

Log Message:
-----------
Implemented simple "shebang" detection.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/document.c
    trunk/src/filetypes.c
    trunk/src/filetypes.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-10-06 22:29:04 UTC (rev 868)
+++ trunk/ChangeLog	2006-10-06 23:23:05 UTC (rev 869)
@@ -1,6 +1,9 @@
 2006-10-06  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * tagmanager/python.c: Improved Python parser to support nested classes.
+ * src/filetypes.c, src/document.c:
+   Implemented simple "shebang" detection. It is used prior to the
+   filename extension detection.
 
 
 2006-10-04  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-10-06 22:29:04 UTC (rev 868)
+++ trunk/src/document.c	2006-10-06 23:23:05 UTC (rev 869)
@@ -660,7 +660,7 @@
 
 	if (! reload)
 	{
-		filetype *use_ft = (ft != NULL) ? ft : filetypes_get_from_filename(utf8_filename);
+		filetype *use_ft = (ft != NULL) ? ft : filetypes_get_from_filename(idx);
 
 		doc_list[idx].readonly = readonly;
 		sci_set_readonly(doc_list[idx].sci, readonly);
@@ -828,7 +828,7 @@
 		doc_list[idx].mtime = time(NULL);
 		if (doc_list[idx].file_type == NULL || doc_list[idx].file_type->id == GEANY_FILETYPES_ALL)
 		{
-			doc_list[idx].file_type = filetypes_get_from_filename(doc_list[idx].file_name);
+			doc_list[idx].file_type = filetypes_get_from_filename(idx);
 			filetypes_select_radio_item(doc_list[idx].file_type);
 		}
 		document_set_filetype(idx, doc_list[idx].file_type);

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2006-10-06 22:29:04 UTC (rev 868)
+++ trunk/src/filetypes.c	2006-10-06 23:23:05 UTC (rev 869)
@@ -31,6 +31,8 @@
 #include "templates.h"
 #include "msgwindow.h"
 #include "utils.h"
+#include "document.h"
+#include "sciwrappers.h"
 
 
 /* This is the order of unique ids used in the config file.
@@ -111,7 +113,7 @@
 
 /* inits the filetype array and fill it with the known filetypes
  * and create the filetype menu*/
-void filetypes_init_types(void)
+void filetypes_init_types()
 {
 	GtkWidget *filetype_menu = lookup_widget(app->window, "set_filetype1_menu");
 	GtkWidget *template_menu = lookup_widget(app->window, "menu_new_with_template1_menu");
@@ -693,18 +695,67 @@
 }
 
 
+static filetype *find_shebang(gint idx)
+{
+	gchar *line = sci_get_line(doc_list[idx].sci, 0);
+	filetype *ft = NULL;
+
+	if (strlen(line) > 2 && line[0] == '#' && line[1]=='!')
+	{
+		/// TODO does g_path_get_basename() also work under Win32 for Unix filenames?
+		gchar *basename_interpreter = g_path_get_basename(line + 2);
+
+		if (strncmp(basename_interpreter, "sh", 2) == 0)
+			ft = filetypes[GEANY_FILETYPES_SH];
+		else if (strncmp(basename_interpreter, "bash", 4) == 0)
+			ft = filetypes[GEANY_FILETYPES_SH];
+		else if (strncmp(basename_interpreter, "perl", 4) == 0)
+			ft = filetypes[GEANY_FILETYPES_PERL];
+		else if (strncmp(basename_interpreter, "python", 6) == 0)
+			ft = filetypes[GEANY_FILETYPES_PYTHON];
+		else if (strncmp(basename_interpreter, "php", 3) == 0)
+			ft = filetypes[GEANY_FILETYPES_PHP];
+		else if (strncmp(basename_interpreter, "ruby", 4) == 0)
+			ft = filetypes[GEANY_FILETYPES_RUBY];
+		else if (strncmp(basename_interpreter, "tcl", 3) == 0)
+			ft = filetypes[GEANY_FILETYPES_TCL];
+		else if (strncmp(basename_interpreter, "zsh", 3) == 0)
+			ft = filetypes[GEANY_FILETYPES_SH];
+		else if (strncmp(basename_interpreter, "ksh", 3) == 0)
+			ft = filetypes[GEANY_FILETYPES_SH];
+		else if (strncmp(basename_interpreter, "csh", 3) == 0)
+			ft = filetypes[GEANY_FILETYPES_SH];
+		// what else to add?
+
+		g_free(basename_interpreter);
+	}
+
+	g_free(line);
+	return ft;
+}
+
+
 /* simple filetype selection based on the filename extension */
-filetype *filetypes_get_from_filename(const gchar *filename)
+filetype *filetypes_get_from_filename(gint idx)
 {
 	GPatternSpec *pattern;
+	filetype *ft;
+	gchar *filename;
 	gchar *base_filename, *utf8_filename;
 	gint i, j;
 
-	if (filename == NULL)
-	{
+	if (! DOC_IDX_VALID(idx))
 		return filetypes[GEANY_FILETYPES_ALL];
-	}
 
+	// try to find a shebang and if found use it prior to the filename extension
+	ft = find_shebang(idx);
+	if (ft != NULL) return ft;
+
+	if (doc_list[idx].file_name == NULL)
+		return filetypes[GEANY_FILETYPES_ALL];
+	else
+		filename = doc_list[idx].file_name;
+
 	// try to get the UTF-8 equivalent for the filename
 	utf8_filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL);
 	if (utf8_filename == NULL)
@@ -774,7 +825,7 @@
 
 
 /* frees the array and all related pointers */
-void filetypes_free_types(void)
+void filetypes_free_types()
 {
 	gint i;
 

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2006-10-06 22:29:04 UTC (rev 868)
+++ trunk/src/filetypes.h	2006-10-06 23:23:05 UTC (rev 869)
@@ -113,13 +113,13 @@
 
 /* inits the filetype array and fill it with the known filetypes
  * and create the filetype menu*/
-void filetypes_init_types(void);
+void filetypes_init_types();
 
 /* simple filetype selection based on the filename extension */
-filetype *filetypes_get_from_filename(const gchar *filename);
+filetype *filetypes_get_from_filename(gint idx);
 
 /* frees the array and all related pointers */
-void filetypes_free_types(void);
+void filetypes_free_types();
 
 gchar *filetypes_get_template(filetype *ft);
 


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