From: j8takagi Date: Fri, 5 Feb 2010 23:22:02 +0000 (+0900) Subject: エラー表をコマンドごとに持つよう内部構造を変更 X-Git-Tag: v0.1~66 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccc3acda4256e10a822e41e84f6c9991271c2f61;p=YACASL2.git エラー表をコマンドごとに持つよう内部構造を変更 --- diff --git a/include/casl2.h b/include/casl2.h index a293b13..fa4b0ae 100644 --- a/include/casl2.h +++ b/include/casl2.h @@ -124,6 +124,6 @@ void print_code_type(); void free_code_type(); /* 指定されたファイルにアセンブル結果を書込 */ -void outassemble(char *file); +void outassemble(const char *file); #endif diff --git a/src/assemble.c b/src/assemble.c index 40c3704..27ebfdb 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -97,8 +97,7 @@ void writestr(const char *str, bool literal, PASS pass) setcerr(123, str); /* illegal string */ break; } - /* 「'」の場合 */ - /* 次の文字が「'」でない場合は正常終了 */ + /* 「'」の場合、次の文字が「'」でない場合は正常終了 */ if(*p == '\'' && *(++p) != '\'') { break; } else if(literal == true && lw == true) { diff --git a/src/casl2.c b/src/casl2.c index e2d8cc5..85a3ab5 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -26,8 +26,44 @@ static struct option longopts[] = ASMODE asmode = {false, false, false, false, false}; EXECMODE execmode = {false, false, false}; -/* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */ -void outassemble(char *file) { +/* エラー番号とエラーメッセージ */ +CERRARRAY cerr[] = { + { 101, "label already defined" }, + { 102, "label table is full" }, + { 103, "label not found" }, + { 104, "label length is too long" }, + { 105, "no command in the line" }, + { 106, "operand count mismatch" }, + { 107, "no label in START" }, + { 108, "not command of operand \"r\"" }, + { 109, "not command of operand \"r1,r2\"" }, + { 110, "not command of operand \"r,adr[,x]\"" }, + { 111, "not command of operand \"adr[,x]\"" }, + { 112, "not command of no operand" }, + { 113, "command not defined" }, + { 114, "not integer" }, + { 115, "not hex" }, + { 116, "out of hex range" }, + { 117, "operand is too many" }, + { 118, "operand length is too long" }, + { 119, "out of COMET II memory" }, + { 120, "GR0 in operand x" }, + { 121, "cannot get operand token" }, + { 122, "cannot create hash table" }, + { 123, "illegal string" }, + { 124, "more than one character in literal" }, + { 201, "execute - out 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" }, + { 205, "Stack Pointer (SP) - cannot allocate stack buffer" }, + { 206, "Address - out of COMET II memory" }, + { 207, "Stack Pointer (SP) - out of COMET II memory" }, + { 0, NULL }, +}; + +/* 指定されたファイルにアセンブル結果を書込 */ +void outassemble(const char *file) { FILE *fp; if((fp = fopen(file, "w")) == NULL) { perror(file); @@ -37,6 +73,19 @@ void outassemble(char *file) { fclose(fp); } +/* アセンブル結果を書き込むファイルの名前 */ +const char *objfile_name(const char *str) +{ + const char *default_name = "a.o"; + + if(optarg == NULL) { + return default_name; + } else { + return str; + } +} + +/* casl2コマンド */ int main(int argc, char *argv[]) { int opt, i; @@ -44,7 +93,6 @@ int main(int argc, char *argv[]) bool status = false; WORD beginptr[argc]; char *objfile = NULL; - const char *default_objfile = "a.o"; const char *usage = "Usage: %s [-slLaAtTdh] [-oO] [-M ] [-C ] FILE ...\n"; @@ -64,23 +112,15 @@ int main(int argc, char *argv[]) (&asmode)->asdetailmode = true; break; case 'A': - (&asmode)->onlyassemblemode = true; (&asmode)->asdetailmode = true; + (&asmode)->onlyassemblemode = true; break; case 'o': - if(optarg == NULL) { - objfile = strdup(default_objfile); - } else { - objfile = strdup(optarg); - } + objfile = strdup(objfile_name(optarg)); break; case 'O': (&asmode)->onlyassemblemode = true; - if(optarg == NULL) { - objfile = strdup(default_objfile); - } else { - objfile = strdup(optarg); - } + objfile = strdup(objfile_name(optarg)); break; case 't': (&execmode)->tracemode = true; @@ -106,11 +146,12 @@ int main(int argc, char *argv[]) exit(-1); } } + /* ソースファイルが指定されていない場合は終了 */ if(argv[optind] == NULL) { fprintf(stderr, "source file is not specified\n"); exit(-1); } - /* ソースファイルが指定されていない場合は終了 */ + /* COMET II仮想マシンのリセット */ reset(); /* アセンブル。ラベル表作成のため、2回行う */ for(pass = FIRST; pass <= SECOND; pass++) { diff --git a/src/cerr.c b/src/cerr.c index f7971f6..121b680 100644 --- a/src/cerr.c +++ b/src/cerr.c @@ -7,6 +7,8 @@ char *cerrmsg; /* エラー番号とエラーメッセージを設定する */ void setcerr(int num, const char *val) { + assert(&cerr != NULL && num > 0); + cerrno = num; cerrmsg = malloc(MSGSIZE + 1); if(val != NULL) { @@ -21,9 +23,10 @@ void setcerr(int num, const char *val) /* エラー番号からメッセージを返す */ char *getcerrmsg(int num) { - assert(num > 0); + assert(&cerr != NULL && num > 0); int i = 0; CERRARRAY *ptr; + do { if((ptr = &cerr[i++])->num == num) { return ptr->msg; diff --git a/src/comet2.c b/src/comet2.c index 1c47d19..bfe1634 100644 --- a/src/comet2.c +++ b/src/comet2.c @@ -16,7 +16,19 @@ static struct option longopts[] = { EXECMODE execmode = {false, false, false}; -/* 指定されたファイルからCOMET II仮想メモリ(アセンブル結果)を読込 */ +/* エラー番号とエラーメッセージ */ +CERRARRAY cerr[] = { + { 201, "execute - out 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" }, + { 205, "Stack Pointer (SP) - cannot allocate stack buffer" }, + { 206, "Address - out of COMET II memory" }, + { 207, "Stack Pointer (SP) - out of COMET II memory" }, + { 0, NULL }, +}; + +/* 指定されたファイルからアセンブル結果を読込 */ bool inassemble(char *file) { FILE *fp; reset(); @@ -29,6 +41,7 @@ bool inassemble(char *file) { return true; } +/* comet2コマンド */ int main(int argc, char *argv[]) { int opt; diff --git a/src/exec.c b/src/exec.c index 4e34404..b9f9871 100644 --- a/src/exec.c +++ b/src/exec.c @@ -40,10 +40,9 @@ void svcout() if(memory[GR[1]+i] == '\0') { break; } - /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 - それ以外の文字は、「.」で表す */ - if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') - { + /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 */ + /* それ以外の文字は、「.」で表す */ + if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') { putchar(c); } else { putchar('.'); @@ -231,7 +230,7 @@ WORD srl(WORD val0, WORD val1) return res; } -/* 仮想マシンのリセット */ +/* COMET II仮想マシンのリセット */ void reset() { int i; diff --git a/src/struct.c b/src/struct.c index b591611..89daa05 100644 --- a/src/struct.c +++ b/src/struct.c @@ -6,41 +6,6 @@ WORD *memory; /* COMET IIのCPUレジスタ */ WORD GR[REGSIZE], SP, PR, FR; -CERRARRAY cerr[] = { - { 101, "label already defined" }, - { 102, "label table is full" }, - { 103, "label not found" }, - { 104, "label length is too long" }, - { 105, "no command in the line" }, - { 106, "operand count mismatch" }, - { 107, "no label in START" }, - { 108, "not command of operand \"r\"" }, - { 109, "not command of operand \"r1,r2\"" }, - { 110, "not command of operand \"r,adr[,x]\"" }, - { 111, "not command of operand \"adr[,x]\"" }, - { 112, "not command of no operand" }, - { 113, "command not defined" }, - { 114, "not integer" }, - { 115, "not hex" }, - { 116, "out of hex range" }, - { 117, "operand is too many" }, - { 118, "operand length is too long" }, - { 119, "out of COMET II memory" }, - { 120, "GR0 in operand x" }, - { 121, "cannot get operand token" }, - { 122, "cannot create hash table" }, - { 123, "illegal string" }, - { 124, "more than one character in literal" }, - { 201, "execute - out 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" }, - { 205, "Stack Pointer (SP) - cannot allocate stack buffer" }, - { 206, "Address - out of COMET II memory" }, - { 207, "Stack Pointer (SP) - out of COMET II memory" }, - { 0, NULL }, -}; - /* メモリーサイズ */ int memsize = DEFAULT_MEMSIZE;