📄 f_loadlabel.c
字号:
/* * loadlabel.c * 标签元素装载模块 * 作者:张中庆 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "xmlparse.h"#include "f_menuhead.h"F_LABELNODE *load_label=NULL;//标签链表int load_label_num=-1;//标签数目int current_label_id=-1;//当前的标签号#define LABEL_MAX_DEPTH 3 //最大深度#define TEXT_MAX_LENGTH 20 //最大深度int label_current_depth=-1;char label_mark_name[LABEL_MAX_DEPTH][20];F_LABELNODE* tmp_label=NULL;//临时的标签节点void label_get_data( XML_Parser parser, const XML_Char * s, int len ){ char* tmp_buf; char* p_str; p_str=(char*)s; tmp_buf=(char*)malloc(len+1); strncpy(tmp_buf,p_str,len);// tmp_buf[len]='\0'; //LTrim(tmp_buf); //RTrim(tmp_buf); Convert8859( tmp_buf ); if(strlen(tmp_buf)==0){ free(tmp_buf); return; } if(label_current_depth==1){ if(strcmp(label_mark_name[label_current_depth],"label_num")==0){ load_label_num=atoi(tmp_buf); load_label=(F_LABELNODE*)calloc(load_label_num,sizeof(F_LABELNODE)); memset(load_label,0x0,sizeof(F_LABELNODE)*load_label_num); } } else if(label_current_depth==2){//如果当前深度是2,则表明可能进入标签属性区域 if(strcmp(label_mark_name[label_current_depth],"label_text")==0) strcpy(tmp_label->label_text,tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_x")==0) tmp_label->begin_x=atoi(tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_y")==0) tmp_label->begin_y=atoi(tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_attr")==0) tmp_label->attrs=atoi(tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_length")==0) tmp_label->label_length=atoi(tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_bkgr_color")==0) tmp_label->bkgr_color=atoi(tmp_buf); else if(strcmp(label_mark_name[label_current_depth],"label_fore_color")==0) tmp_label->fore_color=atoi(tmp_buf); } if(tmp_buf!=NULL) free(tmp_buf);}//遇到<a>格式的时候采取的动作,user_data为自动传送的解析器的句柄,name为标签内容的大写,attr为属性 void label_start_element( void * user_data, const char * name, const char ** atts ){ label_current_depth++;//只要遇到<a>类似的标签,当前深度就加一. strcpy(label_mark_name[label_current_depth],name);//} void label_end_element( void * user_data, const char * name ){ int id=-1; if(label_current_depth==1&&strcmp(name,"label_node")==0){ current_label_id++; id=current_label_id; if(id>-1 && id<load_label_num){ load_label[id].label_text=(char*)malloc(sizeof(char*)*TEXT_MAX_LENGTH); memset(load_label[id].label_text,0x0,sizeof(char*)*TEXT_MAX_LENGTH); strcpy(load_label[id].label_text,tmp_label->label_text); load_label[id].id=id; load_label[id].begin_y=tmp_label->begin_y; load_label[id].begin_x=tmp_label->begin_x; load_label[id].label_length=tmp_label->label_length; load_label[id].bkgr_color=tmp_label->bkgr_color; load_label[id].fore_color=tmp_label->fore_color; load_label[id].attrs=tmp_label->attrs; memset(tmp_label,0x0,sizeof(F_LABELNODE)); free(tmp_label->label_text); tmp_label->label_text=(char*)malloc(sizeof(TEXT_MAX_LENGTH)); memset(tmp_label->label_text,0x0,sizeof(char*)*TEXT_MAX_LENGTH); } } label_current_depth--;}/* * LOAD 数据元 XML 数据,labeldata为链表地址 */int LoadLabelXML( char * xmlfile, F_LABELLINK** labellink ){ int i, j; char buffer[ BUFSIZ ]; XML_Parser parser; int len, done; int depth; FILE * fp; current_label_id=-1;//当前的标签号 load_label=NULL;//标签链表 load_label_num=-1;//标签数目 label_current_depth=-1; tmp_label=NULL;//临时的标签节点 if((fp = fopen( xmlfile, "r" )) == NULL ) return ( -1 ); *labellink = (F_LABELLINK*)malloc( sizeof( F_LABELLINK) ); memset( *labellink, 0, sizeof( F_LABELLINK ) ); tmp_label=(F_LABELNODE*)malloc(sizeof(F_LABELNODE)); memset(tmp_label,0x0,sizeof(F_LABELNODE)); tmp_label->label_text=(char*)malloc(sizeof(TEXT_MAX_LENGTH)); memset(tmp_label->label_text,0x0,sizeof(char*)*TEXT_MAX_LENGTH); load_label=NULL; parser = XML_ParserCreate( NULL ); XML_SetUserData( parser, &depth ); XML_SetElementHandler( parser, label_start_element, label_end_element ); XML_SetCharacterDataHandler( parser, label_get_data ); do { buffer[0] = 0x0; if ( fgets( buffer, sizeof( buffer ), fp ) == NULL ) done = 1; else done = 0; len = strlen( buffer ); if ( !XML_Parse( parser, buffer, len, done ) ) { printf( XML_ErrorString( XML_GetErrorCode( parser ) ) ); printf("error occurs at line %d\n",XML_GetCurrentLineNumber(parser)); XML_ParserFree( parser ); fclose( fp ); return ( -1 ); } } while ( !done ); XML_ParserFree( parser ); fclose( fp ); for(i=0;i<load_label_num;i++) load_label[i].id=i; (*labellink)->label_num=load_label_num; (*labellink)->p_label=load_label; return ( 0 );}int LabelFree(F_LABELLINK* labellink){ int i; if(labellink!=NULL){ if(labellink->p_label!=NULL) { for(i=0;i<labellink->label_num;i++) { if(labellink->p_label[i].label_text!=NULL) free(labellink->p_label[i].label_text); } free(labellink->p_label); } free(labellink); } labellink=NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -