SF.net SVN: geany:[3297] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sat Nov 29 18:35:44 UTC 2008


Revision: 3297
          http://geany.svn.sourceforge.net/geany/?rev=3297&view=rev
Author:   eht16
Date:     2008-11-29 18:35:44 +0000 (Sat, 29 Nov 2008)

Log Message:
-----------
Fix wrongly detected PHP files as HTML if they start with HTML code.

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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-11-29 18:34:56 UTC (rev 3296)
+++ trunk/ChangeLog	2008-11-29 18:35:44 UTC (rev 3297)
@@ -26,6 +26,8 @@
    Colomban Wendling, thanks).
  * doc/geany.txt, doc/geany.html:
    Add Python to the list of filetypes with default global tags files.
+ * src/filetypes.c:
+   Fix wrongly detected PHP files as HTML if they start with HTML code.
 
 
 2008-11-28  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2008-11-29 18:34:56 UTC (rev 3296)
+++ trunk/src/filetypes.c	2008-11-29 18:35:44 UTC (rev 3297)
@@ -747,6 +747,40 @@
 }
 
 
+/* This detects the filetype of the file pointed by 'utf8_filename' and a list of filetype id's,
+ * terminated by -1.
+ * The detected filetype of the file is checked against every id in the passed list and if
+ * there is a match, TRUE is returned. */
+static gboolean shebang_find_and_match_filetype(const gchar *utf8_filename, gint first, ...)
+{
+	GeanyFiletype *ft = NULL;
+	gint test;
+	gboolean result = FALSE;
+	va_list args;
+
+	ft = filetypes_detect_from_extension(utf8_filename);
+	if (ft == NULL || ft->id >= filetypes_array->len)
+		return FALSE;
+
+	va_start(args, first);
+	while (1)
+	{
+		test = va_arg(args, gint);
+		if (test == -1)
+			break;
+
+		if (ft->id == (guint) test)
+		{
+			result = TRUE;
+			break;
+		}
+	}
+	va_end(args);
+
+	return result;
+}
+
+
 static GeanyFiletype *find_shebang(const gchar *utf8_filename, const gchar *line)
 {
 	GeanyFiletype *ft = NULL;
@@ -795,19 +829,23 @@
 	/* detect HTML files */
 	if (strncmp(line, "<!DOCTYPE html", 14) == 0 || strncmp(line, "<html", 5) == 0)
 	{
-		ft = filetypes[GEANY_FILETYPES_HTML];
+		/* PHP, Perl and Python files might also start with <html, so detect them based on filename
+		 * extension and use the detected filetype, else assume HTML */
+		if (! shebang_find_and_match_filetype(utf8_filename,
+				GEANY_FILETYPES_PERL, GEANY_FILETYPES_PHP, GEANY_FILETYPES_PYTHON, -1))
+		{
+			ft = filetypes[GEANY_FILETYPES_HTML];
+		}
 	}
 	/* detect XML files */
 	else 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_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)
+		if (! shebang_find_and_match_filetype(utf8_filename,
+				GEANY_FILETYPES_HTML, GEANY_FILETYPES_DOCBOOK,
+				/* Perl, Python and PHP only to be safe */
+				GEANY_FILETYPES_PERL, GEANY_FILETYPES_PHP, GEANY_FILETYPES_PYTHON, -1))
 		{
 			ft = filetypes[GEANY_FILETYPES_XML];
 		}


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