📄 userflow.cpp
字号:
#include "stdafx.h"
#include "userflow.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CMapStringToPtr CUserFlow::m_StrFlowCommand;
struct WORDTABLE flowWord[]=
{
{"style", WORD_STYLE },
{"variant", WORD_VARIANT },
{"bvariant", WORD_BVARIANT },
{"#include", WORD_INCLUDE },
{"setblock", WORD_BLOCK },
{"bnode", WORD_BNODE },
{"backbnode", WORD_BACK },
{"resetbnode", WORD_RESET },
{"defproc", WORD_DEFPROC },
{"startmain", WORD_STARTMAIN },
{"endmain", WORD_ENDMAIN },
{"startproc", WORD_STARTPROC },
{"endproc", WORD_ENDPROC },
{"startevent", WORD_STARTEVENT },
{"endevent", WORD_ENDEVENT },
{"resume", WORD_RESUME },
{"suspend", WORD_SUSPEND },
{"if", WORD_IF },
{"setvalue", WORD_SETVALUE },
{"then", WORD_THEN },
{"goto", WORD_GOTO },
{"jump", WORD_JUMP },
{"ret", WORD_RET },
{"exit", WORD_EXIT },
{"else", WORD_ELSE },
{"endif", WORD_ENDIF },
{"while", WORD_WHILE },
{"endwhile", WORD_ENDWHILE },
{"switch", WORD_SWITCH },
{"case", WORD_CASE },
{"default", WORD_DEFAULT },
{"endswitch", WORD_ENDSWITCH },
{"continue", WORD_CONTINUE },
{"break", WORD_BREAK },
{"+", WORD_ADD },
{"-", WORD_SUB },
{"*", WORD_MUL },
{"/", WORD_DEV },
{">", WORD_BIG },
{"<", WORD_SML },
{"=", WORD_EQUE },
{"==", WORD_SAM },
{">=", WORD_BGE },
{"<=", WORD_SME },
{"&&", WORD_AND },
{"||", WORD_OR },
{"!", WORD_NOT },
{"!=", WORD_NEQ },
{"~", WORD_OPS },
{"&", WORD_BAND },
{"|", WORD_BOR },
{"^", WORD_XOR },
{"%", WORD_MOD },
{"?", WORD_WHY },
{"\n", WORD_ENDOFLINE },
{"\b", WORD_ENDOFFILE },
{"(", WORD_LEFTSMLBRACKET },
{")", WORD_RIGHTSMLBRACKET},
{"[", WORD_LEFTMIDBRACKET },
{"]", WORD_RIGHTMIDBRACKET},
{"{", WORD_LEFTGIBBRACKET },
{"}", WORD_RIGHTBIGBRACKET},
{",", WORD_COMMA },
{":", WORD_COLON },
{";", WORD_SEMICOLON }
};
CFlowMg gFlowMg;
CUserFlow::CUserFlow(CFunctionRegister * pRegister,LPSTR lpFlowFile)
{
m_pRegister=pRegister;
m_csFileName=lpFlowFile;
m_pScanner=new CScanner(lpFlowFile);
m_pStyle=NULL;
m_pstkFlowWord=flowWord;
m_iuser=1;
m_mypos.istype=TYPE_PUBLIC_POS;
dwGlobalVarNum=0;
m_ParamArray.RemoveAll();
m_dwFlowId=(DWORD)this;
}
CUserFlow::~CUserFlow()
{
m_FlowStrTable.RemoveAll();
if(m_pStyle){
delete m_pStyle;
m_pStyle=NULL;
}
int i;
m_ListConst.RemoveAll();
for(i=0;i<m_ListName.GetSize();i++){
delete m_ListName[i];
}
for(i=0;i<m_ParamArray.GetSize();i++){
PARAMEMTER & prm=m_ParamArray[i];
if(prm.lpstrPreFix)
UniVar::DeleteBlock(prm.lpstrPreFix);
};
for(i=0;i<m_ListBV.GetSize();i++){
if(m_ListBV[i].szKeyName)
UniVar::DeleteBlock(m_ListBV[i].szKeyName);
}
for(i=0;i<m_ListBN.GetSize();i++){
if(m_ListBN[i].szDiscripe)
UniVar::DeleteBlock(m_ListBN[i].szDiscripe);
}
delete m_pScanner;
}
CUserFlow * CUserFlow::GetFlow(CFunctionRegister * pRegister,LPSTR lpFlowFile,DWORD dwId)
{
if(!lpFlowFile||!lpFlowFile[0])
return gFlowMg.FindFlow(dwId,TRUE);
return gFlowMg.GetFlow(pRegister,lpFlowFile,dwId);
};
void CUserFlow::CloseFlow(CUserFlow * p)
{
gFlowMg.CloseFlow(p);
}
BOOL CUserFlow::GetConst(DWORD dwConstID,UniVar & tv)
{
if((dwConstID&ITYPE_FILTER)!=TYPE_CONST)return FALSE;
if((dwConstID&POSID_FILTER)>=(DWORD)m_ListConst.GetSize())return FALSE;
tv=m_ListConst[dwConstID&POSID_FILTER];
return TRUE;
}
USEREVENT * CUserFlow::GetEvent(DWORD dwId)
{
for(int i=0;i<m_ListEvent.GetSize();i++){
if(dwId==m_ListEvent[i].pstkEvent->dwUserEventId)return &m_ListEvent[i];
}
return NULL;
}
BOOL CUserFlow::ExpressionRead(LPSTR & lpstr,DWORD &dwType,DWORD & dwId,DWORD & dwExprId)
{
char * pName;
if(lpstr==NULL){
lpstr=m_pScanner->ReadWord(pName,dwType,m_icLine);
}
BOOL bBreak=TRUE;;
int ibracket=0;
int itype=-1;
EXPRESSION epr;
epr.iLength=0;
epr.iStart=m_iCurrentExpr;
epr.dwPositionId=m_ExprList.GetSize();
epr.dwPositionId|=TYPE_EXPR;
while(bBreak){
switch(dwType){
case WORD_ENDOFLINE:
case WORD_ENDOFFILE:
bBreak=FALSE;
break;
case WORD_IDENTY:
if(!GetPositionId(lpstr,dwId)){
bBreak=FALSE;
if(itype>=6)return FALSE;
break;
}
switch(dwId&ITYPE_FILTER){
case TYPE_VARIANT:
case TYPE_GLOBALVAR:
case TYPE_LOCALVAR:
case TYPE_STATIC:
case TYPE_CONST:
{
if(itype<6){
if(itype==-1){
itype=0;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
else bBreak=FALSE;
}
else if(itype<8){
if(itype==7){
bBreak=FALSE;
}
else {
itype=0;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
}
else if(itype<11){
itype=0;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
else{
itype=0;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
}
break;
default:
bBreak=FALSE;
break;
}
break;
case WORD_STRING:
case WORD_FLOAT:
case WORD_UINT:
if(!SetConstId(dwType,lpstr,dwId,itype-8)){
dwExprId=0;
return FALSE;
}
if(itype==-1){
itype=3;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
else if(itype<6){
bBreak=FALSE;
}
else if(itype<8){
if(itype==6){
itype=3;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
else {
bBreak=FALSE;
}
}
else if(itype<11){
itype=3;
m_ExprWordList[epr.iLength+epr.iStart-1]=dwId;
}
else {
itype=3;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
break;
case WORD_OPERATOR:
if(!GetPositionId(lpstr,dwId)){
if(lpstr[0]=='/'&&lpstr[1]=='/'){
bBreak=FALSE;
break;
}
dwExprId=0;
return FALSE;
}
if(itype>7){
if(dwId==WORD_SUB||dwId==WORD_NOT||dwId==WORD_OPS){
itype=6;
}
else{
dwExprId=0;
return FALSE;
}
}
switch(dwId){
case WORD_SUB:
if(itype==-1||itype==6)itype=8;
else {
itype=11;
}
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
break;
case WORD_NOT:
if(itype==-1||itype==6){
itype=9;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
else {
bBreak=FALSE;
}
break;
case WORD_OPS:
if(itype==-1||itype==6){
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
itype=10;
}
else {
bBreak=FALSE;
}
break;
case WORD_EQUE:
dwExprId=0;
return FALSE;
case WORD_WHY:
dwExprId=0;
return FALSE;
default:
if(itype==-1||itype==6){
dwExprId=0;
return FALSE;
}
else {
itype=11;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=dwId;
epr.iLength++;
}
break;
}
break;
case WORD_LEFTSMLBRACKET:
if(itype==-1||itype>7||itype==6){
itype=6;
ibracket++;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=WORD_LEFTSMLBRACKET;
epr.iLength++;
}
else {
bBreak=FALSE;
}
break;
case WORD_RIGHTSMLBRACKET:
if(itype==-1||itype>7||itype==6){
dwExprId=0;
return FALSE;
}
else {
ibracket--;
if(ibracket<0){
dwExprId=0;
return FALSE;
}
itype=7;
if(m_ExprWordList.GetSize()<=epr.iLength+epr.iStart)m_ExprWordList.SetSize(m_ExprWordList.GetSize()+10);
m_ExprWordList[epr.iLength+epr.iStart]=WORD_RIGHTSMLBRACKET;
epr.iLength++;
}
break;
default:
bBreak=false;
break;
};
if(!bBreak){
if(ibracket){
dwExprId=0;
return FALSE;
}
if(epr.iLength==0){
dwExprId=1;
return FALSE;
}
if(epr.iLength==1){
dwExprId=m_ExprWordList[epr.iLength+epr.iStart-1];
}
else {
m_ExprList.Add(epr);
m_iCurrentExpr=epr.iLength+epr.iStart;
dwExprId=epr.dwPositionId;
}
break;
}
lpstr=m_pScanner->ReadWord(pName,dwType,m_icLine);
}
return TRUE;
}
static DWORD dwgFileCode=0;
static CString gStrName="";
BOOL CUserFlow::ReadLine(BOOL bAddLine,LPSTR pString,DWORD dwId)
{
ASSERT(m_pScanner);
char * pName=NULL;
LPSTR pIdentyString=pString;
DWORD dwIdentyId=dwId,dwIdenty;
if(!pString)
pIdentyString=m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
if(dwIdentyId==WORD_NOFILEOPENED){
WriteError(pName,m_icLine,"CAN'T OPEN FILE","STYLE");
m_ierror++;
return FALSE;
}
if(dwIdentyId==WORD_ENDOFFILE)return FALSE;
if(bAddLine){
m_LineCode.SetSize(1);
m_LineCode[0]=(DWORD)m_icLine;
}
BOOL bAddLineCode=FALSE;
if(dwIdentyId==WORD_IDENTY||dwIdentyId==WORD_COMPILE){
if(GetPositionId(pIdentyString,dwIdenty)){
switch(dwIdenty&ITYPE_FILTER){
case TYPE_SYSTEM:
switch(dwIdenty){
case WORD_STYLE:
if(!m_pStyle){
pIdentyString=m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
if(pIdentyString){
m_pStyle=new CStyle(m_pRegister,pIdentyString);
if(m_pStyle){
if(!m_pStyle->GetStyle()){
delete m_pStyle;
m_pStyle=NULL;
WriteError(pName,m_icLine,pIdentyString,"style compile error");
m_ierror++;
}
else{
for(int i=0;i<m_pStyle->m_ListConst.GetSize();i++){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -