Print this page
new smatch
@@ -29,12 +29,12 @@
#include "parse.h"
#include "cwchash/hashtable.h"
static struct hashtable *macro_table;
-static DEFINE_HASHTABLE_INSERT(do_insert_macro, struct position, char);
-static DEFINE_HASHTABLE_SEARCH(do_search_macro, struct position, char);
+static DEFINE_HASHTABLE_INSERT(do_insert_macro, struct position, struct string_list);
+static DEFINE_HASHTABLE_SEARCH(do_search_macro, struct position, struct string_list);
static inline unsigned int position_hash(void *_pos)
{
struct position *pos = _pos;
@@ -48,20 +48,49 @@
return pos1->line == pos2->line && pos1->pos == pos2->pos &&
pos1->stream == pos2->stream;
}
+static void insert_macro_string(struct string_list **str_list, char *new)
+{
+ add_ptr_list(str_list, new);
+}
+
void store_macro_pos(struct token *token)
{
+ struct string_list *list;
+
if (!macro_table)
macro_table = create_hashtable(5000, position_hash, equalkeys);
- if (get_macro_name(token->pos))
- return;
+ list = do_search_macro(macro_table, &token->pos);
+ insert_macro_string(&list, token->ident->name);
- do_insert_macro(macro_table, &token->pos, token->ident->name);
+ do_insert_macro(macro_table, &token->pos, list);
}
char *get_macro_name(struct position pos)
{
+ struct string_list *list;
+
+ if (!macro_table)
+ return NULL;
+ list = do_search_macro(macro_table, &pos);
+ return first_ptr_list((struct ptr_list *)list);
+}
+
+char *get_inner_macro(struct position pos)
+{
+ struct string_list *list;
+
+ if (!macro_table)
+ return NULL;
+ list = do_search_macro(macro_table, &pos);
+ return last_ptr_list((struct ptr_list *)list);
+}
+
+struct string_list *get_all_macros(struct position pos)
+{
+ if (!macro_table)
+ return NULL;
return do_search_macro(macro_table, &pos);
}