root/src/comet2.c

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

DEFINITIONS

This source file includes following definitions.
  1. main

   1 #define _GNU_SOURCE
   2 #include "package.h"
   3 #include "exec.h"
   4 #include "load.h"
   5 
   6 /**
   7  * comet2コマンドのオプション
   8  */
   9 static struct option longopts[] = {
  10     { "trace", no_argument, NULL, 't' },
  11     { "tracearithmetic", no_argument, NULL, 't' },
  12     { "tracelogical", no_argument, NULL, 'T' },
  13     { "dump", no_argument, NULL, 'd' },
  14     { "monitor", no_argument, NULL, 'm' },
  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 comet2コマンドのメイン
  25  *
  26  * @return 正常終了時は0、異常終了時は1
  27  *
  28  * @param argc コマンドライン引数の数
  29  * @param *argv[] コマンドライン引数の配列
  30  */
  31 int main(int argc, char *argv[])
  32 {
  33     int memsize = DEFAULT_MEMSIZE;
  34     int clocks = DEFAULT_CLOCKS;
  35     int opt = 0;
  36     int stat = 0;
  37     const char *version = PACKAGE_VERSION;
  38     const char *cmdversion = "comet2 of YACASL2 version %s\n";
  39     const char *usage = "Usage: %s [-tTdmrvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
  40 
  41     /* エラーの定義 */
  42     cerr_init();
  43     addcerrlist_load();
  44     addcerrlist_exec();
  45 
  46     /* オプションの処理 */
  47     while((opt = getopt_long(argc, argv, "tTdmrM:C:vh", longopts, NULL)) != -1) {
  48         switch(opt) {
  49         case 't':
  50             execmode.trace = true;
  51             break;
  52         case 'T':
  53             execmode.trace = true;
  54             execmode.logical = true;
  55             break;
  56         case 'd':
  57             execmode.dump = true;
  58             break;
  59         case 'm':
  60             execmode.monitor = true;
  61             execmode.reverse = true;
  62             break;
  63         case 'r':
  64             execmode.reverse = true;
  65             break;
  66         case 'M':
  67             if((memsize = memsize_str2word(optarg)) == 0) {
  68                 goto comet2fin;
  69             }
  70             break;
  71         case 'C':
  72             if((clocks = clock_str2clock(optarg)) == 0) {
  73                 goto comet2fin;
  74             }
  75             break;
  76         case 'v':
  77             fprintf(stdout, cmdversion, version);
  78             goto comet2fin;
  79         case 'h':
  80             fprintf(stdout, usage, argv[0]);
  81             goto comet2fin;
  82         case '?':
  83             fprintf(stderr, usage, argv[0]);
  84             setcerr(212, "");    /* invalid option */
  85             goto comet2fin;
  86         }
  87     }
  88     if(argv[optind] == NULL) {
  89         setcerr(211, "");    /* object file not specified */
  90         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
  91         goto comet2fin;
  92     }
  93     create_cmdtable(HASH_CMDTYPE);
  94     comet2_init(memsize, clocks);     /* COMET II仮想マシンの初期化 */
  95     execptr->start = 0;
  96     execptr->end = loadassemble(argv[optind++], execptr->start);
  97     /* 残りの引数(オプション以外の引数)があればInfoを表示 */
  98     if(optind < argc) {
  99         warn_ignore_arg(argc - optind, argv + optind);
 100     }
 101     if(execptr->end > 0 && cerr->num == 0) {
 102         exec();                 /* プログラム実行 */
 103     }
 104     comet2_shutdown();          /* COMET II仮想マシンのシャットダウン */
 105     free_cmdtable(HASH_CMDTYPE);
 106 comet2fin:
 107     if(cerr->num > 0) {
 108         stat = 1;
 109     }
 110     freecerr();                 /* エラーの解放 */
 111     return stat;
 112 }

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