📄 f_loadfield.c
字号:
/* * f_loadfield.c * 域元素装载模块 * 作者:张中庆 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "xmlparse.h"#include "f_menuhead.h"F_FIELDNODE *load_field=NULL;//域链表int load_field_num=-1;//域数目int current_field_id=-1;//当前的域号#define FIELD_MAX_DEPTH 3 //最大深度#define TEXT_MAX_LENGTH 20 //最大深度#define NAME_MAX_LENGTH 20 //域名最大长度#define DEFVALUE_MAX_LENGTH 20 //域的默认值的最大长度int field_current_depth=-1;char field_mark_name[FIELD_MAX_DEPTH][20];F_FIELDNODE* tmp_field=NULL;//临时的域节点char tempchar[100];void field_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'; Convert8859(tmp_buf); if(strlen(tmp_buf)==0){ free(tmp_buf); return; } if(field_current_depth==1){ if(strcmp(field_mark_name[field_current_depth],"field_num")==0){ load_field_num=atoi(tmp_buf); load_field=(F_FIELDNODE*)calloc(load_field_num,sizeof(F_FIELDNODE)); memset(load_field,0x0,sizeof(F_FIELDNODE)*load_field_num); } } else if(field_current_depth==2){//如果当前深度是2,则表明可能进入域属性区域 if(strcmp(field_mark_name[field_current_depth],"field_name")==0) strcpy(tmp_field->field_name,tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_x")==0) tmp_field->begin_x=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_y")==0) tmp_field->begin_y=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_length")==0) tmp_field->field_length=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_adjust")==0) tmp_field->field_adjust=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_bkgr_color")==0) tmp_field->field_bkgr_color=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_fore_color")==0) tmp_field->field_fore_color=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_fill")==0) tmp_field->field_fill=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_fix")==0) tmp_field->field_fix=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_secret")==0) tmp_field->field_secret=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_auto_exit")==0) tmp_field->field_autoexit=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_visible")==0) tmp_field->field_visible=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_enable")==0) tmp_field->field_enable=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_type")==0) tmp_field->field_type=atoi(tmp_buf); else if(strcmp(field_mark_name[field_current_depth],"field_dft_value")==0) strcpy(tmp_field->field_def_value,tmp_buf); } if(tmp_buf!=NULL) free(tmp_buf);}//遇到<a>格式的时候采取的动作,user_data为自动传送的解析器的句柄,name为域内容的大写,attr为属性 void field_start_element( void * user_data, const char * name, const char ** atts ){ field_current_depth++;//只要遇到<a>类似的域,当前深度就加一. strcpy(field_mark_name[field_current_depth],name);//} void field_end_element( void * user_data, const char * name ){ int id=-1; if(field_current_depth==1&&strcmp(name,"field_node")==0){ current_field_id++; id=current_field_id; if(id>-1 && id<load_field_num){ load_field[id].field_name=(char*)malloc(sizeof(char*)*NAME_MAX_LENGTH); memset(load_field[id].field_name,0x0,sizeof(char*)*NAME_MAX_LENGTH); strcpy(load_field[id].field_name,tmp_field->field_name); load_field[id].id=id; load_field[id].begin_y=tmp_field->begin_y; load_field[id].begin_x=tmp_field->begin_x; load_field[id].field_length=tmp_field->field_length; load_field[id].field_bkgr_color=tmp_field->field_bkgr_color; load_field[id].field_fore_color=tmp_field->field_fore_color; load_field[id].field_adjust=tmp_field->field_adjust; load_field[id].field_fix=tmp_field->field_fix; load_field[id].field_fill=tmp_field->field_fill; load_field[id].field_visible=tmp_field->field_visible; load_field[id].field_enable=tmp_field->field_enable; load_field[id].field_optional=tmp_field->field_optional; load_field[id].field_autoexit=tmp_field->field_autoexit; load_field[id].field_secret=tmp_field->field_secret; load_field[id].field_type=tmp_field->field_type; load_field[id].field_def_value=(char*)malloc(sizeof(char*)*DEFVALUE_MAX_LENGTH); memset(load_field[id].field_def_value,0x0,sizeof(char*)*DEFVALUE_MAX_LENGTH); strcpy(load_field[id].field_def_value,tmp_field->field_def_value); memset(tmp_field,0x0,sizeof(F_FIELDNODE)); free(tmp_field->field_name); tmp_field->field_name=(char*)malloc(sizeof(NAME_MAX_LENGTH)); memset(tmp_field->field_name,0x0,sizeof(char*)*NAME_MAX_LENGTH); free(tmp_field->field_def_value); tmp_field->field_def_value=(char*)malloc(sizeof(DEFVALUE_MAX_LENGTH)); memset(tmp_field->field_def_value,0x0,sizeof(char*)*DEFVALUE_MAX_LENGTH); } } field_current_depth--;}/* * LOAD 数据元 XML 数据,fielddata为链表地址 */int LoadFieldXML( char * xmlfile, F_FIELDLINK** fieldlink ){ int i; char buffer[ BUFSIZ ]; XML_Parser parser; int len, done; int depth; FILE * fp; current_field_id=-1;//当前的域号 load_field=NULL;//域链表 load_field_num=-1;//域数目 field_current_depth=-1; tmp_field=NULL;//临时的域节点 if ( ( fp = fopen( xmlfile, "r" ) ) == NULL ) return ( -1 ); *fieldlink = (F_FIELDLINK*)malloc( sizeof( F_FIELDLINK) ); memset( *fieldlink, 0, sizeof( F_FIELDLINK ) ); tmp_field=(F_FIELDNODE*)malloc(sizeof(F_FIELDNODE)); memset(tmp_field,0x0,sizeof(F_FIELDNODE)); /*分配field_name空间*/ tmp_field->field_name=(char*)malloc(sizeof(NAME_MAX_LENGTH)); memset(tmp_field->field_name,0x0,sizeof(char*)*NAME_MAX_LENGTH); /*分配默认值的空间*/ tmp_field->field_def_value=(char*)malloc(sizeof(DEFVALUE_MAX_LENGTH)); memset(tmp_field->field_def_value,0x0,sizeof(char*)*DEFVALUE_MAX_LENGTH); load_field=NULL; parser = XML_ParserCreate( NULL ); XML_SetUserData( parser, &depth ); XML_SetElementHandler( parser, field_start_element, field_end_element ); XML_SetCharacterDataHandler( parser, field_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("发生错误行%d\n",XML_GetCurrentLineNumber(parser)); XML_ParserFree( parser ); fclose( fp ); return ( -1 ); } } while ( !done ); XML_ParserFree( parser ); fclose( fp ); for(i=0;i<load_field_num;i++) load_field[i].id=i; (*fieldlink)->field_num=load_field_num; (*fieldlink)->p_field=load_field; return ( 0 );}int FieldFree(F_FIELDLINK* fieldlink){ int i; if(fieldlink!=NULL){ if(fieldlink->p_field!=NULL) { for(i=0;i<fieldlink->field_num;i++) { if(fieldlink->p_field[i].field_name!=NULL) free(fieldlink->p_field[i].field_name); } free(fieldlink->p_field); } free(fieldlink); } fieldlink=NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -