X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fcasl2.c;h=14f372cf4b575f2068b31bc9e8e9ff4d62415606;hp=d17922ca607d618dc77109e159c669611af73319;hb=a639337a9aa30a059c1695ab1701b8714fd26193;hpb=d1f82970bf7d41db2fea11b08cd8e308f6cb8138 diff --git a/src/casl2.c b/src/casl2.c index d17922c..14f372c 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -4,10 +4,10 @@ #define _GNU_SOURCE #include +#include "cmem.h" +#include "cerr.h" #include "assemble.h" #include "exec.h" -#include "cerr.h" -#include "cmem.h" /** * casl2コマンドのオプション @@ -33,7 +33,7 @@ static struct option longopts[] = { /** * casl2のエラー定義 */ -static CERR cerr_casl2[] = { +CERR cerr_casl2[] = { { 126, "no source file" }, }; @@ -61,7 +61,9 @@ int main(int argc, char *argv[]) "Usage: %s [-slLaAtTdh] [-oO[]] [-M ] [-C ] 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) { @@ -125,22 +127,23 @@ int main(int argc, char *argv[]) for(pass = FIRST; pass <= SECOND; pass++) { if(pass == FIRST) { create_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を作成 */ - asprop = malloc_chk(sizeof(ASPROP), "asprop"); /* アセンブル時のプロパティ用の領域確保 */ + asptr = malloc_chk(sizeof(asptr), "asptr"); /* アセンブル時のプロパティ用の領域確保 */ } for(i = optind; i < argc; i++) { /* データの格納開始位置 */ if(pass == FIRST) { - beginptr[i] = asprop->ptr; + beginptr[i] = asptr->ptr; } else if(pass == SECOND) { - asprop->ptr = beginptr[i]; + asptr->ptr = beginptr[i]; } - asprop->prog = NULL; + asptr->prog = NULL; if(execmode.trace == true || execmode.dump == true || asmode.src == true || asmode.label == true || asmode.asdetail == true) { fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass); } if((res = assemble(argv[i], pass)) == false) { + freecerr(); /* エラーの解放 */ exit(-1); } } @@ -153,14 +156,15 @@ int main(int argc, char *argv[]) } if(pass == SECOND) { freelabel(); /* ラベルハッシュ表を解放 */ - free_chk(asprop->prog, "asprop.prog"); /* プログラム名を解放 */ - free_chk(asprop, "asprop"); /* アセンブル時のプロパティを解放 */ + free_chk(asptr->prog, "asptr.prog"); /* プログラム名を解放 */ + free_chk(asptr, "asptr"); /* アセンブル時のプロパティを解放 */ free_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を解放 */ } } if(res == true) { if(objfile != NULL) { outassemble(objfile); + free_chk(objfile, "objfile"); } if(asmode.onlyassemble == false) { create_code_type(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ @@ -173,8 +177,6 @@ int main(int argc, char *argv[]) if(cerr->num > 0) { status = -1; } - free_chk(objfile, "objfile"); - /* エラーの解放 */ - freecerr(); + freecerr(); /* エラーの解放 */ return status; }