Kaydet (Commit) 46463238 authored tarafından Jiří Techet's avatar Jiří Techet

Remove unused tm_symbol

üst b512aa03
......@@ -16,7 +16,6 @@ tagmanager_include_HEADERS = \
tm_file_entry.h \
tm_parser.h \
tm_source_file.h \
tm_symbol.h \
tm_tag.h \
tm_tagmanager.h \
tm_work_object.h \
......@@ -26,7 +25,6 @@ tagmanager_include_HEADERS = \
libtagmanager_a_SOURCES =\
tm_file_entry.c \
tm_source_file.c \
tm_symbol.c \
tm_tag.c \
tm_tagmanager.c \
tm_work_object.c \
......
/*
*
* Copyright (c) 2001-2002, Biswapesh Chattopadhyay
*
* This source code is released for free distribution under the terms of the
* GNU General Public License.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tm_symbol.h"
#define SYM_NEW(T) ((T) = g_slice_new0(TMSymbol))
#define SYM_FREE(T) g_slice_free(TMSymbol, (T))
void tm_symbol_print(TMSymbol *sym, guint level)
{
guint i;
g_return_if_fail (sym != NULL);
for (i=0; i < level; ++i)
fputc('\t', stderr);
fprintf(stderr, "%s\n", (sym->tag)?sym->tag->name:"Root");
if (sym->info.children)
{
if (sym->tag && tm_tag_function_t == sym->tag->type)
tm_tag_print(sym->info.equiv, stderr);
else
{
for (i=0; i < sym->info.children->len; ++i)
tm_symbol_print(TM_SYMBOL(sym->info.children->pdata[i])
, level + 1);
}
}
}
#define SYM_ORDER(T) (((tm_tag_class_t == (T)->type) || (tm_tag_struct_t ==\
(T)->type))?1:(((tm_tag_enum_t == (T)->type) || (tm_tag_interface_t ==\
(T)->type))?2:3))
/* Comparison function for sorting symbols alphabetically */
int tm_symbol_compare(const void *p1, const void *p2)
{
TMSymbol *s1, *s2;
if (!p1 && !p2)
return 0;
else if (!p2)
return 1;
else if (!p1)
return -1;
s1 = *(TMSymbol **) p1;
s2 = *(TMSymbol **) p2;
if (!s1 && !s2)
return 0;
else if (!s2)
return 1;
else if (!s1)
return -1;
if (!s1->tag && !s2->tag)
return 0;
else if (!s2->tag)
return 1;
else if (!s1->tag)
return -1;
return strcmp(s1->tag->name, s2->tag->name);
}
/*
* Compares function argument lists.
* FIXME: Compare based on types, not an exact string match.
*/
int tm_arglist_compare(const TMTag* t1, const TMTag* t2)
{
return strcmp(FALLBACK(t1->atts.entry.arglist, ""),
FALLBACK(t2->atts.entry.arglist, ""));
}
/* Need this custom compare function to generate a symbol tree
in a simgle pass from tag list */
int tm_symbol_tag_compare(const TMTag **t1, const TMTag **t2)
{
gint s1, s2;
if (!t1 && !t2)
return 0;
if (t1 && t2 && !*t1 && !*t2)
return 0;
else if (!t1 || !*t1)
return -1;
else if (!t2 || !*t2)
return 1;
if ((tm_tag_file_t == (*t1)->type) && (tm_tag_file_t == (*t2)->type))
return 0;
else if (tm_tag_file_t == (*t1)->type)
return -1;
else if (tm_tag_file_t == (*t2)->type)
return 1;
/* Compare on depth of scope - less depth gets higher priortity */
s1 = tm_tag_scope_depth(*t1);
s2 = tm_tag_scope_depth(*t2);
if (s1 != s2)
return (s1 - s2);
/* Compare of tag type using a symbol ordering routine */
s1 = SYM_ORDER(*t1);
s2 = SYM_ORDER(*t2);
if (s1 != s2)
return (s1 - s2);
/* Compare names alphabetically */
s1 = strcmp((*t1)->name, (*t2)->name);
if (s1 != 0)
return (s1);
/* Compare scope alphabetically */
s1 = strcmp(FALLBACK((*t1)->atts.entry.scope, ""),
FALLBACK((*t2)->atts.entry.scope, ""));
if (s1 != 0)
return s1;
/* If none of them are function/prototype, they are effectively equal */
if ((tm_tag_function_t != (*t1)->type) &&
(tm_tag_prototype_t != (*t1)->type)&&
(tm_tag_function_t != (*t2)->type) &&
(tm_tag_prototype_t != (*t2)->type))
return 0;
/* Whichever is not a function/prototype goes first */
if ((tm_tag_function_t != (*t1)->type) &&
(tm_tag_prototype_t != (*t1)->type))
return -1;
if ((tm_tag_function_t != (*t2)->type) &&
(tm_tag_prototype_t != (*t2)->type))
return 1;
/* Compare the argument list */
s1 = tm_arglist_compare(*t1, *t2);
if (s1 != 0)
return s1;
/* Functions go before prototypes */
if ((tm_tag_function_t == (*t1)->type) &&
(tm_tag_function_t != (*t2)->type))
return -1;
if ((tm_tag_function_t != (*t1)->type) &&
(tm_tag_function_t == (*t2)->type))
return 1;
/* Give up */
return 0;
}
TMSymbol *tm_symbol_tree_new(GPtrArray *tags_array)
{
TMSymbol *root = NULL;
GPtrArray *tags;
#ifdef TM_DEBUG
g_message("Building symbol tree..");
#endif
if ((!tags_array) || (tags_array->len <= 0))
return NULL;
#ifdef TM_DEBUG
fprintf(stderr, "Dumping all tags..\n");
tm_tags_array_print(tags_array, stderr);
#endif
tags = tm_tags_extract(tags_array, tm_tag_max_t);
#ifdef TM_DEBUG
fprintf(stderr, "Dumping unordered tags..\n");
tm_tags_array_print(tags, stderr);
#endif
if (tags && (tags->len > 0))
{
guint i;
int j;
int max_parents = -1;
TMTag *tag;
TMSymbol *sym = NULL, *sym1;
char *parent_name;
char *scope_end;
gboolean matched;
int str_match;
SYM_NEW(root);
tm_tags_custom_sort(tags, (TMTagCompareFunc) tm_symbol_tag_compare
, FALSE);
#ifdef TM_DEBUG
fprintf(stderr, "Dumping ordered tags..");
tm_tags_array_print(tags, stderr);
fprintf(stderr, "Rebuilding symbol table..\n");
#endif
for (i=0; i < tags->len; ++i)
{
tag = TM_TAG(tags->pdata[i]);
if (tm_tag_prototype_t == tag->type)
{
if (sym && (tm_tag_function_t == sym->tag->type) &&
(!sym->info.equiv) &&
(0 == strcmp(FALLBACK(tag->atts.entry.scope, "")
, FALLBACK(sym->tag->atts.entry.scope, ""))))
{
sym->info.equiv = tag;
continue;
}
}
if (max_parents < 0)
{
if (SYM_ORDER(tag) > 2)
{
max_parents = i;
if (max_parents > 0)
qsort(root->info.children->pdata, max_parents
, sizeof(gpointer), tm_symbol_compare);
}
}
SYM_NEW(sym);
sym->tag = tag;
if ((max_parents <= 0) || (!tag->atts.entry.scope))
{
sym->parent = root;
if (!root->info.children)
root->info.children = g_ptr_array_new();
g_ptr_array_add(root->info.children, sym);
}
else
{
parent_name = tag->atts.entry.scope;
scope_end = strstr(tag->atts.entry.scope, "::");
if (scope_end)
*scope_end = '\0';
matched = FALSE;
if (('\0' != parent_name[0]) &&
(0 != strcmp(parent_name, "<anonymous>")))
{
for (j=0; j < max_parents; ++j)
{
sym1 = TM_SYMBOL(root->info.children->pdata[j]);
str_match = strcmp(sym1->tag->name, parent_name);
if (str_match == 0)
{
matched = TRUE;
sym->parent = sym1;
if (!sym1->info.children)
sym1->info.children = g_ptr_array_new();
g_ptr_array_add(sym1->info.children, sym);
break;
}
else if (str_match > 0)
break;
}
}
if (!matched)
{
sym->parent = root;
if (!root->info.children)
root->info.children = g_ptr_array_new();
g_ptr_array_add(root->info.children, sym);
}
if (scope_end)
*scope_end = ':';
}
}
#ifdef TM_DEBUG
fprintf(stderr, "Done.Dumping symbol tree..");
tm_symbol_print(root, 0);
#endif
}
if (tags)
g_ptr_array_free(tags, TRUE);
return root;
}
static void tm_symbol_free(TMSymbol *sym)
{
if (!sym)
return;
if ((!sym->tag) || ((tm_tag_function_t != sym->tag->type) &&
(tm_tag_prototype_t != sym->tag->type)))
{
if (sym->info.children)
{
guint i;
for (i=0; i < sym->info.children->len; ++i)
tm_symbol_free(TM_SYMBOL(sym->info.children->pdata[i]));
g_ptr_array_free(sym->info.children, TRUE);
sym->info.children = NULL;
}
}
SYM_FREE(sym);
}
void tm_symbol_tree_free(gpointer root)
{
if (root)
tm_symbol_free(TM_SYMBOL(root));
}
TMSymbol *tm_symbol_tree_update(TMSymbol *root, GPtrArray *tags)
{
if (root)
tm_symbol_free(root);
if ((tags) && (tags->len > 0))
return tm_symbol_tree_new(tags);
else
return NULL;
}
/*
*
* Copyright (c) 2001-2002, Biswapesh Chattopadhyay
*
* This source code is released for free distribution under the terms of the
* GNU General Public License.
*
*/
#ifndef TM_SYMBOL_H
#define TM_SYMBOL_H
/*! \file
The TMSymbol structure and related routines are used by TMProject to maintain a symbol
hierarchy. The top level TMSymbol maintains a pretty simple hierarchy, consisting of
compounds (classes and structs) and their children (member variables and functions).
*/
#include <glib.h>
#include "tm_tag.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*! This structure defines a symbol */
typedef struct _TMSymbol
{
TMTag *tag; /*!< The tag corresponding to this symbol */
struct _TMSymbol *parent; /*!< Parent class/struct for functions/variables */
union
{
GPtrArray *children; /*!< Array of child symbols */
TMTag *equiv; /*!< Prototype tag for functions */
} info;
} TMSymbol;
#define TM_SYMBOL(S) ((TMSymbol *) (S))
/*! Creates a symbol tree from an array of tags.
\param tags The array of tags from which to create the symbol tree.
\return The root symbol (starting point of the symbol tree)
*/
TMSymbol *tm_symbol_tree_new(GPtrArray *tags);
/*! Given a symbol, frees it and all its children.
\param root The symbol to free.
*/
void tm_symbol_tree_free(gpointer root);
/*! Given a symbol tree and an array of tags, updates the symbol tree. Note
that the returned pointer may be different from the passed root pointer,
so don't throw it away. This is basically a convinience function that calls
tm_symbol_tree_free() and tm_symbol_tree_new().
\param root The original root symbol.
\param tags The array of tags from which to rebuild the tree.
\return The new root symbol.
*/
TMSymbol *tm_symbol_tree_update(TMSymbol *root, GPtrArray *tags);
/*! Arglist comparison function */
int tm_arglist_compare(const TMTag *t1, const TMTag *t2);
/*! Symbol comparison function - can be used for sorting purposes. */
int tm_symbol_compare(const void *p1, const void *p2);
/*! Tag comparison function tailor made for creating symbol view */
int tm_symbol_tag_compare(const TMTag **t1, const TMTag **t2);
/*! Prints the symbol hierarchy to standard error */
void tm_symbol_print(TMSymbol *sym, guint level);
#ifdef __cplusplus
}
#endif
#endif /* TM_SYMBOL_H */
......@@ -11,7 +11,6 @@
#define TM_TAGMANAGER_H
#include "tm_tag.h"
#include "tm_symbol.h"
#include "tm_file_entry.h"
#include "tm_workspace.h"
#include "tm_work_object.h"
......
......@@ -120,7 +120,6 @@ ctags_sources = set([
tagmanager_sources = set([
'tagmanager/src/tm_file_entry.c',
'tagmanager/src/tm_source_file.c',
'tagmanager/src/tm_symbol.c',
'tagmanager/src/tm_tag.c',
'tagmanager/src/tm_tagmanager.c',
'tagmanager/src/tm_work_object.c',
......@@ -552,7 +551,7 @@ def build(bld):
bld.install_files('${PREFIX}/include/geany/tagmanager', '''
tagmanager/src/tm_file_entry.h
tagmanager/src/tm_source_file.h tagmanager/src/tm_parser.h
tagmanager/src/tm_symbol.h tagmanager/src/tm_tag.h
tagmanager/src/tm_tag.h
tagmanager/src/tm_tagmanager.h tagmanager/src/tm_work_object.h
tagmanager/src/tm_workspace.h ''')
# Docs
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment