📄 templetidentify.cpp
字号:
#include "TempletIdentify.h"
#include "cgetwebpage.h"
#define Lowcase(x) ((x) >= 'A'&&(x)<='Z'?(x)-'A'+'a':(x))
TempletIdentify::TempletIdentify(char *path)
{
pGetTree = new IndexTree;
lClientArgNum = 0;
pClientArg = NULL;
pClientUrl = NULL;
memset(pControlHead,0,8);
pSecondUrlMode = NULL;
pServerArg = NULL;
pServerUrl = NULL;
pAllBuf = new char[2048000];
pNowPos = pAllBuf;
strcpy(this->syspath,path);
char filename[300];
sprintf(filename,"%s\\indextree.dat",path);
if(access(filename,0) == 0)
pGetTree->LoadTree(filename);
m_InitSuccess = -1;
sprintf(filename,"%s\\Enter.ini",path);
m_InitSuccess = ReadConfigure(filename);
}
long TempletIdentify::ReadConfigure(char *file)
{
FILE *fp = fopen(file,"rb");
if(fp == NULL)
return -1;
char pReadBuf[1024];
char *p;
long lLen = 0;
FILE *fp1;
pControlHead[0] = NULL;
pControlHead[1] = NULL;
long lNowNum = 0;
long i,j;
char filename[300];
while(fgets(pReadBuf,1020,fp))
{
if(strnicmp("模板1=",pReadBuf,6) == 0)
{
p = pReadBuf+6;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
sprintf(filename,"%s\\%s",syspath,p);
fp1 = fopen(filename,"rb");
if(fp1 == NULL)
{
fclose(fp);
return -1;
}
lLen = fread(pAllBuf,1,1048576,fp1);
fclose(fp1);
pAllBuf[lLen] = 0;
pControlHead[0] = CreateTemplet(pAllBuf);
if(pControlHead[0] == NULL)
{
fclose(fp);
return -1;
}
}
else if(strnicmp("模板2=",pReadBuf,6) == 0)
{
p = pReadBuf+6;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
sprintf(filename,"%s\\%s",syspath,p);
fp1 = fopen(filename,"rb");
if(fp1 == NULL)
{
fclose(fp);
return -1;
}
lLen = fread(pAllBuf,1,1048576,fp1);
fclose(fp1);
pAllBuf[lLen] = 0;
pControlHead[1] = CreateTemplet(pAllBuf);
if(pControlHead[1] == NULL)
{
fclose(fp);
return -1;
}
}
else if(strnicmp("clientUrl=",pReadBuf,10) == 0)
{
p = pReadBuf+10;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
pClientUrl = new char[lLen+10];
strcpy(pClientUrl,p);
}
else if(strnicmp("serverUrl=",pReadBuf,10) == 0)
{
p = pReadBuf+10;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
pServerUrl = new char[lLen+10];
strcpy(pServerUrl,p);
}
else if(strnicmp("ServerRule=",pReadBuf,11) == 0)
{
p = pReadBuf+11;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
pServerArg = new char[lLen+10];
strcpy(pServerArg,p);
}
else if(strnicmp("SecondUrl=",pReadBuf,10) == 0)
{
p = pReadBuf+10;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
pSecondUrlMode = new char[lLen+10];
strcpy(pSecondUrlMode,p);
}
else if(strnicmp("clientArgNum=",pReadBuf,13) == 0)
{
p = pReadBuf+13;
lClientArgNum = atol(p);
pClientArg = new ArgStruct[lClientArgNum];
memset(pClientArg,0,sizeof(ArgStruct)*lClientArgNum);
for(i=0;i<lClientArgNum && fgets(pReadBuf,1020,fp);i++)
{
p = pReadBuf;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
pClientArg[i].argName = new char[lLen+10];
strcpy(pClientArg[i].argName,p);
if(fgets(pReadBuf,1020,fp)==NULL)
{
fclose(fp);
return -1;
}
pClientArg[i].lArgValueNum = atol(pReadBuf);
lLen = pClientArg[i].lArgValueNum;
pClientArg[i].pArgv = new char *[lLen];
memset(pClientArg[i].pArgv,0,lLen*4);
pClientArg[i].pArgvServer = new char*[lLen];
memset(pClientArg[i].pArgvServer,0,lLen*4);
for(j=0;j<pClientArg[i].lArgValueNum&&fgets(pReadBuf,1020,fp);j++)
{
p = strstr(pReadBuf,"/*");
if(p == NULL)
{
fclose(fp);
return -1;
}
pClientArg[i].pArgv[j] = new char[p-pReadBuf+2];
memcpy(pClientArg[i].pArgv[j],pReadBuf,p-pReadBuf);
pClientArg[i].pArgv[j][p-pReadBuf] = 0;
p = strstr(p,"*/");
if(p == NULL)
{
fclose(fp);
return -1;
}
p+=2;
while(*p == ' ')p++;
lLen = strlen(p)-1;
while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
p[lLen+1] = 0;
if(lLen<=0)
continue;
lLen++;
pClientArg[i].pArgvServer[j] = new char[lLen+2];
strcpy(pClientArg[i].pArgvServer[j],p);
}
if(j != pClientArg[i].lArgValueNum)
{
fclose(fp);
return -1;
}
}
if(i != lClientArgNum)
{
fclose(fp);
return -1;
}
}
else
break;
}
fclose(fp);
return 0;
}
TempletIdentify::~TempletIdentify()
{
delete pAllBuf;
long i,j;
TempletControl *pNode;
for(i=0;i<2;i++)
{
while(pControlHead[i])
{
pNode = pControlHead[i]->pNextControl;
delete pControlHead[i];
pControlHead[i] = pNode;
}
}
if(pClientArg)
{
for(i=0;i<lClientArgNum;i++)
{
for(j=0;j<pClientArg[i].lArgValueNum;j++)
{
if(pClientArg[i].pArgv && pClientArg[i].pArgv[j])
delete pClientArg[i].pArgv[j];
if(pClientArg[i].pArgvServer && pClientArg[i].pArgvServer[j])
delete pClientArg[i].pArgvServer[j];
}
if(pClientArg[i].pArgv)
delete pClientArg[i].pArgv;
if(pClientArg[i].pArgvServer)
delete pClientArg[i].pArgvServer;
if(pClientArg[i].argName)
delete pClientArg[i].argName;
}
delete pClientArg;
}
if(pClientUrl) delete pClientUrl;
if(pSecondUrlMode) delete pSecondUrlMode;
if(pServerArg) delete pServerArg;
if(pServerUrl) delete pServerUrl;
if(pGetTree) delete pGetTree;
}
TempletControl *TempletIdentify::CreateTemplet(char *pTempletBuf)
{
TempletControl *pHead = new TempletControl;
TempletControl *pNowNode = pHead,*pNextNode= NULL;
char *p2,*p3;
char *p = pTempletBuf;
char *p1 = pHead->description;
long lLoopStack[100];
long lLoopNum = 0;
long lLastSign = 0;//如果为空格则为1
while(*p)
{
if(*p == ' ' || *p == 0x0d || *p == 0x0a || *p == '\t')
{
p++;
if(lLastSign == 0)
{
if(p1 != pNowNode->description)
*p1++ = ' ';
}
lLastSign = 1;
continue;
}
if(*p == '&')
{
p++;
if(strnicmp(p,"nbsp",4) == 0)
p+=4;
else if(strnicmp(p,"gb",2) == 0)
p+=2;
else if(strnicmp(p,"lt",2) == 0)
p+=2;
else if(strnicmp(p,"amp",3) == 0)
p+=3;
if(*p == ';')
p++;
if(lLastSign == 0)
{
if(p1 != pNowNode->description)
*p1++ = ' ';
}
lLastSign = 1;
continue;
}
else if(*p == '<')
{
if(*(p+1) == '%')//变量
{
*p1 = 0;
pNowNode->lFlag = 1;//变量
p+=2;
p2 = p;
pNowNode->lDescriptionLen = p1-pNowNode->description;
if(pNowNode->lDescriptionLen > 0)
{
while(p1>pNextNode->description && *(p1-1) == ' ')
{
pNowNode->lDescriptionLen--;
pNowNode->description[pNowNode->lDescriptionLen] = 0;
p1--;
}
}
p3 = pNowNode->pVariable;
while(*p && *p != '%')
{
*p3++ = *p++;
}
*p3 = 0;
pNowNode->lVariableLen = p3-pNowNode->pVariable;
if(*p)p++;
if(*p)p++;
pNextNode = new TempletControl ;
pNowNode->pNextControl = pNextNode;
pNowNode = pNextNode;
p1 = pNextNode->description;
}
else if(*(p+1) == '?')//可变区
{
pNextNode = new TempletControl ;
if(strnicmp(p+2,"MYCHANGE?>",10) == 0)
{
pNowNode->lFlag = 0;
p+=12;
}
else if(strnicmp(p+2,"LOOPEND?>",9) == 0)
{
pNowNode->pLoopControl = (TempletControl *)lLoopStack[--lLoopNum];
p+=11;
}
else if(strnicmp(p+2,"LOOPBEGIN?>",11) == 0)
{
lLoopStack[lLoopNum++] = (long)pNextNode;
pNextNode->lLoopFlag = 1;
p+=13;
}
pNowNode->lDescriptionLen = p1-pNowNode->description;
if(pNowNode->lDescriptionLen > 0)
{
while(p1>pNextNode->description && *(p1-1) == ' ')
{
pNowNode->lDescriptionLen--;
pNowNode->description[pNowNode->lDescriptionLen] = 0;
p1--;
}
}
pNowNode->lVariableLen = 0;
pNowNode->pNextControl = pNextNode;
pNowNode = pNextNode;
p1 = pNextNode->description;
lLastSign = 0;
}
else if(strnicmp(p+1,"br",2) == 0)
{
while(*p && *p != '>')p++;
if(*p)p++;
if(lLastSign == 0)
{
if(p1 != pNowNode->description)
*p1++ = ' ';
}
lLastSign = 1;
}
else
{
*p1++ = *p++;
lLastSign = 0;
}
}
else
{
*p1++=*p++;
lLastSign = 0;
}
}
pNowNode->lDescriptionLen = p1-pNowNode->description;
pNowNode->lVariableLen = 0;
if(pNowNode->lDescriptionLen > 0)
{
while(p1>pNextNode->description && *(p1-1) == ' ')
{
pNowNode->lDescriptionLen--;
pNowNode->description[pNowNode->lDescriptionLen] = 0;
p1--;
}
}
return pHead;
}
long TempletIdentify::DelBlank(char *str)
{
char *p1 = str;
char *p = p1;
long lLastSign = 0;
while(*p)
{
if(*p == ' ' || *p == 0x0d || *p == 0x0a || *p == '\t')
{
p++;
if(lLastSign == 0)
*p1++ = ' ';
lLastSign = 1;
continue;
}
if(*p == '&')
{
p++;
if(strnicmp(p,"nbsp",4) == 0)
p+=4;
else if(strnicmp(p,"gb",2) == 0)
p+=2;
else if(strnicmp(p,"lt",2) == 0)
p+=2;
else if(strnicmp(p,"amp",3) == 0)
p+=3;
if(*p == ';')
p++;
if(lLastSign == 0)
*p1++ = ' ';
lLastSign = 1;
continue;
}
else if(*p == '<')
{
if(strnicmp(p+1,"br",2) == 0)
{
while(*p && *p != '>')p++;
if(lLastSign == 0)
*p1++ = ' ';
lLastSign = 1;
if(*p) p++;
}
else
{
*p1++ = *p++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -