?? masmber_c6.cpp
字號:
//---------------------------------------------------------------------------
//-------- MAsmber_C6.cpp ---------------------------------------------------
//---------------------------------------------------------------------------
#include "MAsmber_H.h"
#include "AsmF_H.h"
#include "OBJfile_H.h"
#include "ListFile_H.h"
#include "OBJModule_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 控制匯編的指令處理群
//
//---------------------------------------------------------------------------
#define DebugKit(str) DebugMsg(str)
//---------------------------------------------------------------------------
// 從字串str中取出數字放入val。遇到數字后面的','自動去除。
// str受影響。報錯時,需要使用Ln。
// err = 0: ok; err = 1: error; 不是數串 err = 255: end。
//---------------------------------------------------------------------------
ERR MacroAsmber::FetchVal(int32u &val, Jstring &str)
{ val = 0;
char* behind; int16u len;
char ss[256];
Jassert(str.getLen()<255);
const char* aNumWord = GetNumWord(str.makeStr(ss), len, behind); // 到字串str里找一個數字或單詞。
// 如果是單詞和數開頭,返回一個指向串中第一個單詞和數的指針。
// len返回單詞長度, behind指向單詞后一個字符。
// 不是單詞和數開頭,則返回NULL。len=0,behind指向文本行中的第一個可見符或者行末。
if(aNumWord != NULL)
// Now, 得到了一個單詞和數
{ Jstring ts(aNumWord,len);
if( ts.ValueStrToValue(val) ) // val 帶值返回。
{ if(*behind == ',') { ++behind; } // endif
str = behind; // !! 此處修改了str!
return OK_no_Err;
} // endif
else // 不是數串
{ OutputErr(ArguExcevErr); return Have_Errs; } // end else
} // endif
else
{ return 255; } // end else
} // end FetchVal
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 根據輸入的字串str提取參數,設置REGISTERBANK。
//---------------------------------------------------------------------------
ERR MacroAsmber::RegBank_Do(Jstring &str) // 注意, 這里是傳引用!
{ if( str.IsEmpty() )
{ OutputErr(ArguInsufErr); return Have_Errs; } // endif
JModulePt->NoRegBank();
ERR err; int8u i;
for( i = 0; i < 4; ++i )
{ register int32u val;
err = FetchVal(val, str); // val, str 帶值返回。
if(err) { break; } // endif break from for i
if(val > 3)
{ OutputErr(UsingWrongErr); return Have_Errs; } // endif
JModulePt->setUseBank((int8u)val); // 對RegBank進行設置。
} // end for
if(err == 255) { err = OK_no_Err; } // endif
if( str.IsNotEmpty() )
{ OutputErr(ArguExcevErr); err = Have_Errs; } // endif
return err;
} // end RegBank_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
ERR MacroAsmber::Date_Do(Jstring &str) // 注意, 這里是傳引用!
{ int32u val[3];
ERR err; int8u i;
for( i = 0; i < 3; ++i )
{ err = FetchVal(val[i], str); // val, str 帶值返回。
if(err) { break; } // endif break from for i
} // end for
if(err == 255) { err = OK_no_Err; } // endif
if(err) { return err; } // endif
if( str.IsNotEmpty() )
{ OutputErr(ArguExcevErr); return Have_Errs; } // endif
// Now, no error. Set the date.
if(val[0]>=100 && val[1]<=12 && val[2]<=31 )
{ LstFilePt->jdate.year = val[0];
LstFilePt->jdate.month = val[1];
LstFilePt->jdate.day = val[2];
return OK_no_Err;
} // endif
if(val[0]<=31 && val[1]<=12)
{ LstFilePt->jdate.day = val[0];
LstFilePt->jdate.month = val[1];
LstFilePt->jdate.year = val[2];
return OK_no_Err;
} // endif
OutWarning(NumOutRangeWarn);
return OK_no_Err;
} // end Date_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define ItisWrong_BeSkip(p) (p)->Token2 = Dog_Skip; pt = pt->next;
//---------------------------------------------------------------------------
// 測試所帶參數是否為空。為使報錯時該行存在,所以節點不能刪除。
//---------------------------------------------------------------------------
#define EmptyThenWarn(p,warn) \
if((p)->Name.IsEmpty()) \
{ OutWarning(warn); ItisWrong_BeSkip(p); break; }
//---------------------------------------------------------------------------
#define TestConflictAndSet(bn,p); \
if(bn) { OutputErr(CtrlConflictErr); ItisWrong_BeSkip(p); break; } \
(bn) = true;
//---------------------------------------------------------------------------
#define DoneAndRemoveItBreak(); \
TokenOper::DelTokenNode(pt->next); break;
//---------------------------------------------------------------------------
#define MajorCtrlSolution(bn,p,statements) \
TestConflictAndSet(bn,p); \
statements \
DoneAndRemoveItBreak();
//---------------------------------------------------------------------------
#define Do_If_err_Break(statement) \
err = statement; \
if(err) { ItisWrong_BeSkip(p); break; }
//---------------------------------------------------------------------------
// 首要匯編控制指令語法分析器。(其參數就在Name域中。)
//---------------------------------------------------------------------------
ERR MacroAsmber::MajorCtrlParse(AsmLine* &line)
{ ERR err = OK_no_Err;
// printf("\n\n\n $Major control here.\n\n");
Tokenfield* pt;
for( pt = line->head; pt->next; ) // 一個接一個Token分析。
{ register Tokenfield* p = pt->next; // p是當前分析的Token,pt是p的上一個。
if(p->Token != Dog_Ctrl)
{ OutputErr(DogCtrlIllErr); err = Have_Errs; break; } // endif
switch(p->Token2)
{ case DEBUG_Tn :
{ MajorCtrlSolution(xBn.db_bn, p, JModulePt->SetDebug(true); ); } // end case
case NODEBUG_Tn:
{ MajorCtrlSolution(xBn.db_bn, p, JModulePt->SetDebug(false); ); } // end case
case RB_Tn :
{ MajorCtrlSolution(xBn.rb_bn, p, Do_If_err_Break( RegBank_Do(p->Name) ) ); } // end case
case NORB_Tn :
{ MajorCtrlSolution(xBn.rb_bn, p, JModulePt->NoRegBank(); ); } // end case
case NOMOD51_Tn:
{ MajorCtrlSolution(xBn.mo_bn, p, SFR51 = false; ); } // end case
case MOD51_Tn :
{ MajorCtrlSolution(xBn.mo_bn, p, SFR51 = true; ); } // end case
case TITLE_Tn : { TestConflictAndSet(xBn.tt_bn,p); // 沖突測試。
EmptyThenWarn(p,MissTitleWarn); // 有錯,不刪除節點。
LstFilePt->Title = p->Name; // 列表文件的標題改為TITLE!
DoneAndRemoveItBreak();
} // end case
case DATE_Tn : { TestConflictAndSet(xBn.da_bn,p); // 沖突測試。
EmptyThenWarn(p,MissDateWarn); // 有錯,不刪除節點。
Do_If_err_Break( Date_Do(p->Name) )
DoneAndRemoveItBreak();
} // end case
case ERR_PR_Tn :
{ TestConflictAndSet(xBn.ep_bn,p); ErrPrint = true;
EpFile.SetEPfile(err, p->Name);
if(err) { OutputErr(spFileOpenErr); ItisWrong_BeSkip(p); } // endif
else { TokenOper::DelTokenNode(pt->next); } // end else
break;
} // end case
case NO_EP_Tn :
{ MajorCtrlSolution(xBn.ep_bn, p, ErrPrint = false; ); } // end case
case OBJOJ_Tn :
{ MajorCtrlSolution(xBn.oj_bn, p, ObjFile = true;
if(p->Name.IsNotEmpty()) { objFilePt->FileName = p->Name; } // endif
);
} // end case
case NOOJ_Tn :
{ MajorCtrlSolution(xBn.oj_bn, p, ObjFile = false; ); } // end case
case PR_Tn :
{ MajorCtrlSolution(xBn.pr_bn, p, LstFile = true;
if(p->Name.IsNotEmpty()) { LstFilePt->FileName = p->Name; } // endif
);
} // end case
case NOPR_Tn :
{ MajorCtrlSolution(xBn.pr_bn, p, LstFile = false; ); } // end case
case SB_Tn :
{ MajorCtrlSolution(xBn.sb_bn, p, LstFilePt->setn.symbols = true; ); } // end case
case NOSB_Tn :
{ MajorCtrlSolution(xBn.sb_bn, p, LstFilePt->setn.symbols = false; ); } // end case
case XR_Tn :
{ MajorCtrlSolution(xBn.xr_bn, p, LstFilePt->setn.Xref = true;
LstFilePt->setn.symbols = true; ); } // end case
case NOXR_Tn :
{ MajorCtrlSolution(xBn.xr_bn, p, LstFilePt->setn.Xref = false; ); } // end case
case COND_Tn :
{ MajorCtrlSolution(xBn.co_bn, p, noCond = false; ); } // end case
case NOCOND_Tn :
{ MajorCtrlSolution(xBn.co_bn, p, noCond = true; ); } // end case
case MARO_Tn :
{ MajorCtrlSolution(xBn.ma_bn, p, Dismacro = false; ); } // end case
case NOMARO_Tn :
{ MajorCtrlSolution(xBn.ma_bn, p, Dismacro = true; ); } // end case
/*
case PGLEN_Tn :
{ MajorCtrlSolution(pl_bn, p, // do sth
); } // end case
case PGWIDTH_Tn:
{ MajorCtrlSolution(pw_bn, p, // do sth
); } // end case
*/
default : { pt = pt->next; } // end default
} // end switch
} // end for
return err;
} // MajorCtrlParse
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇上INCLUDE控制指令的操作。
//---------------------------------------------------------------------------
inline void MacroAsmber::
Case_Include_Do(ERR &err, AsmLine* &line, Tokenfield* &p)
{ if(p->next != NULL) // 把INCLUDE后面的命令移到下一行。
{ AsmLine* newln = new AsmLine;
newln->LineNo = line->LineNo; // 給新行賦行號值
newln->Includ = true; // 打上一個標記。
newln->HeadToken()= MacroCTRLn;
newln->head->next = p->next;
p->next = NULL;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -