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

📄 f_loadfield.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 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 + -