SF.net SVN: geany: [2306] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Wed Mar 5 17:09:58 UTC 2008


Revision: 2306
          http://geany.svn.sourceforge.net/geany/?rev=2306&view=rev
Author:   eht16
Date:     2008-03-05 09:09:57 -0800 (Wed, 05 Mar 2008)

Log Message:
-----------
Apply patch from Yura Siamashka to use she-bang filetype detection also in filetypes_detect_from_filename() which let plugins benefit from this feature.

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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-03-04 16:11:59 UTC (rev 2305)
+++ trunk/ChangeLog	2008-03-05 17:09:57 UTC (rev 2306)
@@ -1,3 +1,11 @@
+2008-03-05  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/filetypes.c, src/filetypes.h, src/symbols.c:
+   Apply patch from Yura Siamashka to use she-bang filetype detection
+   also in filetypes_detect_from_filename() which let plugins benefit
+   from this feature.
+
+
 2008-03-03  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * tagmanager/fortran.c, src/symbols.c:
@@ -54,7 +62,7 @@
  * tagmanager/options.c, src/symbols.c, src/symbols.h:
    Define c_tags_ignore in options.c (tagmanager) instead of symbols.c.
  * configure.in:
-   Apply patch Yura Siamashka to add a check for the presence of
+   Apply patch from Yura Siamashka to add a check for the presence of
    fnmatch(), thanks.
  * THANKS, plugins/vcdiff.c, src/plugindata.h, src/plugins.c,
    src/utils.c, src/utils.h, src/win32.c, src/win32.h:

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2008-03-04 16:11:59 UTC (rev 2305)
+++ trunk/src/filetypes.c	2008-03-05 17:09:57 UTC (rev 2306)
@@ -26,6 +26,7 @@
  */
 
 #include <string.h>
+#include <glib/gstdio.h>
 
 #include "geany.h"
 #include "filetypes.h"
@@ -569,9 +570,43 @@
 }
 
 
-static filetype *find_shebang(gint idx)
+/* Detect filetype only based on the filename extension.
+ * utf8_filename can include the full path. */
+filetype *filetypes_detect_from_extension(const gchar *utf8_filename)
 {
-	gchar *line = sci_get_line(doc_list[idx].sci, 0);
+	GPatternSpec *pattern;
+	gchar *base_filename;
+	gint i, j;
+
+	/* to match against the basename of the file(because of Makefile*) */
+	base_filename = g_path_get_basename(utf8_filename);
+#ifdef G_OS_WIN32
+	/* use lower case basename */
+	setptr(base_filename, g_utf8_strdown(base_filename, -1));
+#endif
+
+	for(i = 0; i < GEANY_MAX_FILE_TYPES; i++)
+	{
+		for (j = 0; filetypes[i]->pattern[j] != NULL; j++)
+		{
+			pattern = g_pattern_spec_new(filetypes[i]->pattern[j]);
+			if (g_pattern_match_string(pattern, base_filename))
+			{
+				g_free(base_filename);
+				g_pattern_spec_free(pattern);
+				return filetypes[i];
+			}
+			g_pattern_spec_free(pattern);
+		}
+	}
+
+	g_free(base_filename);
+	return filetypes[GEANY_FILETYPES_ALL];
+}
+
+
+static filetype *find_shebang(const gchar *utf8_filename, const gchar *line)
+{
 	filetype *ft = NULL;
 
 	if (strlen(line) > 2 && line[0] == '#' && line[1] == '!')
@@ -614,81 +649,83 @@
 		g_free(tmp);
 	}
 	/* detect XML files */
-	if (strncmp(line, "<?xml", 5) == 0)
+	if (utf8_filename && strncmp(line, "<?xml", 5) == 0)
 	{
 		/* HTML and DocBook files might also start with <?xml, so detect them based on filename
 		 * extension and use the detected filetype, else assume XML */
-		ft = filetypes_detect_from_filename(doc_list[idx].file_name);
+		ft = filetypes_detect_from_extension(utf8_filename);
 		if (FILETYPE_ID(ft) != GEANY_FILETYPES_HTML &&
 			FILETYPE_ID(ft) != GEANY_FILETYPES_DOCBOOK &&
 			FILETYPE_ID(ft) != GEANY_FILETYPES_PERL &&	/* Perl, Python and PHP only to be safe */
 			FILETYPE_ID(ft) != GEANY_FILETYPES_PHP &&
 			FILETYPE_ID(ft) != GEANY_FILETYPES_PYTHON)
-
+		{
 			ft = filetypes[GEANY_FILETYPES_XML];
+		}
 	}
 	else if (strncmp(line, "<?php", 5) == 0)
 	{
 		ft = filetypes[GEANY_FILETYPES_PHP];
 	}
 
-	g_free(line);
 	return ft;
 }
 
 
-/* Detect the filetype for document idx, checking for a shebang, then filename extension. */
-filetype *filetypes_detect_from_file(gint idx)
+/* Detect the filetype checking for a shebang, then filename extension. */
+static filetype *filetypes_detect_from_file_internal(const gchar *utf8_filename, const gchar *line)
 {
 	filetype *ft;
 
-	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
 	 * also checks for <?xml */
-	ft = find_shebang(idx);
-	if (ft != NULL) return ft;
+	ft = find_shebang(utf8_filename, line);
+	if (ft != NULL)
+		return ft;
 
-	if (doc_list[idx].file_name == NULL)
+	if (utf8_filename == NULL)
 		return filetypes[GEANY_FILETYPES_ALL];
 
-	return filetypes_detect_from_filename(doc_list[idx].file_name);
+	return filetypes_detect_from_extension(utf8_filename);
 }
 
 
+/* Detect the filetype for document idx. */
+filetype *filetypes_detect_from_file(gint idx)
+{
+	filetype *ft;
+	gchar *line;
+
+	if (! DOC_IDX_VALID(idx))
+		return filetypes[GEANY_FILETYPES_ALL];
+
+	line = sci_get_line(doc_list[idx].sci, 0);
+	ft = filetypes_detect_from_file_internal(doc_list[idx].file_name, line);
+	g_free(line);
+	return ft;
+}
+
+
 /* Detect filetype based on the filename extension.
  * utf8_filename can include the full path. */
 filetype *filetypes_detect_from_filename(const gchar *utf8_filename)
 {
-	GPatternSpec *pattern;
-	gchar *base_filename;
-	gint i, j;
+	gchar line[1024];
+	FILE *f;
+	gchar *locale_name = utils_get_locale_from_utf8(utf8_filename);
 
-	/* to match against the basename of the file(because of Makefile*) */
-	base_filename = g_path_get_basename(utf8_filename);
-#ifdef G_OS_WIN32
-	/* use lower case basename */
-	setptr(base_filename, g_utf8_strdown(base_filename, -1));
-#endif
-
-	for(i = 0; i < GEANY_MAX_FILE_TYPES; i++)
+	f = g_fopen(locale_name, "r");
+	g_free(locale_name);
+	if (f != NULL)
 	{
-		for (j = 0; filetypes[i]->pattern[j] != NULL; j++)
+		if (fgets(line, sizeof(line), f) != NULL)
 		{
-			pattern = g_pattern_spec_new(filetypes[i]->pattern[j]);
-			if (g_pattern_match_string(pattern, base_filename))
-			{
-				g_free(base_filename);
-				g_pattern_spec_free(pattern);
-				return filetypes[i];
-			}
-			g_pattern_spec_free(pattern);
+			fclose(f);
+			return filetypes_detect_from_file_internal(utf8_filename, line);
 		}
+		fclose(f);
 	}
-
-	g_free(base_filename);
-	return filetypes[GEANY_FILETYPES_ALL];
+	return filetypes_detect_from_extension(utf8_filename);
 }
 
 

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2008-03-04 16:11:59 UTC (rev 2305)
+++ trunk/src/filetypes.h	2008-03-05 17:09:57 UTC (rev 2306)
@@ -136,6 +136,8 @@
 /* Detect the filetype for document idx, checking for a shebang, then filename extension. */
 filetype *filetypes_detect_from_file(gint idx);
 
+filetype *filetypes_detect_from_extension(const gchar *utf8_filename);
+
 /* Detect filetype based on the filename extension.
  * utf8_filename can include the full path. */
 filetype *filetypes_detect_from_filename(const gchar *utf8_filename);

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2008-03-04 16:11:59 UTC (rev 2305)
+++ trunk/src/symbols.c	2008-03-05 17:09:57 UTC (rev 2306)
@@ -912,7 +912,7 @@
 	if (tags_ext)
 	{
 		*tags_ext = '\0';	/* remove .tags extension */
-		ft = filetypes_detect_from_filename(shortname);
+		ft = filetypes_detect_from_extension(shortname);
 	}
 	g_free(shortname);
 


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