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

📄 userflow.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
								if(strcmp(pIdentyString,m_pStyle->m_ParamArray[pcmd->iStartParam+j].lpstrPreFix)){
									if(m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv.btmust){
										WriteError(pName,m_icLine,m_pStyle->m_ParamArray[pcmd->iStartParam+j].lpstrPreFix,"lost param item");
										m_ierror++;
										break;
									}
									else {
										CString cs;
										if(m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv.it==DATA_TYPE_INT){
											cs.Format("%ld",(int)m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv);
											GetPositionId((LPCTSTR)cs,dwExpr,WORD_UINT);
											m_LineCode.Add(dwExpr);
										}
										else if(m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv.it==DATA_TYPE_FLOAT){
											cs.Format("%f",(double)m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv);
											GetPositionId((LPCTSTR)cs,dwExpr,WORD_FLOAT);
											m_LineCode.Add(dwExpr);
										}
										else if(m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv.it==DATA_TYPE_DWORD){
											cs.Format("%lx",(DWORD)m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv);
											GetPositionId((LPCTSTR)cs,dwExpr,WORD_UINT);
											m_LineCode.Add(dwExpr);
										}
										else if(m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv.it==DATA_TYPE_STRING){
											cs.Format("%s",(char *)m_pStyle->m_ParamArray[pcmd->iStartParam+j].tv);
											GetPositionId((LPCTSTR)cs,dwExpr,WORD_STRING);
											m_LineCode.Add(dwExpr);
										}
										else {
											WriteError(pName,m_icLine,m_pStyle->m_ParamArray[pcmd->iStartParam+j].lpstrPreFix,"omit param item");
											m_ierror++;
											break;
										}
									}
									continue;
								}
								else {
									pIdentyString=NULL;
								}
							}
							if(!ExpressionRead(pIdentyString,dwIdentyId,dwIdenty,dwExpr)){
								WriteError(pName,m_icLine,pIdentyString,"error expression or identy");
								m_ierror++;
								break;
							}
							m_LineCode.Add(dwExpr);
							if(dwIdentyId==WORD_COMMA){
								pIdentyString=NULL;
							}
						}
						if(j>=pcmd->ParamNum){
							if(dwIdentyId!=WORD_ENDOFLINE&&dwIdentyId!=WORD_ENDOFFILE){
								if(!pIdentyString||strcmp(pIdentyString,"//")){
									WriteError(pName,m_icLine,pIdentyString,"error cexpression");
									m_ierror++;
									break;
								}
							}
							dwIdenty=WORD_ENDOFLINE;
							m_LineCode.Add(dwIdenty);
							bAddLineCode=TRUE;
						}
					}
				}
				break;
			case TYPE_LABEL:
				{
					if(m_mypos.istype==TYPE_PUBLIC_POS){
						WriteError(pName,m_icLine,pIdentyString,"error command in public erea");
						m_ierror++;
						break;
					}
					pIdentyString=m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
					if(pIdentyString[0]!=':'){
						WriteError(pName,m_icLine,pIdentyString,"lost label :");
						m_ierror++;
						break;
					}
					LABELSTRUCT * plbs=&m_LabelList[dwIdenty&POSID_FILTER];
					dwIdenty=WORD_ENDOFLINE;
					m_LineCode.Add(dwIdenty);
					if(plbs->dwLabelId!=0xffffffff){
						WriteError(pName,m_icLine,pIdentyString,"label define morthan once");
						m_ierror++;
						break;
					}
					plbs->dwLabelId=m_LineList.GetSize();
					bAddLineCode=TRUE;
				}
				break;
			case TYPE_GLOBALVAR	:
			case TYPE_LOCALVAR	:
			case TYPE_VARIANT:
			case TYPE_STATIC:
				{
					dwIdentyId=WORD_SETVALUE;
					m_LineCode.Add(dwIdentyId);
					m_LineCode.Add(dwIdenty);
					pIdentyString=m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
					CString cs=pIdentyString;
					if(cs!="="){
						WriteError(pName,m_icLine,pIdentyString,"error cexpression");
						m_ierror++;
						break;
					}
					DWORD dwExpr;
					pIdentyString=NULL;
					if(!ExpressionRead(pIdentyString,dwIdentyId,dwIdenty,dwExpr)){
						WriteError(pName,m_icLine,pIdentyString,"error cexpression");
						m_ierror++;
						break;
					}
					m_LineCode.Add(dwExpr);
					dwIdenty=WORD_ENDOFLINE;
					m_LineCode.Add(dwIdenty);
					bAddLineCode=TRUE;
				}
				break;
			default:
				WriteError(pName,m_icLine,pIdentyString,"unknown words");
				m_ierror++;
				break;
			};
		}
		else {
			if(m_pStyle){
				CString cs=pIdentyString;
				pIdentyString=m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
				char *pc=pIdentyString;
				if(dwIdentyId==WORD_COLON){
					if(m_mypos.istype==TYPE_PUBLIC_POS){
						WriteError(pName,m_icLine,pIdentyString,"define label in other object erea");
						m_ierror++;
					}
					else {
						dwIdenty=WORD_ENDOFLINE;
						m_LineCode.Add(dwIdenty);
						dwIdentyId=NewLabel(m_LineList.GetSize());
						if(m_mypos.istype==TYPE_EVENT_POS){
							CString cs1=m_mypos.csTemp;
							cs1+="__";
							cs1+=cs;
							m_FlowStrTable.SetAt((LPCTSTR)cs1,(void *)(dwIdentyId));
							m_mypos.pt.pe->dwVarNum+=1;
						}
						else {
							CString cs1=m_mypos.csTemp;
							cs1+="__";
							cs1+=cs;
							m_FlowStrTable.SetAt((LPCTSTR)cs1,(void *)(dwIdentyId));
							m_mypos.pt.pf->dwVarNum+=1;
						}
						bAddLineCode=TRUE;
					}
				}
				else {
					WriteError(pName,m_icLine,(LPSTR)(LPCTSTR)cs,"unknown words");
						m_ierror++;
				}
			}
			else {
				WriteError(pName,m_icLine,pIdentyString,"undefine style file");
						m_ierror++;
			}
		}
	}
	else {
		if(dwIdentyId!=WORD_ENDOFLINE&&dwIdentyId!=WORD_ENDOFFILE){
			WriteError(pName,m_icLine,pIdentyString,"unknown words");
			m_ierror++;
		}
	}
	if(bAddLineCode){
		if(pName&&(gStrName!=pName)){
			dwgFileCode=GetFileId(pName);
			gStrName=pName;
		}
	}
	if(dwIdentyId!=WORD_ENDOFLINE&&dwIdentyId!=WORD_ENDOFFILE){
		if(!bAddLineCode){
			while(dwIdentyId!=WORD_ENDOFLINE&&dwIdentyId!=WORD_ENDOFFILE)
				m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
		}
		else {
			m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
			if((dwIdentyId!=WORD_ENDOFLINE)&&(dwIdentyId!=WORD_ENDOFFILE)){
				WriteError(pName,m_icLine,pIdentyString,"unknown words");
				bAddLineCode=FALSE;
				m_ierror++;
				while(dwIdentyId!=WORD_ENDOFLINE&&dwIdentyId!=WORD_ENDOFFILE)
					m_pScanner->ReadWord(pName,dwIdentyId,m_icLine);
			}
		}
	}
	if(bAddLineCode){
		m_LineCode[0]+=dwgFileCode;
		m_LineList.Add(m_CodeList.GetSize());
		for(int iii=0;iii<m_LineCode.GetSize();iii++){
			m_CodeList.Add(m_LineCode[iii]);
			if(m_LineCode[iii]==WORD_ENDOFLINE)break;
		}
	}
	return TRUE;
}

BOOL CUserFlow::SetConstId(DWORD  & dwType,LPSTR lpstr,DWORD & dwId,int iType)
{
	CString cs=lpstr;
	if(iType>=0&&iType<3){
		switch(dwType){
		case WORD_STRING:
			if(cs=="")cs=="1";
			else cs=="0";
			dwType=WORD_UINT;
			break;
		case WORD_UINT:
			{
				UINT i=atoi(lpstr);
				switch(iType){
				case 0:
					i=0-i;
					break;
				case 1:
					i=!i;
					break;
				case 2:
					i=~i;
					break;
				}
				cs.Format("%ld",i);
			}
			break;
		case WORD_FLOAT:
			switch(iType){
			case 0:
				cs="-"+cs;
				break;
			case 1:
				{
					double f=atof(lpstr);
					if(f)cs="0";
					else cs="1";
					dwType=WORD_UINT;
				}
				break;
			case 2:
				dwType=WORD_UINT;
				cs="0";
				break;
			};
			break;
		default:
			return FALSE;
		};
	}
	return GetPositionId((LPCTSTR)cs,dwId,dwType);
}

BOOL CUserFlow::GetPositionId(LPCTSTR lpstr,DWORD & dwPos,DWORD dwType,BOOL bdefine)
{
	switch(dwType){
	case WORD_STRING:
		{
			CString cs=lpstr;
			cs+="\'";
			if(m_ConstStrTable.Lookup((LPCTSTR)cs,(void *&)dwPos)){
				return TRUE;
			}
			else {
				dwPos=m_ListConst.GetSize();
				dwPos|=TYPE_CONST;
				m_ConstStrTable.SetAt(cs,(void *)dwPos);
				UniVar cst=lpstr;
				m_ListConst.Add(cst);
				return TRUE;
			}
		}
		break;
	case WORD_FLOAT:
		if(m_ConstStrTable.Lookup(lpstr,(void *&)dwPos)){
			return TRUE;
		}
		else {
			dwPos=m_ListConst.GetSize();
			dwPos|=TYPE_CONST;
			m_ConstStrTable.SetAt(lpstr,(void *)dwPos);
			UniVar cst=atof(lpstr);
			m_ListConst.Add(cst);
			return TRUE;
		}
		break;
	case WORD_UINT:
		if(m_ConstStrTable.Lookup(lpstr,(void *&)dwPos)){
			return TRUE;
		}
		else {
			dwPos=m_ListConst.GetSize();
			dwPos|=TYPE_CONST;
			m_ConstStrTable.SetAt(lpstr,(void *)dwPos);
			UniVar cst;
			if(lpstr[1]=='x'||lpstr[1]=='X')sscanf(lpstr,"%lx",&cst.uv.iv);
			else cst=atoi(lpstr);
			cst.it=0;
			m_ListConst.Add(cst);
			return TRUE;
		}
		break;
	default:
		if(CUserFlow::m_StrFlowCommand.Lookup(lpstr,(void *&)dwPos))return TRUE;//sys
		if(!m_pStyle)return FALSE;
		if(WORD_IDENTY==dwType){
			if(!m_mypos.csTemp.IsEmpty()){
				CString cs=m_mypos.csTemp+"__";
				cs+=lpstr;
				if(m_FlowStrTable.Lookup((LPCTSTR)cs,(void *&)dwPos))return TRUE;
			}
		}
		if(m_FlowStrTable.Lookup(lpstr,(void *&)dwPos)){//globe
			if((dwPos&TYPE_GLOBALVAR)==TYPE_GLOBALVAR){
				if(bdefine)
					if(!m_mypos.csTemp.IsEmpty())return FALSE;
				return TRUE;
			}
			else 
				return TRUE;
		}
		if(m_pStyle->m_StyleStrTable.Lookup(lpstr,(void *&)dwPos)){//sys var
			if((dwPos&TYPE_VARIANT)==TYPE_VARIANT){
				if(bdefine)	
					if(!m_mypos.csTemp.IsEmpty())return FALSE;
				return TRUE;
			}
			else 
				return TRUE;
		}
		break;
	};
	return FALSE;
}

BOOL CUserFlow::GetCode()
{
	if(!m_pScanner)return FALSE;
	m_icLine=0;
	m_ierror=0;
	m_ExprList.RemoveAll();
	m_iCurrentExpr=0;
	m_ExprWordList.SetSize(100);
	while(ReadLine());
	if(m_Cmpl.ClearScope()){
		WriteError(m_csFileName,m_icLine,"end of program","lost scope define:endif,endwhule or endswitch");
		m_ierror++;
	}
	for(int i=0;i<m_ListFunction.GetSize();i++){
		if(m_ListFunction[i].iStart==-1||m_ListFunction[i].iEnd<0){
			WriteError(m_csFileName,0-m_ListFunction[i].iEnd,
				"error define proc","undefined function or no endproc");
			m_ierror++;
		}
	}
	for(i=0;i<m_LabelList.GetSize();i++){
		if(m_LabelList[i].dwLabelId==0xffffffff){
			WriteError(m_csFileName,(int)m_LabelList[i].dwPositionId,
				"error define label","undefined label ");
			m_ierror++;
		}
	}
	for(i=0;i<m_ListEvent.GetSize();i++){
		if(m_ListEvent[i].iEnd<0){
			WriteError(m_csFileName,0-m_ListEvent[i].iEnd,
				"error define event","no endproc");
			m_ierror++;
		}
	}
	for(i=0;i<m_ListBN.GetSize();i++){
		if(!m_ListBN[i].szDiscripe){
			WriteError(m_csFileName,m_ListBN[i].dwLabel,
				"BUSINESS NODE NODE","no define");
			m_ierror++;
		}
	}
	if(m_MainFunc.iEnd==-1){
		WriteError(m_csFileName,0,
			"error define mainproc","no endmain");
		m_ierror++;
	};
	CString cs;
	cs.Format("%ld",m_ierror);
	WriteError(m_csFileName,-1,(LPSTR)(LPCTSTR)cs,"errors found");
	if(!m_pStyle)return FALSE;
	if(m_pStyle->m_CommandList.GetSize()==0){
		delete m_pStyle;
		m_pStyle=NULL;
		return FALSE;
	}
	if(m_ierror){
		m_LineList.RemoveAll();
		m_CodeList.RemoveAll();
		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);
		}
		m_ListBV.RemoveAll();
		m_ListBN.RemoveAll();
		return FALSE;

	}
	if(!m_LineList.GetSize())return FALSE;
	if(m_iMainStart<0)return FALSE;
	if(iMainEnd<=m_iMainStart||m_iMainStart>=m_LineList.GetSize())return FALSE;
	m_ConstStrTable.RemoveAll();
	return TRUE;
}

DWORD * CUserFlow::GetLine(int iLine)
{
	if(iLine>=0&&iLine<m_LineList.GetSize())
		return &m_CodeList[m_LineList[iLine]];
	return NULL;
}

DWORD CUserFlow::GetIdFromPosition(DWORD dwID)
{
	if(!m_pStyle)return 0xffffffff;
	int pos=(dwID&POSID_FILTER);
	DWORD dwType=(dwID&ITYPE_FILTER);
	switch(dwType){
	case TYPE_COMMAND	:
		if(pos>=m_pStyle->m_Comm

⌨️ 快捷键说明

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