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

📄 parse.c

📁 基于html文件解析、处理函数
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <time.h> 
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/poll.h> 
#include <sys/ipc.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <signal.h>
#include <termios.h>

#include "mydemo.h"

#include "parse.h"

//#include "var.h"
//变量定义

char *source="LM_Header|2766|cmd=Login_Ok|<DATABLOCK><tabwkg/column=15/row=2><tbody><tb><S10.15.1071/72|07-11-036><0><190><20><2703095><38><130><0802210002I><EWO-07110318><0><prtno01><2/21/2008 9:50:0><0><2/21/2008 8:0:0><2/21/2008 17:30:0></tb><tb><S10.15.1071/72|07-11-036><0><185><20><2703095><38><130><0802210002H><EWO-07110318><0><prtno01><2/21/2008 9:50:0><0><2/21/2008 8:0:0><2/21/2008 17:30:0></tb></tbody></tabwkg><tabpch/count=2><pch/id=S10.15.1071/72|07-11-036/colum=1/row=2><tbody><tb><S10.15.1071/72|07-11-036-0001></tb><tb><S10.15.1071/72|07-11-036-0002></tb><tb><S10.15.1071/72|07-11-036-0003></tb><tb><S10.15.1071/72|07-11-036-0004></tb></tbody></pch><pch/id=S10.15.1071/72|07-11-036/column=1/row=20><tbody><tb><S10.15.1071/72|07-11-036-0001></tb><tb><S10.15.1071/72|07-11-036-0002></tb><tb><S10.15.1071/72|07-11-036-0003></tb><tb><S10.15.1071/72|07-11-036-0004></tb></tbody></pch></tabpch><tabfj/column=2/row=5><tbody><tb><001><郑工></tb><tb><0401><钱工></tb><tb><0402><高工></tb><tb><0403><韩工></tb><tb><0404><吴工></tb><tb><0405><齐工></tb></tbody></tabfj><taberror/column=2/row=2><tbody><tb><001><按工艺要求试制和试验></tb><tb><002><修理发动机原带故障></tb><tb><101><毛料工部提供毛料质量问题></tb><tb><102><外购原材料质量问题></tb><tb></tbody></taberror></DATABLOCK>|LM_End";

const char *strtab0="<tabwkg";
const char *strtab1="</tabwkg>";

const char *strctab0="<tabpch";
const char *strctab1="</tabpch>";

const char *strc0="count=";

const char *strcpch0="<pch";
const char *strcpch1="</pch>";

const char *strfj0="<tabfj";
const char *strfj1="</tabfj>";

const char *strtaberr0="<taberror";
const char *strtaberr1="</taberror>";

const char *strtabgw0="<gwinfo";
const char *strtabgw1="</gwinfo>";

const char *str0="column=";
const char *str1="row=";
const char *str2="<th>";
const char *str3="</th>";
const char *str4="<tb>";
const char *str5="</tb>";
const char *str6="<";
const char *str7=">";
const char *str8="<tbody>";
const char *str9="</tbody>";

static char *p_str;
//-----信息表
char *load(char *p,int row_num ,int colum_num,TASK_A *plist)
{
	int i;
	int j;
	char a;
	i=0;
	j=0;
	if( (*p) == '<' )
	{
		p++;
		while( ((*p) != '>') && ((*p) != '\0') )
		{			
			a = *p;
			switch(colum_num)
			{     
			     //显示项
			       case 0:
				   	if(i<99)
					(plist+row_num)->UNITS[i] = a;//顺序号/批号
					else
					(plist+row_num)->UNITS[99] = '\0';//顺序号/批号
					break;
				case 1:
					(plist+row_num)->BXORUTFLAG = a;//类型标志
					break;
				case 2:
					if(i<31)
					(plist+row_num)->SEQNO[i] = a;//加工工序
					else 
					(plist+row_num)->SEQNO[31] = '\0';//加工工序
					break;
				case 3:
					if(i<9)
					(plist+row_num)->JOBDISQTY[i] = a;//派工数
					else 
					(plist+row_num)->JOBDISQTY[9] = '\0';//派工数
					break;
				case 4:
					if(i<23)
					(plist+row_num)->MACHNO[i] = a;//使用设备
					else 
					(plist+row_num)->MACHNO[23] = '\0';//使用设备
					break;
				case 5:
					if(i<9)
					(plist+row_num)->BXNUM[i] = a;//领料数
					else 						
					(plist+row_num)->BXNUM[9] = '\0';//领料数
					break;
				case 6:
					if(i<31)
					(plist+row_num)->CURRSEQ[i] = a;//当前工序
                                   else
					(plist+row_num)->CURRSEQ[31] = '\0';//当前工序
					break;
					//属性项
				case 7:
					if(i<19)
					(plist+row_num)->JOBDISNO[i] = a;//派工号
					else
					(plist+row_num)->JOBDISNO[19] = '\0';//派工号
					break;
				case 8:
					if(i<17)
					(plist+row_num)->MESWONO[i] = a;//工作订单号
					else
					(plist+row_num)->MESWONO[17] = '\0';//工作订单号
					break;					
				case 9:
					if(i<9)
					(plist+row_num)->FACTAWALQTY[i] = a;//废品数
					else
					(plist+row_num)->FACTAWALQTY[9] = '\0';//废品数
					break;
				case 10:
					if(i<49)
					(plist+row_num)->PRTNO[i] = a;//物料号
					else
					(plist+row_num)->PRTNO[49] = '\0';//物料号
					break;
				case 11:
					if(i<29)
					(plist+row_num)->DISTIME[i] = a;//派工时间
					else
					(plist+row_num)->DISTIME[29] = '\0';//派工时间
					break;
				case 12:
					if(i<9)
					(plist+row_num)->FININUM[i] = a;//完工数
					else						
					(plist+row_num)->FININUM[9] = '\0';//完工数
					break;
				case 13:
					if(i<29)
					(plist+row_num)->WORKBEGDAT[i] = a;//计划开工时间
					else 
					(plist+row_num)->WORKBEGDAT[29] = '\0';//计划开工时间
					break;
				case 14:
					if(i<29)
					(plist+row_num)->WORKENDDAT[i] = a;//计划完工时间
					else
					(plist+row_num)->WORKENDDAT[29] = '\0';//计划完工时间
					break;
					default:
						break;
			}
			p++;
			i++;
		}
		switch(colum_num)
			{    
			          //显示项
			       case 0:
					(plist+row_num)->UNITS[i] = '\0';//顺序号/批号
					break;
				case 1:
					//(plist+row_num)->BXORUTFLAG = '\0';//类型标志
					break;
				case 2:
					(plist+row_num)->SEQNO[i] ='\0';//加工工序
					break;
				case 3:
					(plist+row_num)->JOBDISQTY[i] = '\0';//派工数
					break;
				case 4:
					(plist+row_num)->MACHNO[i] = '\0';//使用设备
					break;
				case 5:
					(plist+row_num)->BXNUM[i] = '\0';//领料数
					break;
				case 6:
					(plist+row_num)->CURRSEQ[i] = '\0';//当前工序
					break;
					//属性项
				case 7:
					(plist+row_num)->JOBDISNO[i] = '\0';//派工号
					break;
				case 8:
					(plist+row_num)->MESWONO[i] = '\0';//工作订单号
					break;					
				case 9:
					(plist+row_num)->FACTAWALQTY[i] = '\0';//废品数
					break;
				case 10:
					(plist+row_num)->PRTNO[i] = '\0';//物料号
					break;
				case 11:
					(plist+row_num)->DISTIME[i] = '\0';//派工时间
					break;
				case 12:
					(plist+row_num)->FININUM[i] = '\0';//完工数
					break;
				case 13:
					(plist+row_num)->WORKBEGDAT[i] = '\0';//计划开工时间
					break;
				case 14:
					(plist+row_num)->WORKENDDAT[i] = '\0';//计划完工时间
					break;
					default:
						break;
			}
		if( (*p) == '\0' )
			return NULL;//错误信息
		if( (*p) == '>' )
		{
			p++;
			i++;
			return p;
		}
	}
	else
		return NULL;	
	return p;
}
char *loadtab(char *p,int row,TASK_A *plist)
{
	int i_c;
	i_c=0;//列数
	while( (memcmp(p,str5,5)!=0) && ((*p)!='\0' ))//不是结束符</tb>
	{
		if(strstr(p,str6)==NULL)
			p++;
	    else if(strstr(p,str6)!=NULL)
		{
		p = load(p,row,i_c,plist);
		if(p==NULL)
			return NULL;
		i_c++;
		}
	}
	if(!(memcmp(p,str5,5)))//是结束符
	{
		p = p+5;
	}
	else
	   p = NULL;
	return p;
}
//parse tabplan information function
PARSE_T parse_tab(char *p,TASK_A *plist)
{
	PARSE_T temt;
	int row_t,colum_t;
    int i_r;
	char *ptr;
	ptr =p;	
	memset((char *)&temt,0,sizeof(PARSE_T));
	i_r=0;
	if(strstr(p,strtab0)==NULL)
	{   printf("parse_tab no tab\n");
		return temt;//无信息表
	}
	ptr=strstr(p,strtab0);
	if(strstr(ptr,str0)!=NULL)
	{
	    p_str=strstr(ptr,str0);
		p_str=p_str+7;
		colum_t=atoi(p_str);
		temt.columnnum_t=colum_t;
	    printf("parse_tab columt=%d\n",colum_t);
	}
	if(strstr(p_str,str1)!=NULL)
	{
		p_str=strstr(p,str1);
		p_str=p_str+4;
	    row_t=atoi(p_str);
        temt.rownum_t=row_t;
	   printf("parse_tab rowt=%d\n",row_t);
	}
	if(strstr(ptr,str4)==NULL)//<tab>
	{
		//default_tab();
		return temt;//无信息内容
	}
	ptr=strstr(ptr,str4);
	ptr=ptr+4;  
	i_r=0;
	while((memcmp(ptr,strtab1,9)!=0) && ((*ptr)!='\0' ))
	{	
 		ptr = loadtab(ptr,i_r,plist);
		if(ptr==NULL)
		{
			printf("parse_tab ptr ==NULL\n");
			return temt;
			break;
			}
		i_r++;
		if(!memcmp(ptr,str4,4))//<tab>
			ptr=ptr+4;
		if(!memcmp(ptr,str9,8))//</tbody>
		{
			ptr=ptr+8;
		    continue;
		}
	}	
	if((*ptr)=='\0')
		return temt;
	if(!memcmp(ptr,strtab1,9)) // </tabwkg>
		ptr=ptr+9;
	temt.rownum_f=i_r;
	temt.columnnum_f=0;
	return temt;
}
void printf_list(int a,TASK_A *task_a)
{        
       TASK_A * ta=task_a;
	int colum_num=0;
	for(colum_num=0;colum_num<a;colum_num++)
	{
		printf("printf_list\n\n");
		printf((ta+colum_num)->UNITS);printf("\n");
	       printf("%c",(ta+colum_num)->BXORUTFLAG);printf("\n");		
		printf((ta+colum_num)->SEQNO);printf("\n");
		printf((ta+colum_num)->JOBDISQTY);printf("\n");
		printf((ta+colum_num)->MACHNO);printf("\n");
		printf((ta+colum_num)->BXNUM);printf("\n");
		printf((ta+colum_num)->FININO);printf("\n");
		printf((ta+colum_num)->CURRSEQ);printf("\n");
		printf((ta+colum_num)->JOBDISNO);printf("\n");
		printf((ta+colum_num)->MESWONO);printf("\n");
		printf((ta+colum_num)->PRTNO);printf("\n");
		printf((ta+colum_num)->DISTIME);printf("\n");
		printf((ta+colum_num)->FACTAWALQTY);printf("\n");
		printf((ta+colum_num)->FININUM);printf("\n");
		printf((ta+colum_num)->WORKBEGDAT);printf("\n");
		printf((ta+colum_num)->WORKENDDAT);printf("\n");
	}
}
//---------------子任务表
//parse child tabplan information function
char *loadchild(char *p,int row_num ,int row_n,int colum_num,TASK_B *pplist,char *strids1)
{
	int i=0;
	char a;
	if( (*p) == '<' )
	{
		p++;
		while( ((*p) != '>') && ((*p) != '\0') )
		{			
			a = *p;
			switch(colum_num)
			{     
			     //显示项
			       case 0:
			   	if(i<19)
				   	(pplist+row_num)->JOBDISNO[i]=a;//工票号
			   	else
					(pplist+row_num)->JOBDISNO[19]='\0';//防止数组边界溢出	
				break;
				 case 1:
			   	if(i<17)
				   	(pplist+row_num)->MESWONO[i]=a;//订单号
			   	else
					(pplist+row_num)->MESWONO[17]='\0';//防止数组边界溢出	
				break;
				case 2:
			   	if(i<99)
				   	(pplist+row_num)->SHUNITS[i]=a;//顺序号
			   	else
					(pplist+row_num)->SHUNITS[99]='\0';//防止数组边界溢出	
					//(pplist+row_num)->PUNITS[i] = a;//顺序号/批号
				break;
				default:
				if(i<99)
					(pplist+row_num)->SHUNITS[i]=a;//顺序号
				else
					(pplist+row_num)->SHUNITS[99]='\0';//防止数组边界溢出	
				break;
			}
			p++;
			i++;
		}
		switch(colum_num)
			{    
			          //显示项
			      case 0:
			   	if(i<19)
				   	(pplist+row_num)->JOBDISNO[i]='\0';//工票号
			   	else
					(pplist+row_num)->JOBDISNO[19]='\0';//防止数组边界溢出	
				break;
				 case 1:
			   	if(i<17)
				   	(pplist+row_num)->MESWONO[i]='\0';//订单号
			   	else
					(pplist+row_num)->MESWONO[17]='\0';//防止数组边界溢出	
				break;
				case 2:
			   	if(i<99)
				   	(pplist+row_num)->SHUNITS[i]='\0';//顺序号
			   	else
					(pplist+row_num)->SHUNITS[99]='\0';//防止数组边界溢出	
					//(pplist+row_num)->PUNITS[i] = a;//顺序号/批号
				break;
					default:
					break;
			}
		if(row_n==0)
			(pplist+row_num)->SFLAGE='1';
		else
			(pplist+row_num)->SFLAGE='0';

		strncpy(((pplist+row_num)->PUNITS),strids1,100);//对应的批号  防止数组边界溢出

		if( (*p) == '\0' )
			return NULL;//错误信息
		if( (*p) == '>' )
		{
			p++;
			i++;
			return p;
		}
	}
	else
		return NULL;	
	return p;
}
char *loadchildtab(char *p,int row,int row_n,TASK_B *pchlist,char * strids)
{
	int i_c;
	i_c=0;
	while( (memcmp(p,str5,5)!=0) && ((*p)!='\0' ))//不是结束符</tb>
	{   if(strstr(p,str6)==NULL)
			p++;
	    else if(strstr(p,str6)!=NULL)
		{
			p = loadchild(p,row,row_n,i_c,pchlist,strids);
			if(p==NULL)
			return NULL;
			i_c++;
		}
	}
	if(!(memcmp(p,str5,5)))//是结束符
	{
		p = p+5;
	}
	else
	   p = NULL;
	return p;
}
PARSE_C parse_childtab(char *p,TASK_B*pchlist)
{
	PARSE_C tem;
	int i,tabnum;
    int i_r;//数组的总和
	int i_f;//每个字表的数组数
	int i_id;
	int itab_num;
	char *ptr;
	char strid[100];
	ptr =p;	
	memset(strid,'\0',100);
	memset((char *)&tem,0,sizeof(PARSE_C));
	i_r=0;
	i_f=0;
	i_id=0;
	i=0;
	itab_num=0;
	chtab_num=0;

	if(strstr(p,strctab0)==NULL) //<tabpcb
	{   printf("parse_childtab no tab\n");
		return tem;//无信息表
	}
	ptr=strstr(p,strctab0);
	if(strstr(ptr,strc0)!=NULL)
	{
	    p_str=strstr(ptr,strc0);
		p_str=p_str+6;
		tabnum=atoi(p_str);
	    printf("parse_childtab tabnum=%d\n",tabnum);
		tem.tabnum_t=tabnum;
	}
	while((memcmp(ptr,strctab1,9)!=0)&((*ptr)!='\0'))   //</tabpch>
	{  
	         i_f=0;
		   i=0;
	        if(strstr(ptr,strcpch0)!=NULL)   //<pch
	        	{
	        	ptr=strstr(ptr,strcpch0);    
				ptr=ptr+8;//to 'id=...'
				while((memcmp(ptr,"/colum",6)!=0)&&((*ptr)!='\0'))//get id value
				{					
					strid[i]=(*ptr);
					i++;
					ptr++;
				}
				strid[i]='\0';
				if(strstr(ptr,str4)==NULL)//<tab>
				{

⌨️ 快捷键说明

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