OSDN Git Service

Added env script.
[kozos-expbrd/kozos_expbrd.git] / misc / hwtest / tools / kz_h8write / optparse.c
1 /**
2  * @file optparse.c
3  * @author Shinichiro Nakamura
4  * @brief オプション解析モジュールの実装。
5  */
6
7 /*
8  * ===============================================================
9  *  Option parse library
10  *  Version 0.0.1
11  * ===============================================================
12  * Copyright (c) 2012 Shinichiro Nakamura
13  *
14  * Permission is hereby granted, free of charge, to any person
15  * obtaining a copy of this software and associated documentation
16  * files (the "Software"), to deal in the Software without
17  * restriction, including without limitation the rights to use,
18  * copy, modify, merge, publish, distribute, sublicense, and/or
19  * sell copies of the Software, and to permit persons to whom the
20  * Software is furnished to do so, subject to the following
21  * conditions:
22  *
23  * The above copyright notice and this permission notice shall be
24  * included in all copies or substantial portions of the Software.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
28  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
30  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
31  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33  * OTHER DEALINGS IN THE SOFTWARE.
34  * ===============================================================
35  */
36
37 #include <string.h>
38 #include "optparse.h"
39
40 int optparse_char(
41         int argc,
42         char **argv,
43         void *extobj,
44         int (*callback)(
45             const char option, const char *argument, void *extobj))
46 {
47     for (int i = 1; i < argc;) {
48         int r = 0;
49         int c = 0;
50         if (argv[i][0] == '-') {
51             /*
52              * 与えられた文字列は引数である。
53              */
54             if (strlen(argv[i]) > 2) {
55                 /*
56                  * 同じ箇所にアーギュメントが指定されている。
57                  */
58                 r = callback(argv[i][1], &argv[i][2], extobj);
59                 c = 1;
60             } else {
61                 if ((i + 1) < argc) {
62                     /*
63                      * まだ続きがありそうだ。
64                      * 先を見ておこう。
65                      */
66                     if (argv[i + 1][0] == '-') {
67                         /*
68                          * その引数にアーギュメントはない。
69                          */
70                         r = callback(argv[i][1], "", extobj);
71                         c = 1;
72                     } else {
73                         /*
74                          * その引数にアーギュメントがある。
75                          */
76                         r = callback(argv[i][1], argv[i + 1], extobj);
77                         c = 2;
78                     }
79                 } else {
80                     /*
81                      * もう先がない。
82                      * ということはアーギュメントはない。
83                      */
84                     r = callback(argv[i][1], "", extobj);
85                     c = 1;
86                 }
87             }
88         } else {
89             /*
90              * 与えられた文字列はオプションでない
91              * 単独アーギュメントである。
92              */
93             r = callback('\x00', &argv[i][0], extobj);
94             c = 1;
95         }
96         i += c;
97         if (r != 0) {
98             break;
99         }
100     }
101     return 0;
102 }
103
104 int optparse_text(
105         int argc,
106         char **argv,
107         void *extobj,
108         int (*callback)(
109             const char *option, const char *argument, void *extobj))
110 {
111     for (int i = 1; i < argc;) {
112         int r = 0;
113         int c = 0;
114         if (argv[i][0] == '-') {
115             /*
116              * 与えられた文字列は引数である。
117              */
118             if ((i + 1) < argc) {
119                 /*
120                  * まだ続きがありそうだ。
121                  * 先を見ておこう。
122                  */
123                 if (argv[i + 1][0] == '-') {
124                     /*
125                      * その引数にアーギュメントはない。
126                      */
127                     r = callback(&argv[i][1], "", extobj);
128                     c = 1;
129                 } else {
130                     /*
131                      * その引数にアーギュメントがある。
132                      */
133                     r = callback(&argv[i][1], argv[i + 1], extobj);
134                     c = 2;
135                 }
136             } else {
137                 /*
138                  * もう先がない。
139                  * ということはアーギュメントはない。
140                  */
141                 r = callback(&argv[i][1], "", extobj);
142                 c = 1;
143             }
144         } else {
145             /*
146              * 与えられた文字列はオプションでない
147              * 単独アーギュメントである。
148              */
149             r = callback("", &argv[i][0], extobj);
150             c = 1;
151         }
152         i += c;
153         if (r != 0) {
154             break;
155         }
156     }
157     return 0;
158 }
159