📄 util.c
字号:
down_tfd.tree = IDL_BINOP (p).left; IDL_tree_walk_real (&down_tfd, data); down_tfd.tree = IDL_BINOP (p).right; IDL_tree_walk_real (&down_tfd, data); break; case IDLN_UNARYOP: down_tfd.tree = IDL_UNARYOP (p).operand; IDL_tree_walk_real (&down_tfd, data); break; default: g_warning ("IDL_tree_walk_real: unknown node type %s\n", IDL_NODE_TYPE_NAME (p)); break; } if (data->post_tree_func) (void) (*data->post_tree_func) (tfd, data->user_data); tfd->state->bottom = tfd->up;}void IDL_tree_walk (IDL_tree p, IDL_tree_func_data *current, IDL_tree_func pre_tree_func, IDL_tree_func post_tree_func, gpointer user_data){ IDLTreeWalkRealData data; IDL_tree_func_state tfs; IDL_tree_func_data tfd; g_return_if_fail (!(pre_tree_func == NULL && post_tree_func == NULL)); data.pre_tree_func = pre_tree_func; data.post_tree_func = post_tree_func; data.user_data = user_data; tfs.up = current ? current->state : NULL; tfs.start = p; if (current) tfd = *current; tfd.state = &tfs; tfd.up = current; tfd.tree = p; IDL_tree_walk_real (&tfd, &data);}void IDL_tree_walk_in_order (IDL_tree p, IDL_tree_func tree_func, gpointer user_data){ IDL_tree_walk (p, NULL, tree_func, NULL, user_data);}static void __IDL_tree_free (IDL_tree p);static int tree_free_but_this (IDL_tree data, IDL_tree p, IDL_tree this_one){ if (p == this_one) return TRUE; __IDL_tree_free (p); return TRUE;}static void property_free (char *key, char *value){ g_free (key); g_free (value);}void __IDL_free_properties (GHashTable *table){ if (table) { g_hash_table_foreach (table, (GHFunc) property_free, NULL); g_hash_table_destroy (table); }}/* Free associated node data, regardless of refcounts */static void IDL_tree_free_real (IDL_tree p){ GSList *slist; assert (p != NULL); switch (IDL_NODE_TYPE (p)) { case IDLN_GENTREE: g_hash_table_foreach (IDL_GENTREE (p).children, (GHFunc) tree_free_but_this, NULL); g_hash_table_destroy (IDL_GENTREE (p).children); break; case IDLN_FIXED: g_free (IDL_FIXED (p).value); break; case IDLN_STRING: g_free (IDL_STRING (p).value); break; case IDLN_CHAR: g_free (IDL_CHAR (p).value); break; case IDLN_IDENT: g_free (IDL_IDENT (p).str); g_free (IDL_IDENT_REPO_ID (p)); for (slist = IDL_IDENT (p).comments; slist; slist = slist->next) g_free (slist->data); g_slist_free (IDL_IDENT (p).comments); break; case IDLN_NATIVE: g_free (IDL_NATIVE (p).user_type); break; case IDLN_INTERFACE: break; case IDLN_CODEFRAG: g_free (IDL_CODEFRAG (p).desc); for (slist = IDL_CODEFRAG (p).lines; slist; slist = slist->next) g_free (slist->data); g_slist_free (IDL_CODEFRAG (p).lines); break; default: break; } __IDL_free_properties (IDL_NODE_PROPERTIES (p)); g_free (p);}/* Free node taking into account refcounts */static void __IDL_tree_free (IDL_tree p){ if (p == NULL) return; if (--IDL_NODE_REFS (p) <= 0) IDL_tree_free_real (p);}/* Free a set of references of an entire tree */void IDL_tree_free (IDL_tree p){ IDL_tree q; if (p == NULL) return; switch (IDL_NODE_TYPE (p)) { case IDLN_INTEGER: case IDLN_FLOAT: case IDLN_BOOLEAN: case IDLN_TYPE_FLOAT: case IDLN_TYPE_INTEGER: case IDLN_TYPE_CHAR: case IDLN_TYPE_WIDE_CHAR: case IDLN_TYPE_BOOLEAN: case IDLN_TYPE_OCTET: case IDLN_TYPE_ANY: case IDLN_TYPE_OBJECT: case IDLN_TYPE_TYPECODE: case IDLN_FIXED: case IDLN_STRING: case IDLN_CHAR: case IDLN_IDENT: case IDLN_CODEFRAG: __IDL_tree_free (p); break; case IDLN_LIST: while (p) { IDL_tree_free (IDL_LIST (p).data); q = IDL_LIST (p).next; __IDL_tree_free (p); p = q; } break; case IDLN_GENTREE: g_hash_table_foreach (IDL_GENTREE (p).siblings, (GHFunc) tree_free_but_this, p); g_hash_table_destroy (IDL_GENTREE (p).siblings); __IDL_tree_free (p); break; case IDLN_MEMBER: IDL_tree_free (IDL_MEMBER (p).type_spec); IDL_tree_free (IDL_MEMBER (p).dcls); __IDL_tree_free (p); break; case IDLN_NATIVE: IDL_tree_free (IDL_NATIVE (p).ident); __IDL_tree_free (p); break; case IDLN_TYPE_ENUM: IDL_tree_free (IDL_TYPE_ENUM (p).ident); IDL_tree_free (IDL_TYPE_ENUM (p).enumerator_list); __IDL_tree_free (p); break; case IDLN_TYPE_SEQUENCE: IDL_tree_free (IDL_TYPE_SEQUENCE (p).simple_type_spec); IDL_tree_free (IDL_TYPE_SEQUENCE (p).positive_int_const); __IDL_tree_free (p); break; case IDLN_TYPE_ARRAY: IDL_tree_free (IDL_TYPE_ARRAY (p).ident); IDL_tree_free (IDL_TYPE_ARRAY (p).size_list); __IDL_tree_free (p); break; case IDLN_TYPE_STRUCT: IDL_tree_free (IDL_TYPE_STRUCT (p).ident); IDL_tree_free (IDL_TYPE_STRUCT (p).member_list); __IDL_tree_free (p); break; case IDLN_TYPE_UNION: IDL_tree_free (IDL_TYPE_UNION (p).ident); IDL_tree_free (IDL_TYPE_UNION (p).switch_type_spec); IDL_tree_free (IDL_TYPE_UNION (p).switch_body); __IDL_tree_free (p); break; case IDLN_TYPE_DCL: IDL_tree_free (IDL_TYPE_DCL (p).type_spec); IDL_tree_free (IDL_TYPE_DCL (p).dcls); __IDL_tree_free (p); break; case IDLN_CONST_DCL: IDL_tree_free (IDL_CONST_DCL (p).const_type); IDL_tree_free (IDL_CONST_DCL (p).ident); IDL_tree_free (IDL_CONST_DCL (p).const_exp); __IDL_tree_free (p); break; case IDLN_EXCEPT_DCL: IDL_tree_free (IDL_EXCEPT_DCL (p).ident); IDL_tree_free (IDL_EXCEPT_DCL (p).members); __IDL_tree_free (p); break; case IDLN_ATTR_DCL: IDL_tree_free (IDL_ATTR_DCL (p).param_type_spec); IDL_tree_free (IDL_ATTR_DCL (p).simple_declarations); __IDL_tree_free (p); break; case IDLN_OP_DCL: IDL_tree_free (IDL_OP_DCL (p).op_type_spec); IDL_tree_free (IDL_OP_DCL (p).ident); IDL_tree_free (IDL_OP_DCL (p).parameter_dcls); IDL_tree_free (IDL_OP_DCL (p).raises_expr); IDL_tree_free (IDL_OP_DCL (p).context_expr); __IDL_tree_free (p); break; case IDLN_PARAM_DCL: IDL_tree_free (IDL_PARAM_DCL (p).param_type_spec); IDL_tree_free (IDL_PARAM_DCL (p).simple_declarator); __IDL_tree_free (p); break; case IDLN_FORWARD_DCL: IDL_tree_free (IDL_FORWARD_DCL (p).ident); __IDL_tree_free (p); break; case IDLN_TYPE_STRING: IDL_tree_free (IDL_TYPE_STRING (p).positive_int_const); __IDL_tree_free (p); break; case IDLN_TYPE_WIDE_STRING: IDL_tree_free (IDL_TYPE_WIDE_STRING (p).positive_int_const); __IDL_tree_free (p); break; case IDLN_TYPE_FIXED: IDL_tree_free (IDL_TYPE_FIXED (p).positive_int_const); IDL_tree_free (IDL_TYPE_FIXED (p).integer_lit); __IDL_tree_free (p); break; case IDLN_CASE_STMT: IDL_tree_free (IDL_CASE_STMT (p).labels); IDL_tree_free (IDL_CASE_STMT (p).element_spec); __IDL_tree_free (p); break; case IDLN_INTERFACE: IDL_tree_free (IDL_INTERFACE (p).ident); IDL_tree_free (IDL_INTERFACE (p).inheritance_spec); IDL_tree_free (IDL_INTERFACE (p).body); __IDL_tree_free (p); break; case IDLN_MODULE: IDL_tree_free (IDL_MODULE (p).ident); IDL_tree_free (IDL_MODULE (p).definition_list); __IDL_tree_free (p); break; case IDLN_BINOP: IDL_tree_free (IDL_BINOP (p).left); IDL_tree_free (IDL_BINOP (p).right); __IDL_tree_free (p); break; case IDLN_UNARYOP: IDL_tree_free (IDL_UNARYOP (p).operand); __IDL_tree_free (p); break; default: g_warning ("Free unknown node: %d\n", IDL_NODE_TYPE (p)); break; }}#define C_ESC(a,b) case a: *p++ = b; ++s; breakgchar *IDL_do_escapes (const char *s){ char *p, *q; if (!s) return NULL; p = q = g_malloc (strlen (s) + 1); while (*s) { if (*s != '\\') { *p++ = *s++; continue; } ++s; if (*s == 'x') { char hex[3]; int n; hex[0] = 0; ++s; sscanf (s, "%2[0-9a-fA-F]", hex); s += strlen (hex); sscanf (hex, "%x", &n); *p++ = n; continue; } if (*s >= '0' && *s <= '7') { char oct[4]; int n; oct[0] = 0; sscanf (s, "%3[0-7]", oct); s += strlen (oct); sscanf (oct, "%o", &n); *p++ = n; continue; } switch (*s) { C_ESC ('n','\n'); C_ESC ('t','\t'); C_ESC ('v','\v'); C_ESC ('b','\b'); C_ESC ('r','\r'); C_ESC ('f','\f'); C_ESC ('a','\a'); C_ESC ('\\','\\'); C_ESC ('?','?'); C_ESC ('\'','\''); C_ESC ('"','"'); } } *p = 0; return q;}int IDL_list_length (IDL_tree list){ IDL_tree curitem; int length; for (curitem = list, length = 0; curitem; curitem = IDL_LIST (curitem).next) length++; return length;}IDL_tree IDL_list_nth (IDL_tree list, int n){ IDL_tree curitem; int i; for (curitem = list, i = 0; i < n && curitem; curitem = IDL_LIST (curitem).next, i++) ; return curitem;}const char *IDL_tree_property_get (IDL_tree tree, const char *key){ g_return_val_if_fail (tree != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); if (!IDL_NODE_PROPERTIES (tree)) return NULL; return g_hash_table_lookup (IDL_NODE_PROPERTIES (tree), key);}void IDL_tree_property_set (IDL_tree tree, const char *key, const char *value){ g_return_if_fail (tree != NULL); g_return_if_fail (key != NULL); if (!IDL_NODE_PROPERTIES (tree)) IDL_NODE_PROPERTIES (tree) = g_hash_table_new ( IDL_strcase_hash, IDL_strcase_equal); else if (IDL_tree_property_get (tree, key)) IDL_tree_property_remove (tree, key); g_hash_table_insert (IDL_NODE_PROPERTIES (tree), g_strdup (key), g_strdup (value));}gboolean IDL_tree_property_remove (IDL_tree tree, const char *key){ gboolean removed = FALSE; char *val; g_return_val_if_fail (tree != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); if (!IDL_NODE_PROPERTIES (tree)) return FALSE; if ((val = g_hash_table_lookup (IDL_NODE_PROPERTIES (tree), key))) { g_hash_table_remove (IDL_NODE_PROPERTIES (tree), key); g_free (val); removed = TRUE; } return removed;}static void property_set (char *key, char *value, IDL_tree tree){ IDL_tree_property_set (tree, key, value);}void IDL_tree_properties_copy (IDL_tree from_tree, IDL_tree to_tree){ g_return_if_fail (from_tree != NULL); g_return_if_fail (to_tree != NULL); if (IDL_NODE_PROPERTIES (from_tree)) g_hash_table_foreach (IDL_NODE_PROPERTIES (from_tree), (GHFunc) property_set, to_tree);}typedef struct { IDL_tree *root; GHashTable *removed_nodes;} RemoveListNodeData;static int remove_list_node (IDL_tree p, IDL_tree *list_head, RemoveListNodeData *data){ assert (p != NULL); assert (IDL_NODE_TYPE (p) == IDLN_LIST); if (list_head) *list_head = IDL_list_remove (*list_head, p); else *data->root = IDL_list_remove (*data->root, p); if (data->removed_nodes) { if (!g_hash_table_lookup_extended (data->removed_nodes, p, NULL, NULL)) g_hash_table_insert (data->removed_nodes, p, p); /* We shouldn't need this since we have removed it from the tree, but we might need it for multiple declspec (inhibits) in the same subtree. IDL_tree_walk_in_order (p, (IDL_tree_func) inc_node_ref, NULL); */ } else IDL_tree_free (p); return TRUE;}/* Forward Declaration Resolution */static int load_forward_dcls (IDL_tree_func_data *tfd, GHashTable *table){ if (IDL_NODE_TYPE (tfd->tree) == IDLN_FORWARD_DCL) { char *s = IDL_ns_ident_to_qstring (IDL_FORWARD_DCL (tfd->tree).ident, "::", 0); if (!g_hash_table_lookup_extended (table, s, NULL, NULL)) g_hash_table_insert (table, s, tfd->tree); else g_free (s); } return TRUE;}static int resolve_forward_dcls (IDL_tree_func_data *tfd, GHashTable *table){ if (IDL_NODE_TYPE (tfd->tree) == IDLN_INTERFACE) { char *orig, *s = IDL_ns_ident_to_qstring (IDL_INTERFACE (tfd->tree).ident, "::", 0); if (g_hash_table_lookup_extended (table, s, (gpointer)&orig, NULL)) { g_hash_table_remove (table, orig); g_free (orig); } g_free (s); } return TRUE;}static int print_unresolved_forward_dcls (char *s, IDL_tree p){ if (__IDL_flags & IDLF_PEDANTIC) IDL_tree_error (p, "Unresolved forward declaration `%s'", s); else IDL_tree_warning (p, IDL_WARNING1, "Unresolved forward declaration `%s'", s); g_free (s); return TRUE;}void IDL_tree_process_forward_dcls (IDL_tree *p, IDL_ns ns){ GHashTable *table = g_hash_table_new (IDL_strcase_hash, IDL_strcase_equal); gint total, resolved; IDL_tree_walk_in_order (*p, (IDL_tree_func) load_forward_dcls, table); total = g_hash_table_size (table); IDL_tree_walk_in_order (*p, (IDL_tree_func) resolve_forward_dcls, table); resolved = total - g_hash_table_size (table); g_hash_table_foreach (table, (GHFunc) print_unresolved_forward_dcls, NULL); g_hash_table_destroy (table); if (__IDL_flags & IDLF_VERBOSE) g_message ("Forward declarations resolved: %d of %d", resolved, total);}/* Inhibit Creation Removal */static int load_inhibits (IDL_tree_func_data *tfd, GHashTable *table){ IDL_tree p, q, *list_head; p = tfd->tree; if (p != NULL && IDL_NODE_UP (p) && IDL_NODE_TYPE (IDL_NODE_UP (p)) == IDLN_LIST && IDL_NODE_DECLSPEC (p) & IDLF_DECLSPEC_INHIBIT && !g_hash_table_lookup_extended (table, IDL_NODE_UP (p), NULL, NULL)) { list_head = NULL; q = IDL_NODE_UP (IDL_NODE_UP (p)); if (q) { switch (IDL_NODE_TYPE (q)) { case IDLN_MODULE: list_head = &IDL_MODULE (q).definition_list; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -