Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Jiří Techet techet@gmail.com Date: Mon, 21 Mar 2016 17:28:36 UTC Commit: 1c4aaa0eb72aa9e3c60cd604d4c20ca5f7dc5c8f https://github.com/geany/geany/commit/1c4aaa0eb72aa9e3c60cd604d4c20ca5f7dc5c...
Log Message: ----------- Add an API-like ctags layer
At the moment it is a bit hard to distinguish which of the functions we are using belong to ctags. To make more explicit what we need from ctags, wrap all ctags-related code and access ctags only using this layer.
The interface from tm_ctags_wrappers.h can serve as a base for proper ctags interface if ctags becomes a library.
Modified Paths: -------------- tagmanager/src/Makefile.am tagmanager/src/tm_ctags_wrappers.c tagmanager/src/tm_ctags_wrappers.h tagmanager/src/tm_source_file.c
Modified: tagmanager/src/Makefile.am 4 lines changed, 3 insertions(+), 1 deletions(-) =================================================================== @@ -28,4 +28,6 @@ libtagmanager_la_SOURCES =\ tm_tag.h \ tm_tag.c \ tm_workspace.h \ - tm_workspace.c + tm_workspace.c \ + tm_ctags_wrappers.h \ + tm_ctags_wrappers.c
Modified: tagmanager/src/tm_ctags_wrappers.c 119 lines changed, 119 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,119 @@ +/* + * tm_ctags_wrappers.c - this file is part of Geany, a fast and lightweight IDE + * + * Copyright 2016 Jiri Techet <techet(at)gmail(dot)com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "tm_ctags_wrappers.h" + +#include "general.h" +#include "entry.h" +#include "parse.h" +#include "read.h" + + +typedef struct { + tm_ctags_callback callback; + gpointer user_data; +} CallbackUserData; + + +void tm_ctags_init() +{ + initializeParsing(); + installLanguageMapDefaults(); +} + + +static gboolean parse_callback(const tagEntryInfo *tag, gpointer user_data) +{ + CallbackUserData *callback_data = user_data; + + return callback_data->callback(tag, FALSE, callback_data->user_data); +} + + +void tm_ctags_parse(guchar *buffer, gsize buffer_size, + const gchar *file_name, TMParserType lang, tm_ctags_callback callback, + gpointer user_data) +{ + CallbackUserData callback_data = {callback, user_data}; + gboolean retry = TRUE; + guint passCount = 0; + + g_return_if_fail(buffer || file_name); + + if (! LanguageTable [lang]->enabled) + { +#ifdef TM_DEBUG + g_warning("ignoring %s (language disabled)\n", file_name); +#endif + return; + } + + setTagEntryFunction(parse_callback, &callback_data); + while (retry && passCount < 3) + { + callback(NULL, TRUE, user_data); + if (!buffer && fileOpen (file_name, lang)) + { + if (LanguageTable [lang]->parser != NULL) + { + LanguageTable [lang]->parser (); + fileClose (); + retry = FALSE; + break; + } + else if (LanguageTable [lang]->parser2 != NULL) + retry = LanguageTable [lang]->parser2 (passCount); + fileClose (); + } + else if (buffer && bufferOpen (buffer, buffer_size, file_name, lang)) + { + if (LanguageTable [lang]->parser != NULL) + { + LanguageTable [lang]->parser (); + bufferClose (); + retry = FALSE; + break; + } + else if (LanguageTable [lang]->parser2 != NULL) + retry = LanguageTable [lang]->parser2 (passCount); + bufferClose (); + } + else + { + g_warning("Unable to open %s", file_name); + return; + } + ++ passCount; + } +} + + +const gchar *tm_ctags_get_lang_name(TMParserType lang) +{ + return getLanguageName(lang); +} + + +TMParserType tm_ctags_get_named_lang(const gchar *name) +{ + return getNamedLanguage(name); +} + +
Modified: tagmanager/src/tm_ctags_wrappers.h 49 lines changed, 49 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,49 @@ +/* + * tm_ctags_wrappers.h - this file is part of Geany, a fast and lightweight IDE + * + * Copyright 2016 Jiri Techet <techet(at)gmail(dot)com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef TM_CTAGS_WRAPPERS +#define TM_CTAGS_WRAPPERS + +#include <glib.h> + +#include "tm_parser.h" + +#include "entry.h" /* for sTagEntryInfo */ + + +G_BEGIN_DECLS + +typedef gboolean (*tm_ctags_callback) (const tagEntryInfo *const tag, + gboolean invalidate, void *user_data); + + +void tm_ctags_init(); + +void tm_ctags_parse(guchar *buffer, gsize buffer_size, + const gchar *file_name, TMParserType lang, tm_ctags_callback callback, + gpointer user_data); + +const gchar *tm_ctags_get_lang_name(TMParserType lang); + +TMParserType tm_ctags_get_named_lang(const gchar *name); + +G_END_DECLS + +#endif /* TM_CTAGS_WRAPPERS */
Modified: tagmanager/src/tm_source_file.c 82 lines changed, 22 insertions(+), 60 deletions(-) =================================================================== @@ -18,6 +18,7 @@ #include <limits.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include <sys/stat.h> #include <glib/gstdio.h> #ifdef G_OS_WIN32 @@ -26,14 +27,10 @@ # include <windows.h> /* for GetFullPathName */ #endif
-#include "general.h" -#include "entry.h" -#include "parse.h" -#include "read.h" - #include "tm_source_file.h" #include "tm_tag.h" #include "tm_parser.h" +#include "tm_ctags_wrappers.h"
typedef struct { @@ -725,10 +722,19 @@ static void update_python_arglist(const TMTag *tag, TMSourceFile *current_source it finds a new tag. You should not have to use this function. @see tm_source_file_parse() */ -static int tm_source_file_tags(const tagEntryInfo *tag, void *user_data) +static gboolean tm_source_file_tags(const tagEntryInfo *const tag, + gboolean invalidate, void *user_data) { TMSourceFile *current_source_file = user_data; - TMTag *tm_tag = tm_tag_new(); + TMTag *tm_tag; + + if (invalidate) + { + tm_tags_array_free(current_source_file->tags_array, FALSE); + return TRUE; + } + + tm_tag = tm_tag_new();
init_tag(tm_tag, current_source_file, tag);
@@ -742,8 +748,7 @@ static int tm_source_file_tags(const tagEntryInfo *tag, void *user_data)
void tm_source_file_ctags_init() { - initializeParsing(); - installLanguageMapDefaults(); + tm_ctags_init(); }
/* Initializes a TMSourceFile structure from a file name. */ @@ -783,7 +788,7 @@ static gboolean tm_source_file_init(TMSourceFile *source_file, const char *file_ if (name == NULL) source_file->lang = TM_PARSER_NONE; else - source_file->lang = getNamedLanguage(name); + source_file->lang = tm_ctags_get_named_lang(name);
return TRUE; } @@ -920,54 +925,11 @@ gboolean tm_source_file_parse(TMSourceFile *source_file, guchar* text_buf, gsize return TRUE; }
- if (! LanguageTable [source_file->lang]->enabled) - { -#ifdef TM_DEBUG - g_warning("ignoring %s (language disabled)\n", file_name); -#endif - } - else - { - setTagEntryFunction(tm_source_file_tags, source_file); - guint passCount = 0; - while (retry && passCount < 3) - { - tm_tags_array_free(source_file->tags_array, FALSE); - if (parse_file && fileOpen (file_name, source_file->lang)) - { - if (LanguageTable [source_file->lang]->parser != NULL) - { - LanguageTable [source_file->lang]->parser (); - fileClose (); - retry = FALSE; - break; - } - else if (LanguageTable [source_file->lang]->parser2 != NULL) - retry = LanguageTable [source_file->lang]->parser2 (passCount); - fileClose (); - } - else if (!parse_file && bufferOpen (text_buf, buf_size, file_name, source_file->lang)) - { - if (LanguageTable [source_file->lang]->parser != NULL) - { - LanguageTable [source_file->lang]->parser (); - bufferClose (); - retry = FALSE; - break; - } - else if (LanguageTable [source_file->lang]->parser2 != NULL) - retry = LanguageTable [source_file->lang]->parser2 (passCount); - bufferClose (); - } - else - { - g_warning("Unable to open %s", file_name); - return FALSE; - } - ++ passCount; - } - } - + tm_tags_array_free(source_file->tags_array, FALSE); + + tm_ctags_parse(parse_file ? NULL : text_buf, buf_size, file_name, + source_file->lang, tm_source_file_tags, source_file); + if (free_buf) g_free(text_buf); return !retry; @@ -979,7 +941,7 @@ gboolean tm_source_file_parse(TMSourceFile *source_file, guchar* text_buf, gsize */ const gchar *tm_source_file_get_lang_name(TMParserType lang) { - return getLanguageName(lang); + return tm_ctags_get_lang_name(lang); }
/* Gets the language index for \a name. @@ -988,5 +950,5 @@ const gchar *tm_source_file_get_lang_name(TMParserType lang) */ TMParserType tm_source_file_get_named_lang(const gchar *name) { - return getNamedLanguage(name); + return tm_ctags_get_named_lang(name); }
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).