Mercurial > hg > CbC > old > examples
comparison arg.c @ 6:477c1dec2a2b draft
fixarg.c
author | one |
---|---|
date | Wed, 07 Jun 2017 14:43:34 +0900 |
parents | e59ebf6fe2b0 |
children |
comparison
equal
deleted
inserted
replaced
5:709cdf828033 | 6:477c1dec2a2b |
---|---|
2 // long option, 例えば--helpなどは使えるように | 2 // long option, 例えば--helpなどは使えるように |
3 // long optionは--から始まるものを有効 | 3 // long optionは--から始まるものを有効 |
4 // strcmpは使わない | 4 // strcmpは使わない |
5 // c fileはincludeしない | 5 // c fileはincludeしない |
6 | 6 |
7 extern int printf(char*,...); | 7 extern int printf(const char*,...); |
8 | 8 |
9 char* outfile; | 9 char* outfile; |
10 char* infile; | 10 char* infile; |
11 int help; | 11 int help; |
12 | 12 |
24 #else | 24 #else |
25 #define BREAKP(ret,env) | 25 #define BREAKP(ret,env) |
26 #endif | 26 #endif |
27 | 27 |
28 // evaluates matching table | 28 // evaluates matching table |
29 code | 29 __code |
30 opt5(int j, int i, int argc, char** argv, (*exit0)(int), void* env) | 30 opt5(int j, int i, int argc, char** argv, __code (*exit0)(int,void *), void* env) |
31 { | 31 { |
32 if(j<LONG_OPTION_NUM){ | 32 if(j<LONG_OPTION_NUM){ |
33 printf("match(%d): %d\n", j, match[j]); | 33 printf("match(%d): %d\n", j, match[j]); |
34 if(match[j]==score[j]){ | 34 if(match[j]==score[j]){ |
35 printf("detected opt: "); | 35 printf("detected opt: "); |
36 if(j==0){ // help | 36 if(j==0){ // help |
37 help=1; | 37 help=1; |
38 printf("help\n"); | 38 printf("help\n"); |
39 goto exit0(0), env; | 39 goto exit0(0, env); |
40 }else if(j==1){ // file | 40 }else if(j==1){ // file |
41 printf("file\n"); | 41 printf("file\n"); |
42 printf("file: %s %s\n", outfile, argv[i]); | 42 printf("file: %s %s\n", outfile, argv[i]); |
43 if(outfile){ | 43 if(outfile){ |
44 goto exit0(1), env; | 44 goto exit0(1, env); |
45 }else{ | 45 }else{ |
46 outfile=argv[i]; | 46 outfile=argv[i]; |
47 i++; | 47 i++; |
48 goto opt0(i, argc, argv, exit0, env); | 48 goto opt0(i, argc, argv, exit0, env); |
49 } | 49 } |
50 }else{ | 50 }else{ |
51 printf("unknown\n"); | 51 printf("unknown\n"); |
52 goto exit0(1), env; | 52 goto exit0(1, env); |
53 } | 53 } |
54 } | 54 } |
55 j++; | 55 j++; |
56 goto opt5(j, i, argc, argv, exit0, env); | 56 goto opt5(j, i, argc, argv, exit0, env); |
57 }else{ | 57 }else{ |
58 goto exit0(1), env; | 58 goto exit0(1, env); |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 // matching test | 62 // matching test |
63 code | 63 __code |
64 opt4(int k, int j, char* p, int i, int argc, char** argv, (*exit0)(int), void* env) | 64 opt4(int k, int j, char* p, int i, int argc, char** argv, __code (*exit0)(int,void*), void* env) |
65 { | 65 { |
66 char* o; | 66 char* o; |
67 if(*p!='\0'){ | 67 if(*p!='\0'){ |
68 o=optstr[j]; | 68 o=optstr[j]; |
69 if(j<LONG_OPTION_NUM){ | 69 if(j<LONG_OPTION_NUM){ |
80 } | 80 } |
81 goto opt5(0, i, argc, argv, exit0, env); | 81 goto opt5(0, i, argc, argv, exit0, env); |
82 } | 82 } |
83 | 83 |
84 // initialize matching table | 84 // initialize matching table |
85 code | 85 __code |
86 opt3(int j, char* p, int i, int argc, char** argv, (*exit0)(int), void* env) | 86 opt3(int j, char* p, int i, int argc, char** argv, __code (*exit0)(int,void*), void* env) |
87 { | 87 { |
88 if(j<LONG_OPTION_NUM){ | 88 if(j<LONG_OPTION_NUM){ |
89 match[j]=0; | 89 match[j]=0; |
90 j++; | 90 j++; |
91 goto opt3(j, p, i, argc, argv, exit0, env); | 91 goto opt3(j, p, i, argc, argv, exit0, env); |
93 goto opt4(0, 0, p, i, argc, argv, exit0, env); | 93 goto opt4(0, 0, p, i, argc, argv, exit0, env); |
94 } | 94 } |
95 } | 95 } |
96 | 96 |
97 // evaluates one hyphen options such like -f or -h. | 97 // evaluates one hyphen options such like -f or -h. |
98 code | 98 __code |
99 opt2(char* p, int i, int argc, char** argv, (*exit0)(int), void* env) | 99 opt2(char* p, int i, int argc, char** argv, __code (*exit0)(int,void*), void* env) |
100 { | 100 { |
101 if(*p=='-'){ | 101 if(*p=='-'){ |
102 p++; | 102 p++; |
103 goto opt3(0, p, i, argc, argv, exit0, env); | 103 goto opt3(0, p, i, argc, argv, exit0, env); |
104 } else if(*(p+1)=='\0'){ | 104 } else if(*(p+1)=='\0'){ |
105 if(*p=='h'){ | 105 if(*p=='h'){ |
106 help=1; | 106 help=1; |
107 goto exit0(0), env; | 107 goto exit0(0, env); |
108 }else if(*p=='f'){ | 108 }else if(*p=='f'){ |
109 if(argv[i]){ | 109 if(argv[i]){ |
110 if(outfile){ | 110 if(outfile){ |
111 goto exit0(1), env; | 111 goto exit0(1, env); |
112 }else{ | 112 }else{ |
113 outfile=argv[i]; | 113 outfile=argv[i]; |
114 i++; | 114 i++; |
115 goto opt0(i, argc, argv, exit0, env); | 115 goto opt0(i, argc, argv, exit0, env); |
116 } | 116 } |
117 }else{ | 117 }else{ |
118 goto exit0(1), env; | 118 goto exit0(1, env); |
119 } | 119 } |
120 } | 120 } |
121 } | 121 } |
122 goto exit0(1), env; | 122 goto exit0(1, env); |
123 } | 123 } |
124 | 124 |
125 // sets 'infile' | 125 // sets 'infile' |
126 code | 126 __code |
127 opt1(char* p, int i, int argc, char** argv, (*exit0)(int), void* env) | 127 opt1(char* p, int i, int argc, char** argv, __code exit0(int,void*), void* env) |
128 { | 128 { |
129 if(infile){ | 129 if(infile){ |
130 printf("infile exists: infile=%s %s\n", infile, p); | 130 printf("infile exists: infile=%s %s\n", infile, p); |
131 goto exit0(1), env; | 131 goto exit0(1, env); |
132 }else{ | 132 }else{ |
133 infile=p; | 133 infile=p; |
134 goto opt0(i, argc, argv, exit0, env); | 134 goto opt0(i, argc, argv, exit0, env); |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 code | 138 __code |
139 opt0(int i, int argc, char** argv, (*exit0)(int), void* env) | 139 opt0(int i, int argc, char** argv, __code (*exit0)(int,void*), void* env) |
140 { | 140 { |
141 char* p; | 141 char* p; |
142 BREAKP(exit0,env); | 142 BREAKP(exit0,env); |
143 if(i<argc){ | 143 if(i<argc){ |
144 p=argv[i]; | 144 p=argv[i]; |
149 }else{ | 149 }else{ |
150 goto opt1(p, i, argc, argv, exit0, env); | 150 goto opt1(p, i, argc, argv, exit0, env); |
151 } | 151 } |
152 goto opt0(i, argc, argv, exit0, env); | 152 goto opt0(i, argc, argv, exit0, env); |
153 }else{ | 153 }else{ |
154 goto exit0(0), env; | 154 goto exit0(0, env); |
155 } | 155 } |
156 } | 156 } |
157 | 157 |
158 int | 158 int |
159 option(int argc, char** argv) | 159 option(int argc, char** argv) |
160 { | 160 { |
161 BREAKP(return, environment); | 161 BREAKP(__return, environment); |
162 goto opt0(1, argc, argv, return, environment); | 162 goto opt0(1, argc, argv, __return, __environment); |
163 return 0; | 163 return 0; |
164 } | 164 } |
165 | 165 |
166 // prints usage | 166 // prints usage |
167 void | 167 void |