⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 CORBA上的libIDL源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -