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

📄 f_loadlabel.c

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