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

📄 loader_bt.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
			}		} else {			GF_Node *n = gf_bt_sf_node(parser, str, NULL, isDEF ? szDefName : NULL);			isDEF = 0;			if (!n) goto err;			if (0 && isDEF) {				u32 ID = gf_bt_get_def_id(parser, szDefName);				isDEF = 0;				gf_node_set_id(n, ID, szDefName);			}			gf_sg_proto_add_node_code(proto, n);		}	}	gf_bt_resolve_routes(parser, 1);	gf_bt_check_unresolved_nodes(parser);	parser->load->scene_graph = sg;	parser->parsing_proto = prevproto;	return parser->last_error;err:	if (proto_list) gf_list_del_item(proto_list, proto);	gf_sg_proto_del(proto);	return parser->last_error;}GF_Route *gf_bt_parse_route(GF_BTParser *parser, Bool skip_def, Bool is_insert, GF_Command *com){	GF_Route *r;	char *str, nstr[1000], rName[1000];	u32 rID;	GF_Node *orig, *dest;	GF_FieldInfo orig_field, dest_field;	GF_Err e;	rID = 0;	strcpy(nstr, gf_bt_get_next(parser, 1));	if (!skip_def && !strcmp(nstr, "DEF")) {		str = gf_bt_get_next(parser, 0);		strcpy(rName, str);		rID = gf_bt_get_route(parser, rName);		if (!rID && (str[0]=='R') ) {			rID = atoi(&str[1]);			if (rID) {				rID++;				if (gf_bt_route_id_used(parser, rID)) rID = 0;			}		}		if (!rID) rID = gf_bt_get_next_route_id(parser);		strcpy(nstr, gf_bt_get_next(parser, 1));	}	orig = gf_bt_peek_node(parser, nstr);	if (!orig) {		gf_bt_report(parser, GF_BAD_PARAM, "cannot find node %s", nstr);		return NULL;	}	if (!gf_bt_check_code(parser, '.')) {		gf_bt_report(parser, GF_BAD_PARAM, ". expected in route decl");		return NULL;	}	str = gf_bt_get_next(parser, 0);	e = gf_node_get_field_by_name(orig, str, &orig_field);	/*VRML loosy syntax*/	if ((e != GF_OK) && parser->is_wrl && !strnicmp(str, "set_", 4)) 		e = gf_node_get_field_by_name(orig, &str[4], &orig_field);	if ((e != GF_OK) && parser->is_wrl && strstr(str, "_changed")) {		char *s = strstr(str, "_changed");		s[0] = 0;		e = gf_node_get_field_by_name(orig, str, &orig_field);	}	if (e != GF_OK) {		gf_bt_report(parser, GF_BAD_PARAM, "%s not a field of node %s (%s)", str, gf_node_get_name(orig), gf_node_get_class_name(orig));		return NULL;	}	str = gf_bt_get_next(parser, 0);	if (strcmp(str, "TO")) {		gf_bt_report(parser, GF_BAD_PARAM, "TO expected in route declaration - got \"%s\"", str);		return NULL;	}	strcpy(nstr, gf_bt_get_next(parser, 1));	dest = gf_bt_peek_node(parser, nstr);	if (!dest) {		gf_bt_report(parser, GF_BAD_PARAM, "cannot find node %s", nstr);		return NULL;	}	if (!gf_bt_check_code(parser, '.')) {		gf_bt_report(parser, GF_BAD_PARAM, ". expected in route decl");		return NULL;	}	str = gf_bt_get_next(parser, 0);	e = gf_node_get_field_by_name(dest, str, &dest_field);	/*VRML loosy syntax*/	if ((e != GF_OK) && parser->is_wrl && !strnicmp(str, "set_", 4)) 		e = gf_node_get_field_by_name(dest, &str[4], &dest_field);		if ((e != GF_OK) && parser->is_wrl && strstr(str, "_changed")) {		char *s = strstr(str, "_changed");		s[0] = 0;		e = gf_node_get_field_by_name(dest, str, &dest_field);	}	if (e != GF_OK) {		gf_bt_report(parser, GF_BAD_PARAM, "%s not a field of node %s (%s)", str, gf_node_get_name(dest), gf_node_get_class_name(dest));		return NULL;	}	if (com) {		com->fromNodeID = gf_node_get_id(orig);		com->fromFieldIndex = orig_field.fieldIndex;		com->toNodeID = gf_node_get_id(dest);		com->toFieldIndex = dest_field.fieldIndex;		if (rID) {			com->RouteID = rID;			com->def_name = strdup(rName);			/*whenever inserting routes, keep track of max defined ID*/			if (is_insert) {				gf_sg_set_max_defined_route_id(parser->load->scene_graph, rID);				if (parser->load->ctx && (rID>parser->load->ctx->max_route_id)) 					parser->load->ctx->max_route_id = rID;			}		}		return NULL;	}	r = gf_sg_route_new(parser->load->scene_graph, orig, orig_field.fieldIndex, dest, dest_field.fieldIndex);	if (r && rID) {		gf_sg_route_set_id(r, rID);		gf_sg_route_set_name(r, rName);	}	return r;}void gf_bt_resolve_routes(GF_BTParser *parser, Bool clean){	GF_Command *com;	/*resolve all commands*/	while(gf_list_count(parser->unresolved_routes) ) {		com = (GF_Command *)gf_list_get(parser->unresolved_routes, 0);		gf_list_rem(parser->unresolved_routes, 0);		switch (com->tag) {		case GF_SG_ROUTE_DELETE:		case GF_SG_ROUTE_REPLACE:			com->RouteID = gf_bt_get_route(parser, com->unres_name);			if (!com->RouteID) gf_bt_report(parser, GF_BAD_PARAM, "Cannot resolve Route %s", com->unres_name);			free(com->unres_name);			com->unres_name = NULL;			com->unresolved = 0;			break;		}	}	if (!clean) return;	while (gf_list_count(parser->inserted_routes)) gf_list_rem(parser->inserted_routes, 0);}static void bd_set_com_node(GF_Command *com, GF_Node *node){	com->node = node;	gf_node_register(com->node, NULL);}GF_Err gf_bt_parse_bifs_command(GF_BTParser *parser, char *name, GF_List *cmdList){	s32 pos;	GF_Route *r;	GF_Node *n, *newnode;	GF_Command *com;	GF_CommandField *inf;	GF_FieldInfo info;	char *str, field[1000];	if (!name) {		str = gf_bt_get_next(parser, 0);	} else {		str = name;	}	com = NULL;	pos = -2;	/*REPLACE commands*/ 	if (!strcmp(str, "REPLACE")) {		str = gf_bt_get_next(parser, 1);		if (!strcmp(str, "ROUTE")) {			str = gf_bt_get_next(parser, 0);			r = gf_sg_route_find_by_name(parser->load->scene_graph, str);			if (!r) strcpy(field, str);			str = gf_bt_get_next(parser, 0);			if (strcmp(str, "BY")) {				return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str);			}			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_REPLACE);			if (r) {				com->RouteID = r->ID;			} else {				com->unres_name = strdup(field);				com->unresolved = 1;				gf_list_add(parser->unresolved_routes, com);			}			gf_bt_parse_route(parser, 1, 0, com);			gf_list_add(cmdList, com);			return parser->last_error;		} 		/*scene replace*/		if (!strcmp(str, "SCENE")) {			str = gf_bt_get_next(parser, 0);			if (strcmp(str, "BY")) {				return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str);			}			gf_bt_resolve_routes(parser, 1);			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_SCENE_REPLACE);			while (gf_list_count(parser->def_nodes)) gf_list_rem(parser->def_nodes, 0);			/*note we're extremely lucky in BT, REPLACE SCENE can't use protos, it's just a top scene*/			n = gf_bt_sf_node(parser, NULL, NULL, NULL);			if (parser->last_error) goto err;			com->node = n;			gf_list_add(cmdList, com);			parser->cur_com = com;			return GF_OK;		}		if (!strcmp(str, "LAST")) pos = -1;		else if (!strcmp(str, "BEGIN")) pos = 0;		gf_bt_check_code(parser, '.');		strcpy(field, str);		n = gf_bt_peek_node(parser, str);		if (!n) return gf_bt_report(parser, GF_BAD_PARAM, "%s: unknown node", field);		str = gf_bt_get_next(parser, 0);		strcpy(field, str);		if (gf_bt_check_code(parser, '[')) {			if ( (parser->last_error = gf_bt_parse_int(parser, "index", &pos)) ) return parser->last_error;			if (!gf_bt_check_code(parser, ']')) 				return gf_bt_report(parser, GF_BAD_PARAM, "] expected");		}		/*node replace*/		if (!strcmp(field, "BY")) {			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_REPLACE);			bd_set_com_node(com, n);			inf = gf_sg_command_field_new(com);			inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL);			inf->fieldType = GF_SG_VRML_SFNODE;			inf->field_ptr = &inf->new_node;			gf_list_add(cmdList, com);			parser->cur_com = com;			return parser->last_error;		}		str = gf_bt_get_next(parser, 0);		if (strcmp(str, "BY")) return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str);		parser->last_error = gf_node_get_field_by_name(n, field, &info);		if (parser->last_error) 			return gf_bt_report(parser, parser->last_error, "%s: Unknown node field", field);		/*field replace*/		if (pos==-2) {			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_FIELD_REPLACE);			bd_set_com_node(com, n);			inf = gf_sg_command_field_new(com);			inf->fieldIndex = info.fieldIndex;			inf->fieldType = info.fieldType;			switch (info.fieldType) {			case GF_SG_VRML_SFNODE:				inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL);				inf->field_ptr = &inf->new_node;				if (!gf_bt_check_ndt(parser, &info, inf->new_node, n)) goto err;				break;			case GF_SG_VRML_MFNODE:			{				GF_ChildNodeItem *last = NULL;				if (!gf_bt_check_code(parser, '[')) break;				inf->field_ptr = &inf->node_list;				while (!gf_bt_check_code(parser, ']')) {					newnode = gf_bt_sf_node(parser, NULL, NULL, NULL);					if (!newnode) goto err;					if (parser->last_error!=GF_OK) goto err;					if (!gf_bt_check_ndt(parser, &info, newnode, n)) goto err;					gf_node_list_add_child_last(& inf->node_list, newnode, &last);				}			}				break;			default:				inf->field_ptr = gf_sg_vrml_field_pointer_new(info.fieldType);				info.far_ptr = inf->field_ptr;				if (gf_sg_vrml_is_sf_field(info.fieldType)) {					gf_bt_sffield(parser, &info, n);				} else {					gf_bt_mffield(parser, &info, n);				}				if (parser->last_error) goto err;				break;			}			gf_list_add(cmdList, com);			parser->cur_com = com;			return parser->last_error;		}		/*indexed field replace*/		com = gf_sg_command_new(parser->load->scene_graph, GF_SG_INDEXED_REPLACE);		bd_set_com_node(com, n);		inf = gf_sg_command_field_new(com);		inf->pos = pos;		inf->fieldIndex = info.fieldIndex;		if (gf_sg_vrml_is_sf_field(info.fieldType)) {			gf_bt_report(parser, GF_BAD_PARAM, "%s: MF type field expected", info.name);			goto err;		}		inf->fieldType = gf_sg_vrml_get_sf_type(info.fieldType);		switch (info.fieldType) {		case GF_SG_VRML_MFNODE:			inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL);			inf->field_ptr = &inf->new_node; 			break;		default:			info.fieldType = inf->fieldType;			info.far_ptr = inf->field_ptr = gf_sg_vrml_field_pointer_new(inf->fieldType);			gf_bt_sffield(parser, &info, n);			break;		}		if (parser->last_error) goto err;		gf_list_add(cmdList, com);		parser->cur_com = com;		return parser->last_error;	}	/*INSERT commands*/	if (!strcmp(str, "INSERT") || !strcmp(str, "APPEND")) {		Bool is_append = !strcmp(str, "APPEND") ? 1 : 0;		str = gf_bt_get_next(parser, 0);		if (!strcmp(str, "ROUTE")) {			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_INSERT);			gf_bt_parse_route(parser, 0, 1, com);			if (parser->last_error) goto err;			gf_list_add(cmdList, com);			gf_list_add(parser->inserted_routes, com);			parser->cur_com = com;			return GF_OK;		}		if (strcmp(str, "AT") && strcmp(str, "TO")) {			return gf_bt_report(parser, GF_BAD_PARAM, (char*) (is_append ? "TO expected got %s" : "AT expected got %s"), str);		}		str = gf_bt_get_next(parser, 1);		strcpy(field, str);		n = gf_bt_peek_node(parser, str);		if (!n) {			return gf_bt_report(parser, GF_BAD_PARAM, "%s: Unknown node", field);		}		if (!gf_bt_check_code(parser, '.')) {			return gf_bt_report(parser, GF_BAD_PARAM, ". expected");		}		str = gf_bt_get_next(parser, 1);		strcpy(field, str);		if (!is_append) {			if (!gf_bt_check_code(parser, '[')) {				return gf_bt_report(parser, GF_BAD_PARAM, "[ expected");			}			gf_bt_parse_int(parser, "index", &pos);			if (!gf_bt_check_code(parser, ']')) {				return gf_bt_report(parser, GF_BAD_PARAM, "] expected");			}		} else {			if (gf_bt_check_code(parser, '[')) {				return gf_bt_report(parser, GF_BAD_PARAM, "[ unexpected in Append command");			}			pos = -1;		}		if (!strcmp(field, "children")) {			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_INSERT);			bd_set_com_node(com, n);			inf = gf_sg_command_field_new(com);			inf->pos = pos;			inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL);			inf->fieldType = GF_SG_VRML_SFNODE;			inf->field_ptr = &inf->new_node;			if (parser->last_error) goto err;			parser->cur_com = com;			return gf_list_add(cmdList, com);		}		gf_node_get_field_by_name(n, field, &info);		if (gf_sg_vrml_is_sf_field(info.fieldType)) {			gf_bt_report(parser, GF_BAD_PARAM, "%s: MF type field expected", info.name);			goto err;		}		com = gf_sg_command_new(parser->load->scene_graph, GF_SG_INDEXED_INSERT);		bd_set_com_node(com, n);		inf = gf_sg_command_field_new(com);		inf->pos = pos;		inf->fieldIndex = info.fieldIndex;		inf->fieldType = gf_sg_vrml_get_sf_type(info.fieldType);		switch (info.fieldType) {		case GF_SG_VRML_MFNODE:			inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL);			inf->field_ptr = &inf->new_node;			break;		default:			info.fieldType = inf->fieldType;			inf->field_ptr = gf_sg_vrml_field_pointer_new(inf->fieldType);			info.far_ptr = inf->field_ptr;			gf_bt_sffield(parser, &info, n);			break;		}		if (parser->last_error) goto err;		gf_list_add(cmdList, com);		parser->cur_com = com;		return parser->last_error;	}	/*DELETE commands*/	if (!strcmp(str, "DELETE")) {		str = gf_bt_get_next(parser, 1);		if (!strcmp(str, "ROUTE")) {			str = gf_bt_get_next(parser, 0);			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_DELETE);			com->RouteID = gf_bt_get_route(parser, str);			if (!com->RouteID) {				com->unres_name = strdup(str);				com->unresolved = 1;				gf_list_add(parser->unresolved_routes, com);			}			/*for bt<->xmt conversions*/			com->def_name = strdup(str);			return gf_list_add(cmdList, com);		}		strcpy(field, str);		n = gf_bt_peek_node(parser, str);		if (!n) {			return gf_bt_report(parser, GF_BAD_PARAM, "DELETE %s: Unknown Node", field);		}		if (!gf_bt_check_code(parser, '.')) {			com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_DELETE);			bd_set_com_node(com, n);			return gf_list_add(cmdList

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -