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     { 128, "no source file" },
  50 };
  51 
  52 void addcerrlist_casl2()
  53 {
  54     addcerrlist(ARRAYSIZE(cerr_casl2), cerr_casl2);
  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 
  66 /**
  67  * @brief casl2コマンドのメイン
  68  *
  69  * @return 正常終了時は0、エラー発生時は1
  70  *
  71  * @param argc コマンドライン引数の数
  72  * @param *argv[] コマンドライン引数の配列
  73  */
  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 [-slLaAtTdmrvh] [-oO[<OBJECTFILE>]] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE1[ FILE2  ...]\n";
  87 
  88     /* エラーの定義 */
  89     cerr_init();
  90     addcerrlist_casl2();
  91     addcerrlist_assemble();
  92     addcerrlist_exec();
  93 
  94     /* オプションの処理 */
  95     while((opt = getopt_long(argc, argv, "tTdslLmaro::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.monitor = true;
 133             execmode.reverse = true;
 134             break;
 135         case 'r':
 136             execmode.reverse = true;
 137             break;
 138         case 'M':
 139             if((memsize = memsize_str2word(optarg)) == 0) {
 140                 goto casl2fin;
 141             }
 142             break;
 143         case 'C':
 144             if((clocks = clock_str2clock(optarg)) == 0) {
 145                 goto casl2fin;
 146             }
 147             break;
 148         case 'v':
 149             fprintf(stdout, cmdversion, version);
 150             goto casl2fin;
 151         case 'h':
 152             fprintf(stdout, usage, argv[0]);
 153             goto casl2fin;
 154         case '?':
 155             fprintf(stderr, usage, argv[0]);
 156             setcerr(212, "");    /* invalid option */
 157             goto casl2fin;
 158         }
 159     }
 160 
 161     /* ソースファイルが指定されていない場合は終了 */
 162     if(argv[optind] == NULL) {
 163         setcerr(128, "");    /* no source file */
 164         fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
 165         goto casl2fin;
 166     }
 167     create_cmdtable(HASH_CMDTYPE);                 /* 命令の名前とタイプがキーのハッシュ表を作成 */
 168     comet2_init(memsize, clocks);                  /* 仮想マシンCOMET IIの初期化 */
 169     asfilecnt = argc - optind;
 170     asfile = calloc_chk(asfilecnt, sizeof(char *), "asfile");
 171     for(int i = 0; i < asfilecnt; i++) {           /* 引数からファイル名配列を取得 */
 172         asfile[i] = argv[optind + i];
 173     }
 174     /* アセンブル */
 175     if(assemble(asfilecnt, asfile, 0) == false || asmode.onlylabel == true) {
 176         goto shutdown;
 177     }
 178     /* オブジェクトファイル名が指定されている場合は、アセンブル結果をオブジェクトファイルに出力 */
 179     if(objfile != NULL) {
 180         outassemble(objfile);
 181     }
 182     /* onlyassembleモード以外の場合、仮想マシンCOMET IIを実行 */
 183     if(asmode.onlyassemble == false) {
 184         exec();                                    /* 仮想マシンCOMET IIの実行 */
 185     }
 186 shutdown:
 187     comet2_shutdown();                             /* 仮想マシンCOMET IIのシャットダウン */
 188 casl2fin:
 189     FREE(objfile);
 190     FREE(asfile);
 191     free_cmdtable(HASH_CMDTYPE);
 192     if(cerr->num > 0) {
 193         stat = 1;
 194     }
 195     freecerr();                                    /* エラーの解放 */
 196     return stat;
 197 }

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