YACASL2
Loading...
Searching...
No Matches
casl2.c
Go to the documentation of this file.
1#define _GNU_SOURCE
2#include "package.h"
3#include "assemble.h"
4#include "exec.h"
5
11
19char *objfile_name(const char *name);
20
24static struct option longopts[] = {
25 { "source", no_argument, NULL, 's' },
26 { "label", no_argument, NULL, 'l' },
27 { "labelonly", no_argument, NULL, 'L' },
28 { "assembledetail", no_argument, NULL, 'a' },
29 { "assembledetailonly", no_argument, NULL, 'A' },
30 { "assembleout", optional_argument, NULL, 'o' },
31 { "assembleoutonly", optional_argument, NULL, 'O' },
32 { "trace", no_argument, NULL, 't' },
33 { "tracearithmetic", no_argument, NULL, 't' },
34 { "tracelogical", no_argument, NULL, 'T' },
35 { "dump", no_argument, NULL, 'd' },
36 { "monitor", no_argument, NULL, 'm' },
37 { "reverse", no_argument, NULL, 'r' },
38 { "memorysize", required_argument, NULL, 'M' },
39 { "clocks", required_argument, NULL, 'C' },
40 { "version", no_argument, NULL, 'v' },
41 { "help", no_argument, NULL, 'h' },
42 { 0, 0, 0, 0 },
43};
44
49 { 126, "no source file" },
50 { 127, "invalid option" },
51};
52
57
58char *objfile_name(const char *name)
59{
60 const char *default_name = "a.o";
61 return strdup_chk(
62 (name == NULL || !name[0]) ? default_name : name,
63 "objfile_name"
64 );
65}
66
75int main(int argc, char *argv[])
76{
77 int memsize = DEFAULT_MEMSIZE;
78 int clocks = DEFAULT_CLOCKS;
79 int opt = 0;
80 int stat = 0;
81 int asfilecnt = 0;
82 char **asfile = NULL;
83 char *objfile = NULL;
84 const char *version = PACKAGE_VERSION;
85 const char *cmdversion = "casl2 of YACASL2 version %s\n";
86 const char *usage =
87 "Usage: %s [-slLaAtTdmrvh] [-oO[<OBJECTFILE>]] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE1[ FILE2 ...]\n";
88
89 /* エラーの定義 */
90 cerr_init();
94
95 /* オプションの処理 */
96 while((opt = getopt_long(argc, argv, "tTdslLmaro::O::AM:C:vh", longopts, NULL)) != -1) {
97 switch(opt) {
98 case 's':
99 asmode.src = true;
100 break;
101 case 'l':
102 asmode.label = true;
103 break;
104 case 'L':
105 asmode.label = true;
106 asmode.onlylabel = true;
107 break;
108 case 'a':
109 asmode.asdetail = true;
110 break;
111 case 'A':
112 asmode.asdetail = true;
113 asmode.onlyassemble = true;
114 break;
115 case 'o':
116 objfile = objfile_name(optarg);
117 break;
118 case 'O':
119 asmode.onlyassemble = true;
120 objfile = objfile_name(optarg);
121 break;
122 case 't':
123 execmode.trace = true;
124 break;
125 case 'T':
126 execmode.trace = true;
127 execmode.logical = true;
128 break;
129 case 'd':
130 execmode.dump = true;
131 break;
132 case 'm':
133 execmode.monitor = true;
134 execmode.reverse = true;
135 break;
136 case 'r':
137 execmode.reverse = true;
138 break;
139 case 'M':
140 if((memsize = memsize_str2word(optarg)) == 0) {
141 goto casl2fin;
142 }
143 break;
144 case 'C':
145 if((clocks = clock_str2clock(optarg)) == 0) {
146 goto casl2fin;
147 }
148 break;
149 case 'v':
150 fprintf(stdout, cmdversion, version);
151 goto casl2fin;
152 case 'h':
153 fprintf(stdout, usage, argv[0]);
154 goto casl2fin;
155 case '?':
156 fprintf(stderr, usage, argv[0]);
157 setcerr(212, ""); /* invalid option */
158 goto casl2fin;
159 }
160 }
161
162 /* ソースファイルが指定されていない場合は終了 */
163 if(argv[optind] == NULL) {
164 setcerr(126, ""); /* no source file */
165 fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
166 goto casl2fin;
167 }
168 create_cmdtable(HASH_CMDTYPE); /* 命令の名前とタイプがキーのハッシュ表を作成 */
169 comet2_init(memsize, clocks); /* 仮想マシンCOMET IIの初期化 */
170 asfilecnt = argc - optind;
171 asfile = calloc_chk(asfilecnt, sizeof(char *), "asfile");
172 for(int i = 0; i < asfilecnt; i++) { /* 引数からファイル名配列を取得 */
173 asfile[i] = argv[optind + i];
174 }
175 /* アセンブル */
176 if(assemble(asfilecnt, asfile, 0) == false || asmode.onlylabel == true) {
177 goto shutdown;
178 }
179 /* オブジェクトファイル名が指定されている場合は、アセンブル結果をオブジェクトファイルに出力 */
180 if(objfile != NULL) {
181 outassemble(objfile);
182 }
183 /* onlyassembleモード以外の場合、仮想マシンCOMET IIを実行 */
184 if(asmode.onlyassemble == false) {
185 exec(); /* 仮想マシンCOMET IIの実行 */
186 }
187shutdown:
188 comet2_shutdown(); /* 仮想マシンCOMET IIのシャットダウン */
189casl2fin:
190 FREE(objfile);
191 FREE(asfile);
193 if(cerr->num > 0) {
194 stat = 1;
195 }
196 freecerr(); /* エラーの解放 */
197 return stat;
198}
ASMODE asmode
アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
Definition assemble.c:294
void outassemble(const char *file)
ファイルにアセンブル結果を書き込む
Definition assemble.c:793
void addcerrlist_assemble()
アセンブルエラーをエラーリストに追加する
Definition assemble.c:785
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
Definition assemble.c:739
int main(int argc, char *argv[])
casl2コマンドのメイン
Definition casl2.c:75
void addcerrlist_casl2()
CASL IIのエラーをエラーリストに追加
Definition casl2.c:53
CERR cerr_casl2[]
casl2のエラー定義
Definition casl2.c:48
char * objfile_name(const char *name)
アセンブル結果を書き込むファイルの名前
Definition casl2.c:58
static struct option longopts[]
casl2コマンドのオプション
Definition casl2.c:24
CERR * cerr
現在のエラー
Definition cerr.c:10
struct _CERR CERR
エラーを表すデータ型
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
Definition cerr.c:14
void freecerr()
エラーリストと現在のエラーを解放する
Definition cerr.c:76
void cerr_init()
エラーを初期化する
Definition cerr.c:3
void setcerr(int num, const char *str)
現在のエラーを設定する
Definition cerr.c:46
#define FREE(ptr)
メモリを解放するマクロ
Definition cmem.h:22
void * calloc_chk(size_t nmemb, size_t size, const char *tag)
領域の数とサイズを指定してメモリーを確保するcallocを実行する
Definition cmem.c:34
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
Definition cmem.h:15
char * strdup_chk(const char *s, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列を返す
Definition cmem.c:45
void exec()
COMET II仮想マシンを実行する
Definition exec.c:684
CLOCK clock_str2clock(const char *str)
クロック周波数を表す数値文字列を、正の整数値であるCLOCK型の数値に変換。変換できない場合は、エラーを表示して0を返す
Definition exec.c:92
void addcerrlist_exec()
実行エラーをエラーリストに追加する
Definition exec.c:221
WORD memsize_str2word(const char *str)
メモリーサイズを表す数値文字列をWORD値に変換して返す。WORD値に変換できない場合は、エラーを表示して0を返す
Definition struct.c:322
@ HASH_CMDTYPE
Definition struct.h:64
@ DEFAULT_MEMSIZE
Definition struct.h:21
@ DEFAULT_CLOCKS
Definition struct.h:23
void comet2_shutdown()
COMET II仮想マシンのシャットダウン
Definition struct.c:399
bool create_cmdtable(CMDTAB_HASH hash)
命令ハッシュ表を作成する
Definition struct.c:124
void free_cmdtable(CMDTAB_HASH hash)
Definition struct.c:146
void comet2_init(WORD memsize, CLOCK clocks)
COMET II仮想マシンの初期化
Definition struct.c:329
EXECMODE execmode
実行モード: trace, logical, dump, reverse, monitor, step
Definition exec.c:90
#define PACKAGE_VERSION
Definition version.h:4