#include #include #include #include #include #include #include "staglib.h" #define q2s g_quark_to_string #define s2q g_quark_from_string void* stag_throw(gchar *msg) { printf "EXCEPTION:%s\n", msg); } stag* stag_new() { stag *stag = g_malloc(sizeof(stag)); stag->nameq = s2q(""); stag->data = g_slist_alloc(); stag->isterminal = FALSE; return stag; } G_CONST_RETURN gchar* stag_name(stag *node, gchar *name) { GQuark q; if (name != NULL) { node->nameq = s2q(name); } q = node->nameq; return g_quark_to_string(q); } G_CONST_RETURN gchar* stag_getname(stag *node) { return q2s(node->nameq); } char* stag_data(stag *node, void *data, gboolean isterminal) { if (data != NULL) { node->data = data; node->isterminal = isterminal; } return node->data; } GSList* stag_kids(stag *node) { if (node->isterminal) { stag_throw(stag, "terminal"); } return (GSList*)node->data; } /* GSList* stag_findnode(stag *node, gchar *name, stag *replacement_node) { int i; GQuark nameq = s2q(name); GSList* matchlist = g_slist_alloc(); if (node->nameq == nameq) { g_slist_append(matchlist, node); } else if (node->isterminal) { return; } else { for (i=0; i < g_slist_length_foreach(node->data); i++) { stag* subnode = (stag*)g_slist_nth(node->data, i); GSList* sublist = stag_findnode(subnode, name, replacement_node); g_slist_concat(matchlist, sublist); } } return matchlist; } */