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