OPD *opd; /**<オペランド */
} CMDLINE;
+/**
+ * トークン取得のエラーを追加
+ */
+void addcerrlist_tok();
+
/**
* 空白またはタブで区切られた1行から、トークンを取得する
*/
CMDLINE *linetok(const char *line);
+/**
+ * アセンブルエラーをエラーリストに追加
+ */
+void addcerrlist_assemble();
+
/**
* 指定された名前のファイルをアセンブル
* 2回実行される
/**
* エラーの構造体
*/
-typedef struct {
+typedef struct _CERR {
int num; /**<エラー番号 */
char *msg; /**<エラーメッセージ */
} CERR;
*/
bool addcerrlist(int cerrc, CERR cerrv[]);
+/**
+ * エラーリストを表示する
+ */
+void printcerrlist();
+
/**
* 現在のエラーを設定する
*/
*/
extern EXECMODE execmode;
+/**
+ * 実行エラーをエラーリストに追加
+ */
+bool addcerrlist_exec();
+
/**
* 指定されたファイルからアセンブル結果を読み込む
*/
/* WORD - 16ビットデータ型 */
typedef unsigned short WORD;
-/* 10進数または16進数の文字列をWORD値に変換 */
+/**
+ * wordのエラーをエラーリストに追加
+ */
+bool addcerrlist_word();
+
+/**
+ * 10進数または16進数の文字列をWORD値に変換
+ */
WORD nh2word(const char *str);
-/* WORD値を10進数の文字列に変換 */
+/**
+ * WORD値を10進数の文字列に変換
+ */
char *word2n(WORD word);
-/* WORD値を2進数の文字列に変換 */
+/**
+ * WORD値を2進数の文字列に変換
+ */
char *word2bit(const WORD word);
-/* WORD値を解析して表示 */
+/**
+ * WORD値を解析して表示
+ */
void print_dumpword(WORD word, bool logicalmode);
#endif
return true;
}
+/**
+ * アセンブルのエラーをエラーリストに追加
+ */
+void addcerrlist_assemble()
+{
+ addcerrlist_tok();
+ addcerrlist_word();
+ addcerrlist(ARRAYSIZE(cerr_assemble), cerr_assemble);
+}
+
/**
* 指定された名前のファイルをアセンブル
* 2回実行される
char *line;
FILE *fp;
- addcerrlist(ARRAYSIZE(cerr_assemble), cerr_assemble);
if((fp = fopen(file, "r")) == NULL) {
perror(file);
return false;
#define _GNU_SOURCE
#include <getopt.h>
+#include "cmem.h"
+#include "cerr.h"
#include "assemble.h"
#include "exec.h"
-#include "cerr.h"
-#include "cmem.h"
/**
* casl2コマンドのオプション
/**
* casl2のエラー定義
*/
-static CERR cerr_casl2[] = {
+CERR cerr_casl2[] = {
{ 126, "no source file" },
};
"Usage: %s [-slLaAtTdh] [-oO[<OBJECTFILE>]] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE1[ FILE2 ...]\n";
cerr_init();
- addcerrlist(sizeof(cerr_casl2), cerr_casl2);
+ addcerrlist(ARRAYSIZE(cerr_casl2), cerr_casl2);
+ addcerrlist_assemble();
+ addcerrlist_exec();
/* オプションの処理 */
while((opt = getopt_long(argc, argv, "tTdslLao::O::AM:C:h", longopts, NULL)) != -1) {
switch(opt) {
fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass);
}
if((res = assemble(argv[i], pass)) == false) {
+ freecerr(); /* エラーの解放 */
exit(-1);
}
}
if(res == true) {
if(objfile != NULL) {
outassemble(objfile);
+ free_chk(objfile, "objfile");
}
if(asmode.onlyassemble == false) {
create_code_type(); /* 命令のコードとタイプがキーのハッシュ表を作成 */
if(cerr->num > 0) {
status = -1;
}
- free_chk(objfile, "objfile");
- /* エラーの解放 */
- freecerr();
+ freecerr(); /* エラーの解放 */
return status;
}
CERRLIST *cerrlist;
/**
- * ã\82¨ã\83©ã\83¼ã\83ªã\82¹ã\83\88ã\82\92ä½\9cæ\88\90ã\83»追加する
+ * ã\82¨ã\83©ã\83¼ã\83ªã\82¹ã\83\88ã\82\92ä½\9cæ\88\90ã\81¾ã\81\9fã\81¯追加する
*/
bool addcerrlist(int newerrc, CERR newerrv[])
{
return true;
}
+/**
+ * エラーリストを表示する
+ */
+void printcerrlist()
+{
+ CERRLIST *p;
+
+ if(cerrlist == NULL) {
+ puts("error list is null.");
+ } else {
+ for(p = cerrlist; p != NULL; p = p->next) {
+ printf("%d: %s\n", p->cerr->num, p->cerr->msg);
+ }
+ }
+}
+
/**
* 現在のエラーを設定する
*/
p = q;
}
/* 現在のエラーメッセージを解放 */
- free_chk(cerr->msg, "cerr.msg");
+ /* free_chk(cerr->msg, "cerr->msg"); */
/* 現在のエラーを解放 */
free_chk(cerr, "cerr");
}
const char *usage = "Usage: %s [-tTdh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
cerr_init();
- addcerrlist(ARRAYSIZE(cerr_comet2), cerr_comet2); /* エラーリスト作成 */
+ addcerrlist(ARRAYSIZE(cerr_comet2), cerr_comet2);
+ addcerrlist_exec();
/* オプションの処理 */
while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
const char *usage = "Usage: %s [-alh] WORD\n";
cerr_init();
+ addcerrlist_word();
while((opt = getopt_long(argc, argv, "alh", longopts, NULL)) != -1) {
switch(opt) {
case 'l':
#include "exec.h"
#include "cerr.h"
-/**
- * アセンブルファイル読み込みエラーの定義
- */
-static CERR cerr_loadassemble[] = {
- { 201, "Loading - full of COMET II memory" },
-};
-
/**
* 実行エラーの定義
*/
static CERR cerr_exec[] = {
+ { 201, "Loading - full of COMET II memory" },
{ 202, "SVC input - out of Input memory" },
{ 203, "SVC output - out of COMET II memory" },
{ 204, "Program Register (PR) - out of COMET II memory" },
*/
EXECMODE execmode = {false, false, false};
+/**
+ * 実行エラーをエラーリストに追加
+ */
+bool addcerrlist_exec()
+{
+ return addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec);
+}
+
/**
* 指定されたファイルからアセンブル結果を読み込む
*/
-bool loadassemble(char *file) {
+bool loadassemble(char *file)
+{
FILE *fp;
bool status = true;
- addcerrlist(ARRAYSIZE(cerr_exec), cerr_loadassemble); /* エラーリスト作成 */
assert(file != NULL);
if((fp = fopen(file, "r")) == NULL) {
perror(file);
char *errpr = malloc_chk(CERRSTRSIZE + 1, "exec.errpr");
clock_t clock_begin, clock_end;
- addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec); /* エラーリスト作成 */
if(execmode.trace == true) {
fprintf(stdout, "\nExecuting machine codes\n");
}
#include "cmem.h"
#include "assemble.h"
+
+/**
+ * 行トークン取得のエラー定義
+ */
+CERR cerr_linetok[] = {
+ { 104, "label length is too long" },
+ { 105, "no command in the line" },
+};
+
+/**
+ * オペランドトークン取得のエラー定義
+ */
+static CERR cerr_opdtok[] = {
+ { 117, "operand too many in DC" },
+ { 118, "operand length too long" },
+ { 121, "cannot get operand token" },
+ { 123, "unclosed quote" },
+};
+
+/**
+ * オペランドトークン取得のエラーを追加
+ */
+void addcerrlist_tok()
+{
+ addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok);
+ addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok);
+}
+
/**
* 「,」区切りの文字列から、オペランドのトークンを取得
*/
int sepc = ',', rcnt = 0;
bool quoting = false;
- CERR cerr_opdtok[] = {
- { 117, "operand too many in DC" },
- { 118, "operand length too long" },
- { 121, "cannot get operand token" },
- { 123, "unclosed quote" },
- };
- addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok);
opd->opdc = 0;
if(str == NULL) {
return opd;
bool quoting = false;
CMDLINE *cmdl = malloc_chk(sizeof(CMDLINE), "cmdl");
- CERR cerr_linetok[] = {
- { 104, "label length is too long" },
- { 105, "no command in the line" },
- };
- addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok);
if(line == NULL || strlen(line) == 0) {
return NULL;
}
{ 116, "out of hex range" },
};
+/**
+ * wordのエラーをエラーリストに追加
+ */
+bool addcerrlist_word()
+{
+ return addcerrlist(ARRAYSIZE(cerr_word), cerr_word);
+}
+
/**
* 10進数の文字列をWORD値に変換
*/
WORD nh2word(const char *str)
{
assert(sizeof(WORD)*8 == 16); /* WORD型のサイズが16ビットであることを確認 */
- addcerrlist(ARRAYSIZE(cerr_word), cerr_word); /* エラーの設定 */
WORD word;