ad3564e5b513009f16cc65dc194983f2514d49f4
[YACASL2.git] / src / dumpword.c
1 #define _GNU_SOURCE
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <getopt.h>
5 #include "word.h"
6 #include "cerr.h"
7 #include "package.h"
8
9 /**
10  * @brief dumpwordコマンドのオプション
11  */
12 static struct option longopts[] = {
13     { "arithmetic", no_argument, NULL, 'a' },
14     { "logical", no_argument, NULL, 'l' },
15     { "version", no_argument, NULL, 'v' },
16     { "help", no_argument, NULL, 'h' },
17     { 0, 0, 0, 0 },
18 };
19
20 /**
21  * @brief dumpwordコマンドのメイン
22  *
23  * @return 正常終了時は0、エラー発生時は1
24  *
25  * @param argc コマンドライン引数の数
26  * @param *argv[] コマンドライン引数の配列
27  */
28 int main(int argc, char *argv[])
29 {
30     bool logicalmode = false;    /* レジストリの内容を論理値(0から65535)で表示する場合はtrue */
31     int opt;
32     WORD word;
33     const char *version = PACKAGE_VERSION,  *cmdversion = "dumpword of YACASL2 version %s\n";
34     const char *usage = "Usage: %s [-alh] WORD\n";
35
36     cerr_init();
37     addcerrlist_word();
38     while((opt = getopt_long(argc, argv, "alvh", longopts, NULL)) != -1) {
39         switch(opt) {
40         case 'l':
41             logicalmode = true;
42             break;
43         case 'v':
44             fprintf(stdout, cmdversion, version);
45             return 0;
46         case 'h':
47             fprintf(stdout, usage, argv[0]);
48             return 0;
49         case '?':
50             fprintf(stderr, usage, argv[0]);
51             exit(1);
52         }
53     }
54
55     if(argv[optind] == NULL) {
56         fprintf(stderr, usage, argv[0]);
57         exit(1);
58     }
59     /* WORD値に変換 */
60     word = nh2word(argv[optind]);
61     if(cerr->num > 0) {
62         fprintf(stderr, "Dumpword Error - %d: %s\n", cerr->num, cerr->msg);
63         exit(1);
64     }
65     fprintf(stdout, "%6s: ", argv[optind]);
66     print_dumpword(word, logicalmode);
67     fprintf(stdout, "\n");
68     return 0;
69 }