*/
void addcerrlist_exec();
-/**
- * @brief アセンブル結果読み込みエラーをエラーリストに追加する
- */
-void addcerrlist_load();
-
/**
* @brief 指定されたファイルからアセンブル結果を読み込む
*
*/
typedef unsigned short WORD;
+/**
+ * @brief アセンブル結果読み込みエラーをエラーリストに追加する
+ */
+void addcerrlist_load();
+
/**
* @brief wordデータ型についてのエラーをエラーリストに追加する
*
goto casl2fin;
case '?':
fprintf(stderr, usage, argv[0]);
- setcerr(127, ""); /* invalid option */
+ setcerr(212, ""); /* invalid option */
goto casl2fin;
}
}
/* ソースファイルが指定されていない場合は終了 */
if(argv[optind] == NULL) {
setcerr(126, ""); /* no source file */
- fprintf(stderr, "CASL2 error - %d: %s\n", cerr->num, cerr->msg);
+ fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
goto casl2fin;
}
create_cmdtable(HASH_CMDTYPE); /* 命令の名前とタイプがキーのハッシュ表を作成 */
}
/* アセンブル */
if(assemble(i, af, 0) == false || asmode.onlylabel == true) {
- goto freecmdtable;
+ goto shutdown;
}
/* オブジェクトファイル名が指定されている場合は、アセンブル結果をオブジェクトファイルに出力 */
if(objfile != NULL) {
if(asmode.onlyassemble == false) {
exec(); /* 仮想マシンCOMET IIの実行 */
}
-freecmdtable:
- shutdown(); /* 仮想マシンCOMET IIのシャットダウン */
- free_cmdtable(HASH_CMDTYPE);
+shutdown:
+ shutdown(); /* 仮想マシンCOMET IIのシャットダウン */
casl2fin:
+ free_cmdtable(HASH_CMDTYPE);
FREE(objfile);
if(cerr->num > 0) {
stat = 1;
const char *version = PACKAGE_VERSION, *cmdversion = "disassemble of YACASL2 version %s\n";
const char *usage = "Usage: %s [-vh] FILE\n";
+ /* エラーの定義 */
cerr_init();
addcerrlist_load();
addcerrlist_exec();
switch(opt) {
case 'v':
fprintf(stdout, cmdversion, version);
- return 0;
+ goto casl2revfin;
case 'h':
fprintf(stdout, usage, argv[0]);
- return 0;
+ goto casl2revfin;
case '?':
fprintf(stderr, usage, argv[0]);
- exit(1);
+ setcerr(212, ""); /* invalid option */
+ goto casl2revfin;
}
}
if(argv[optind] == NULL) {
exit(1);
}
disassemble_file(argv[optind]); /* プログラム実行 */
- stat = (cerr->num == 0) ? 0 : 1;
+casl2revfin:
+ if(cerr->num > 0) {
+ stat = 1;
+ }
freecerr(); /* エラーの解放 */
return stat;
}
{0, 0, 0, 0},
};
+
+/**
+ * @brief comet2のエラー定義
+ */
+CERR cerr_comet2[] = {
+ { 127, "invalid option" },
+};
+
+void addcerrlist_comet2()
+{
+ addcerrlist(ARRAYSIZE(cerr_comet2), cerr_comet2);
+}
+
/**
* @brief comet2コマンドのメイン
*
const char *version = PACKAGE_VERSION, *cmdversion = "comet2 of YACASL2 version %s\n";
const char *usage = "Usage: %s [-tTdmvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
+ /* エラーの定義 */
+ cerr_init();
+ addcerrlist_comet2();
+ addcerrlist_load();
+ addcerrlist_exec();
+
/* オプションの処理 */
while((opt = getopt_long(argc, argv, "tTdmM:C:vh", longopts, NULL)) != -1) {
switch(opt) {
break;
case 'v':
fprintf(stdout, cmdversion, version);
- return 0;
+ goto comet2fin;
case 'h':
fprintf(stdout, usage, argv[0]);
- return 0;
+ goto comet2fin;
case '?':
fprintf(stderr, usage, argv[0]);
- exit(1);
+ setcerr(212, ""); /* invalid option */
+ goto comet2fin;
}
}
- /* エラーの定義 */
- cerr_init();
- addcerrlist_load();
- addcerrlist_exec();
-
if(argv[optind] == NULL) {
setcerr(211, ""); /* object file not specified */
fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
- goto fin;
+ goto comet2fin;
}
reset(memsize, clocks); /* COMET II仮想マシンのリセット */
execptr->start = 0;
- if((execptr->end = loadassemble(argv[optind], execptr->start)) > 0 && cerr->num == 0) {
+ execptr->end = loadassemble(argv[optind], execptr->start);
+ if(execptr->end > 0 && cerr->num == 0) {
exec(); /* プログラム実行 */
}
shutdown(); /* COMET II仮想マシンのシャットダウン */
-fin:
- stat = (cerr->num == 0) ? 0 : 1;
+comet2fin:
+ if(cerr->num > 0) {
+ stat = 1;
+ }
freecerr(); /* エラーの解放 */
return stat;
}
};
/**
- * @brief comet2コマンドのメイン
+ * @brief casl2のエラー定義
+ */
+CERR cerr_comet2monitor[] = {
+ { 401, "invalid option" },
+};
+
+void addcerrlist_comet2monitor()
+{
+ addcerrlist(ARRAYSIZE(cerr_comet2monitor), cerr_comet2monitor);
+}
+
+/**
+ * @brief comet2monitorコマンドのメイン
*
* @return 正常終了時は0、異常終了時は1
*
const char *version = PACKAGE_VERSION, *cmdversion = "comet2monitor: COMET II machine code monitor of YACASL2 version %s\n";
const char *usage = "Usage: %s [-vh] [-M <MEMORYSIZE>] [-C <CLOCKS>]\n";
+ /* エラーの定義 */
+ cerr_init();
+ addcerrlist_load();
+ addcerrlist_exec();
+ addcerrlist_comet2monitor();
+
/* オプションの処理 */
while((opt = getopt_long(argc, argv, "M:C:vh", longopts, NULL)) != -1) {
switch(opt) {
return 0;
case 'h':
fprintf(stdout, usage, argv[0]);
- return 0;
+ goto comet2monitorfin;
case '?':
fprintf(stderr, usage, argv[0]);
- exit(1);
+ setcerr(212, ""); /* invalid option */
+ goto comet2monitorfin;
}
}
- /* エラーの定義 */
- cerr_init();
- addcerrlist_load();
- addcerrlist_exec();
-
create_cmdtable(HASH_CMDTYPE);
reset(memsize, clocks); /* COMET II仮想マシンのリセット */
execptr->start = 0;
execmode.monitor = true;
exec(); /* プログラム実行 */
-
shutdown();
+comet2monitorfin:
free_cmdtable(HASH_CMDTYPE);
free_cmdtable(HASH_CODE);
- stat = (cerr->num == 0) ? 0 : 1;
+ if(cerr->num > 0) {
+ stat = 1;
+ }
freecerr(); /* エラーの解放 */
return stat;
}
int main(int argc, char *argv[])
{
bool logicalmode = false; /* レジストリの内容を論理値(0から65535)で表示する場合はtrue */
- int opt;
+ int opt, stat = 0;
WORD word;
const char *version = PACKAGE_VERSION, *cmdversion = "dumpword of YACASL2 version %s\n";
const char *usage = "Usage: %s [-alh] WORD\n";
+ /* エラーの定義 */
+ cerr_init();
+ addcerrlist_load();
+ addcerrlist_word();
+
+ /* オプションの処理 */
while((opt = getopt_long(argc, argv, "alvh", longopts, NULL)) != -1) {
switch(opt) {
case 'l':
break;
case 'v':
fprintf(stdout, cmdversion, version);
- return 0;
+ goto dumpwordfin;
case 'h':
fprintf(stdout, usage, argv[0]);
- return 0;
+ goto dumpwordfin;
case '?':
fprintf(stderr, usage, argv[0]);
- exit(1);
+ setcerr(212, ""); /* invalid option */
+ goto dumpwordfin;
}
}
- /* エラーの定義 */
- cerr_init();
- addcerrlist_word();
-
if(argv[optind] == NULL) {
+ setcerr(213, ""); /* invalid argument */
fprintf(stderr, usage, argv[0]);
- freecerr();
- exit(1);
+ goto dumpwordfin;
}
/* WORD値に変換 */
word = nh2word(argv[optind]);
if(cerr->num > 0) {
fprintf(stderr, "Dumpword Error - %d: %s\n", cerr->num, cerr->msg);
- freecerr();
- exit(1);
+ goto dumpwordfin;
}
fprintf(stdout, "%6s: ", argv[optind]);
print_dumpword(word, logicalmode);
fprintf(stdout, "\n");
- freecerr();
- return 0;
+dumpwordfin:
+ if(cerr->num > 0) {
+ stat = 1;
+ }
+ freecerr(); /* エラーの解放 */
+ return stat;
}
{ 209, "SVC output - memory overflow" },
};
-/**
- * @brief アセンブル結果読み込みエラーの定義
- */
-static CERR cerr_load[] = {
- { 210, "load - memory overflow" },
- { 211, "object file not specified" },
-};
-
/**
* @brief 実行モード: trace, logical, dump, dump_start, dump_end, monitor, step
*/
}
/* exec.hで定義された関数群 */
-void addcerrlist_load()
-{
- addcerrlist(ARRAYSIZE(cerr_load), cerr_load);
-}
-
void addcerrlist_exec()
{
addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec);
}
}
+int monquit()
+{
+ int stat = 0;
+ shutdown();
+ freebps();
+ free_cmdtable(HASH_CMDTYPE);
+ free_cmdtable(HASH_CODE);
+ if(cerr->num > 0) {
+ stat = 1;
+ }
+ freecerr();
+ return stat;
+}
+
void monitor()
{
char *buf = NULL;
- int i;
MONCMDLINE *moncmdl;
MONCMDTYPE cmdtype = MONREPEAT;
if(!buf[0]) {
cmdtype = MONQUIT;
}
- if((i = strcspn(buf, "\n")) > 0 || buf[0] == '\n') {
- buf[i] = '\0';
- }
+ strip_end(buf); /* 文字列末尾の改行と空白を削除 */
if((moncmdl = monlinetok(buf)) != NULL) {
cmdtype = monitorcmd(moncmdl->cmd, moncmdl->args);
free_moncmdline(moncmdl);
}
FREE(buf);
if(cmdtype == MONQUIT) {
- shutdown();
- freebps();
- free_cmdtable(HASH_CMDTYPE);
- freecerr();
- exit(0);
+ exit(monquit());
}
} while(cmdtype == MONREPEAT);
}
*/
bool create_cmdtable(CMDTAB_HASH hash)
{
- CMDTAB *p;
+ CMDTAB *p = NULL;
unsigned hashval;
int i;
*/
WORD h2word(const char *str);
-/**
- * @brief wordのエラー定義
- */
-static CERR cerr_word[] = {
- { 114, "not integer" },
- { 115, "not hex" },
- { 116, "out of hex range" },
-};
-
WORD n2word(const char *str)
{
assert(isdigit(str[0]) || str[0] == '-');
return w;
}
+/**
+ * @brief wordのエラー定義
+ */
+static CERR cerr_word[] = {
+ { 114, "not integer" },
+ { 115, "not hex" },
+ { 116, "out of hex range" },
+};
+
+/**
+ * @brief ファイル読み込みのエラー定義
+ */
+static CERR cerr_load[] = {
+ { 210, "load - memory overflow" },
+ { 211, "object file not specified" },
+ { 212, "invalid option" },
+ { 213, "invalid argument" },
+};
+
/* word.hで定義された関数群 */
+void addcerrlist_load()
+{
+ addcerrlist(ARRAYSIZE(cerr_load), cerr_load);
+}
+
void addcerrlist_word()
{
addcerrlist(ARRAYSIZE(cerr_word), cerr_word);
-CASL2 error - 126: no source file
+casl2 error - 126: no source file