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