00001
00002
00003
00004
00005
00006
00007
00008
00009
00020 #ifndef __general_h
00021 #define __general_h
00022
00122 #if defined(__cplusplus) && defined(ANSI_HDRS)
00123 #include <cstring>
00124 #include <cstdlib>
00125 #include <cstdio>
00126 #else
00127 #include <string.h>
00128 #include <stdlib.h>
00129 #include <stdio.h>
00130 #endif
00131
00132 #ifndef FALSE
00133 #define FALSE 0
00134 #endif
00135 #ifndef TRUE
00136 #define TRUE 1
00137 #endif
00138
00146 #ifdef PPRINT_DO_COMMAND
00147 #define DO_COMMAND_TAB "\t"
00148 #define DO_COMMAND_EOLN "\n"
00149 #else
00150 #define DO_COMMAND_TAB " "
00151 #define DO_COMMAND_EOLN ""
00152 #endif
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 #define SIMPLE_FLAG_OPTN(string,var) \
00168 FLAG_OPTN(string, (var) = TRUE)
00169
00170 #define FLAG_OPTN(string,stmt) \
00171 if (__ACTION__ == 0) { \
00172 if (strcmp(_OPTION_, "-" #string) == 0) { \
00173 {stmt;} \
00174 continue; \
00175 } \
00176 } \
00177 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00178 (void) fputs(DO_COMMAND_TAB,stderr); \
00179 (void) fputs("[-" #string "]",stderr); \
00180 (void) fputs(DO_COMMAND_EOLN, stderr); \
00181 }
00182
00183 #define CFLAG_OPTN(char,stmt) \
00184 if (__ACTION__ == 0 && _OPTION_[1] == (#char)[0]) { \
00185 __ACTION__ = 2; \
00186 _OPTION_ += 1; \
00187 } \
00188 if (__ACTION__ == 2 && _OPTION_[0] == (#char)[0]) { \
00189 {stmt;} \
00190 continue; \
00191 } else if (__ACTION__ == 1) { \
00192 (void) fputs(DO_COMMAND_TAB,stderr); \
00193 (void) fputs("[-" #char , stderr); \
00194 __ACTION__ = 3; \
00195 } else if (__ACTION__ == 3) { \
00196 (void) fputs(#char, stderr); \
00197 } else if (__ACTION__ == 5) { \
00198 __ACTION__ = 4; \
00199 }
00200
00201 #define SIMPLE_CFLAG_OPTN(char,var) \
00202 CFLAG_OPTN(char, (var) = 1)
00203
00204 #define DATA_OPTN(string,desc,stmt) \
00205 if (__ACTION__ == 0 \
00206 && strncmp(_OPTION_, "-" #string, sizeof("-" #string) - 1) == 0) { \
00207 if (_OPTION_[sizeof("-" #string)-1] == '\0') { \
00208 __i__ += 1; \
00209 if (__i__ >= argc) __ACTION__ = 1; \
00210 _OPTION_ = argv[__i__]; \
00211 } \
00212 else _OPTION_ += sizeof("-" #string); \
00213 if (__ACTION__ != 1) {stmt;} \
00214 continue; \
00215 } else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00216 (void) fputs(DO_COMMAND_TAB,stderr); \
00217 (void) fputs("[-" #string #desc "]",stderr); \
00218 (void) fputs(DO_COMMAND_EOLN, stderr); \
00219 }
00220
00221 #define DATA_OPTN2(string,desc,stmt1,stmt2) \
00222 if (__ACTION__ == 0 \
00223 && strncmp(_OPTION_, "-" #string, sizeof("-" #string) - 1) == 0) { \
00224 if (_OPTION_[sizeof("-" #string)-1] == '\0') { \
00225 __i__ += 1; \
00226 if (__i__ >= argc) __ACTION__ = 1; \
00227 _OPTION_ = argv[__i__]; \
00228 } \
00229 else _OPTION_ += sizeof("-" #string); \
00230 if (__ACTION__ != 1) { \
00231 stmt1; \
00232 __i__ += 1; \
00233 if (__i__ >= argc) \
00234 __ACTION__ = 1; \
00235 else { \
00236 _OPTION_ = argv[__i__]; \
00237 stmt2; \
00238 } \
00239 } \
00240 continue; \
00241 } else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00242 (void) fputs(DO_COMMAND_TAB,stderr); \
00243 (void) fputs("[-" #string #desc "]",stderr); \
00244 (void) fputs(DO_COMMAND_EOLN, stderr); \
00245 }
00246
00247 #define NON_SWITCH(desc,stmt) \
00248 if (__ACTION__ == 6) { \
00249 while (__i__ < argc) { \
00250 _OPTION_ = argv[__i__]; \
00251 stmt; \
00252 __i__++; \
00253 } \
00254 } \
00255 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00256 (void) fputs(DO_COMMAND_TAB,stderr); \
00257 (void) fputs("[" #desc "...]",stderr); \
00258 (void) fputs(DO_COMMAND_EOLN, stderr); \
00259 }
00260
00261 #define FREE_ARGS_CONT() \
00262 if (__ACTION__ == 6) { \
00263 int i; \
00264 char* tmp = argv[0];\
00265 for (i=1; i<__i__; i++) \
00266 argv++; \
00267 argv[0] = tmp;\
00268 argc -= __i__-1; \
00269 __ACTION__ = 7; \
00270 } \
00271 else if (__ACTION__ == 1 || __ACTION__ == 4) \
00272 (void) fputs(DO_COMMAND_EOLN, stderr);
00273
00274 #define FREE_ARGS() \
00275 if (__ACTION__ == 6) { \
00276 int i; \
00277 for (i=1; i<__i__; i++) \
00278 argv++; \
00279 argc -= __i__-1; \
00280 __ACTION__ = 7; \
00281 } \
00282 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00283 (void) fputs(DO_COMMAND_TAB,stderr); \
00284 (void) fputs("[argv1 argv2 ...]",stderr); \
00285 (void) fputs(DO_COMMAND_EOLN, stderr); \
00286 }
00287
00288 #define REQ_ARG(desc,stmt) \
00289 if (__ACTION__ == 6) { \
00290 if (__i__ >= argc) { \
00291 __ACTION__ = 1; \
00292 continue; \
00293 } \
00294 stmt; \
00295 __i__ += 1; \
00296 if (__i__ < argc) \
00297 _OPTION_ = argv[__i__]; \
00298 } \
00299 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00300 (void) fputs(DO_COMMAND_TAB, stderr); \
00301 (void) fputs("<" #desc ">",stderr); \
00302 (void) fputs(DO_COMMAND_EOLN, stderr); \
00303 }
00304
00305 #define OPT_ARG(desc,stmt) \
00306 if ((__ACTION__ == 6) && (__i__ < argc)) { \
00307 stmt; \
00308 __i__ += 1; \
00309 if (__i__ < argc) \
00310 _OPTION_ = argv[__i__]; \
00311 } \
00312 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00313 (void) fputs(DO_COMMAND_TAB,stderr); \
00314 (void) fputs("[<" #desc ">]",stderr); \
00315 (void) fputs(DO_COMMAND_EOLN, stderr); \
00316 }
00317
00318 #define ANY_OPTION(desc,stmt) \
00319 if (__ACTION__ == 0) { \
00320 stmt; \
00321 continue; \
00322 } \
00323 else if (__ACTION__ == 1 || __ACTION__ == 4) { \
00324 (void) fputs(DO_COMMAND_TAB,stderr); \
00325 (void) fputs("" #desc "",stderr); \
00326 (void) fputs(DO_COMMAND_EOLN, stderr); \
00327 }
00328
00329 #define COMMAND_LINE_ERROR { __ACTION__ = 1; continue;}
00330
00331 #define DO_STANDARD_COMMAND_LINE(stmts) \
00332 { \
00333 int __i__; \
00334 int __ACTION__; \
00335 char *_OPTION_ = NULL; \
00336 __i__ = 0; \
00337 __ACTION__ = 0; \
00338 while (1) { \
00339 if (__ACTION__ == 2) { \
00340 _OPTION_ += 1; \
00341 if (_OPTION_[0] == '\0') __ACTION__ = 0; \
00342 } \
00343 if ((__ACTION__ == 0) || (__ACTION__ == 6)) { \
00344 __i__ += 1; \
00345 if (__i__ >= argc) \
00346 __ACTION__ = 6; \
00347 else \
00348 _OPTION_ = argv[__i__]; \
00349 } \
00350 if (__ACTION__ == 0 && _OPTION_[0] != '-') \
00351 __ACTION__ = 6; \
00352 if (__ACTION__ == 1) (void) fprintf(stderr, "Usage: %s%s", argv[0],DO_COMMAND_EOLN); \
00353 stmts; \
00354 if (__ACTION__ == 6) {\
00355 if (__i__ < argc) { \
00356 __ACTION__ = 1; \
00357 continue; \
00358 } \
00359 else \
00360 break; \
00361 } \
00362 if (__ACTION__ == 7) \
00363 break; \
00364 if (__ACTION__ == 1 || __ACTION__ == 4) { \
00365 fprintf(stderr,"\n"); \
00366 exit(__ACTION__); \
00367 } \
00368 if (__ACTION__ == 3) { \
00369 (void) fputs("]",stderr); \
00370 (void) fputs(DO_COMMAND_EOLN, stderr); \
00371 __ACTION__ = 5; \
00372 } else { \
00373 __ACTION__ = 1; \
00374 } \
00375 } \
00376 }
00377
00378 #endif