root/src/casl2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. addcerrlist_casl2
  2. objfile_name
  3. main

   1 #define _GNU_SOURCE
   2 #include "package.h"
   3 #include "assemble.h"
   4 #include "exec.h"
   5 
   6 /**
   7  * @brief CASL IIのエラーをエラーリストに追加
   8  *
   9  */
  10 void addcerrlist_casl2();
  11 
  12 /**
  13  * @brief アセンブル結果を書き込むファイルの名前
  14  *
  15  * @return ファイル名
  16  *
  17  * @param *name ファイル名
  18  */
  19 char *objfile_name(const char *name);
  20 
  21 /**
  22  * @brief casl2コマンドのオプション
  23  */
  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     { "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 
  45 /**
  46  * @brief casl2のエラー定義
  47  */
  48 CERR cerr_casl2[] = {
  49     { 126, "no source file" },
  50     { 127, "invalid option" },
  51 };
  52 
  53 void addcerrlist_casl2()
  54 {
  55     addcerrlist(ARRAYSIZE(cerr_casl2), cerr_casl2);
  56 }
  57 
  58 char *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 
  67 /**
  68  * @brief casl2コマンドのメイン
  69  *
  70  * @return 正常終了時は0、エラー発生時は1
  71  *
  72  * @param argc コマンドライン引数の数
  73  * @param *argv[] コマンドライン引数の配列
  74  */
  75 int 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();
  91     addcerrlist_casl2();
  92     addcerrlist_assemble();
  93     addcerrlist_exec();
  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.step = 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     }
 187 shutdown:
 188     comet2_shutdown();                             /* 仮想マシンCOMET IIのシャットダウン */
 189 casl2fin:
 190     FREE(objfile);
 191     FREE(asfile);
 192     free_cmdtable(HASH_CMDTYPE);
 193     if(cerr->num > 0) {
 194         stat = 1;
 195     }
 196     freecerr();                                    /* エラーの解放 */
 197     return stat;
 198 }

/* [<][>][^][v][top][bottom][index][help] */