root/src/comet2monitor.c

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

DEFINITIONS

This source file includes following definitions.
  1. addcerrlist_comet2monitor
  2. main

   1 #define _GNU_SOURCE
   2 #include "package.h"
   3 #include "exec.h"
   4 #include "load.h"
   5 #include "monitor.h"
   6 
   7 /**
   8  * comet2monitorコマンドのオプション
   9  */
  10 static struct option longopts[] = {
  11     {"trace", no_argument, NULL, 't'},
  12     {"tracearithmetic", no_argument, NULL, 't'},
  13     {"tracelogical", no_argument, NULL, 'T'},
  14     {"dump", no_argument, NULL, 'd'},
  15     {"reverse", no_argument, NULL, 'r'},
  16     {"memorysize", required_argument, NULL, 'M'},
  17     {"clocks", required_argument, NULL, 'C'},
  18     {"version", no_argument, NULL, 'v' },
  19     {"help", no_argument, NULL, 'h'},
  20     {0, 0, 0, 0},
  21 };
  22 
  23 /**
  24  * @brief casl2のエラー定義
  25  */
  26 CERR cerr_comet2monitor[] = {
  27     { 401, "invalid option" },
  28 };
  29 
  30 void addcerrlist_comet2monitor()
  31 {
  32     addcerrlist(ARRAYSIZE(cerr_comet2monitor), cerr_comet2monitor);
  33 }
  34 
  35 /**
  36  * @brief comet2monitorコマンドのメイン
  37  *
  38  * @return 正常終了時は0、異常終了時は1
  39  *
  40  * @param argc コマンドライン引数の数
  41  * @param *argv[] コマンドライン引数の配列
  42  */
  43 int main(int argc, char *argv[])
  44 {
  45     int memsize = DEFAULT_MEMSIZE;
  46     int clocks = DEFAULT_CLOCKS;
  47     int opt = 0;
  48     int stat = 0;
  49     const char *version = PACKAGE_VERSION;
  50     const char *cmdversion = "comet2monitor: COMET II machine code monitor of YACASL2 version %s\n";
  51     const char *usage = "Usage: %s [-tTdrvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
  52 
  53     /* エラーの定義 */
  54     cerr_init();
  55     addcerrlist_load();
  56     addcerrlist_exec();
  57     addcerrlist_comet2monitor();
  58 
  59     execmode.reverse = true;
  60     /* オプションの処理 */
  61     while((opt = getopt_long(argc, argv, "tTdqM:C:vh", longopts, NULL)) != -1) {
  62         switch(opt) {
  63         case 't':
  64             execmode.trace = true;
  65             break;
  66         case 'T':
  67             execmode.trace = true;
  68             execmode.logical = true;
  69             break;
  70         case 'd':
  71             execmode.dump = true;
  72             break;
  73         case 'q':
  74             execmode.reverse = false;
  75             break;
  76         case 'M':
  77             if((memsize = memsize_str2word(optarg)) == 0) {
  78                 goto comet2monitorfin;
  79             }
  80             break;
  81         case 'C':
  82             if((clocks = clock_str2clock(optarg)) == 0) {
  83                 goto comet2monitorfin;
  84             }
  85             break;
  86         case 'v':
  87             fprintf(stdout, cmdversion, version);
  88             return 0;
  89         case 'h':
  90             fprintf(stdout, usage, argv[0]);
  91             return 0;
  92         case '?':
  93             fprintf(stderr, usage, argv[0]);
  94             setcerr(212, "");    /* invalid option */
  95             goto comet2monitorfin;
  96         }
  97     }
  98     create_cmdtable(HASH_CMDTYPE);
  99     comet2_init(memsize, clocks);     /* COMET II仮想マシンの初期化 */
 100     execptr->start = 0;
 101     if(argv[optind] != NULL) {
 102         execptr->end = loadassemble(argv[optind++], execptr->start);
 103     }
 104     /* 残りの引数(オプション以外の引数)があるかチェック */
 105     if (optind < argc) {
 106         warn_ignore_arg(argc - optind, argv + optind);
 107     }
 108     execmode.monitor = true;
 109     exec();                     /* プログラム実行 */
 110     comet2_shutdown();
 111 comet2monitorfin:
 112     free_cmdtable(HASH_CMDTYPE);
 113     if(cerr->num > 0) {
 114         stat = 1;
 115     }
 116     freecerr();                 /* エラーの解放 */
 117     return stat;
 118 }

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