📄 asmf_h.h
字号:
//---------------------------------------------------------------------------
//-------- AsmF_H.h ---------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef AsmF_H.h // 防止被重复引用
#define AsmF_H.h
//---------------------------------------------------------------------------
#include <stdio.h>
#include "AsmL_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const int16u LineReadBufferSize = 256;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 汇编文件类,专门管理asm文件的内部存储结构。
//
//---------------------------------------------------------------------------
class AsmFile : public JObject
{ private:
MacroAsmber& masm; // parent
AsmLine* Head; // 汇编行链头
AsmLine* Tail; // 汇编行链尾
FILE* FilePt; // 文件指针, 指向汇编源文件。
Jstring FileName; // asm源文件文件名
int8u runCount; //
bool CommentEnable; // 注释启用(如果注释开启,
// 汇编器将忽略当前所有汇编行,
// 直到它被重新设置为关闭。)
int32u FileLineSum; // 文件汇编行的总数
char buff[LineReadBufferSize]; // 读缓冲区的指针,缓冲区由内部分配获得。
//----------------------------------
public:
AsmFile(MacroAsmber& msm, const Jstring& filename); // constructor
~AsmFile(); // destructor
// -------- public functions ---------
void Open(); // 打开文件
void Close(); // 关闭文件
char* ReadALine(); // 从文件中读入一行到缓冲区,返回缓冲区指针。
bool FileEnd() { return feof(FilePt); }
AsmLine* FirstLine() { return Head->next; }
void AddEndLine(); // 添加“END”汇编行。
void AddAsmLine(AsmLine* line); // 往汇编文件中添加一条汇编行。
void InsertAsmLine(AsmLine* line, AsmLine* from);
int16u& ErrorSum() { return Head->head->loc[0]; } //
int16u& WarningSum() { return Head->head->loc[1]; } //
void AddErr(int16u lineNo, ERR errNo);
void AddWarn(int16u lineNo, ERR warnNo);
// 返回指向第一个错误或警告的指针。
Tokenfield* FirstErrWarnPt() { return Head->head->next; } //
//------- debug functions ---------
void ShowFileToken();
//------- friend members ----------
friend class MacroAsmber;
friend class LISTFile;
friend class OBJfile;
friend class OBJmodule;
}; // end AsmFile
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 以只读模式打开文件。
//---------------------------------------------------------------------------
inline void AsmFile::Open()
{ FilePt = fopen((const char*)FileName,"r"); // 给文件句柄赋值。
if(FilePt == NULL)
{ printf("\nCannot open file %s!",(const char*)FileName); exit(1); }
// The file has opened...
} // end Open
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 关闭文件
//---------------------------------------------------------------------------
inline void AsmFile::Close()
{ if( fclose(FilePt) )
{ printf("\nClose file %s error.",(const char*)FileName); } // endif
} // end Close
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 从文件中读入一行,放到缓冲区里。
//---------------------------------------------------------------------------
inline char* AsmFile::ReadALine()
{ fgets(buff, LineReadBufferSize, FilePt);
buff[LineReadBufferSize-1]='\0'; // 缓冲区最终端填字串尾。
register char* p = buff + strlen(buff) - 1;
if( *p == '\n' ) // p 指向读入行最后一个字符。
{ *p = '\0'; } // endif
return buff;
} // end ReadALine
//---------------------------------------------------------------------------
const int32u MaxFileAsmLineSum = 100000;
//---------------------------------------------------------------------------
#define FatalErrPrn printf("\nFatal Error: Too many asm lines!");
//---------------------------------------------------------------------------
// 往汇编文件中添加一条汇编行。
//---------------------------------------------------------------------------
inline void AsmFile::AddAsmLine(AsmLine* line)
{ Tail->next = line;
Tail = Tail->next;
if(++FileLineSum > MaxFileAsmLineSum)
{ FatalErrPrn; exit(1); } // endif
} // end AddAsmLine
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 往汇编文件中插入一条汇编行。插在from后面。
//---------------------------------------------------------------------------
inline void AsmFile::InsertAsmLine(AsmLine* line, AsmLine* from)
{ line->next = from->next;
from->next = line;
if(++FileLineSum > MaxFileAsmLineSum)
{ FatalErrPrn; exit(1); } // endif
if(Tail == from) { Tail = line; } // endif
} // end InsertAsmLine
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
inline void AsmFile::AddEndLine()
{ Tail->next = new AsmLine;
++FileLineSum;
Tail->next->AddTokenfield(END, NULL, 0);
Tail->next->LineNo = Tail->LineNo + 1;
Tail = Tail->next;
} // end AddEndLine
//---------------------------------------------------------------------------
#undef FatalErrPrn
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -