📄 parse.c
字号:
#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 + -