/**
* 指定された名前のファイルをアセンブル
- * 2回実行される
+ * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
+ * アセンブル完了時はtrue、エラー発生時はfalseを返す
*/
-void assemble(const char *file, PASS pass);
+bool assemblefile(const char *file, PASS pass);
/**
* 引数で指定したファイルにアセンブル結果を書込
/**
* 指定された名前のファイルをアセンブル
- * 2回実行される
+ * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
+ * アセンブル完了時はtrue、エラー発生時はfalseを返す
*/
-void assemble(const char *file, PASS pass)
+bool assemblefile(const char *file, PASS pass)
{
int lineno = 0;
char *line;
if((fp = fopen(file, "r")) == NULL) {
perror(file);
- exit(-1);
+ return false;
}
line = malloc_chk(LINESIZE + 1, "assemble.line");
while(fgets(line, LINESIZE, fp)) {
}
FREE(line);
fclose(fp);
+ return (cerr->num == 0) ? true : false;
}
/**
}
/**
- * アセンブルを実行
+ * 指定された1つまたは複数のファイルを2回アセンブル
*/
-void doassemble(int filec, char *filev[])
+void assemble(int filec, char *filev[])
{
int i;
PASS pass;
{
fprintf(stdout, "\nAssemble %s (%d)\n", filev[i], pass);
}
- assemble(filev[i], pass);
- if(cerr->num > 0) {
+ if(assemblefile(filev[i], pass) == false) {
goto assemblefin;
}
}
for(i = 0; i < argc - optind; i++) { /* 引数からファイル名配列を取得 */
af[i] = argv[optind + i];
}
- doassemble(i, af); /* アセンブル */
+ assemble(i, af); /* アセンブル */
if(asmode.onlylabel == true || cerr->num > 0) {
goto casl2fin;
}