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

📄 userflow.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -