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