📄 userflow.cpp
字号:
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 + -