general.h

Go to the documentation of this file.
00001 /*  _________________________________________________________________________
00002  *
00003  *  UTILIB: A utility library for developing portable C++ codes.
00004  *  Copyright (c) 2001, Sandia National Laboratories.
00005  *  This software is distributed under the GNU Lesser General Public License.
00006  *  For more information, see the README file in the top UTILIB directory.
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       ACTION INDEX
00156         0 - Process flags
00157         1 - ERR
00158         2 - Used to make CFLAGS
00159         3 - Used to print out errors
00160         4 - Used to print out errors
00161         5 - Used to print out errors
00162         6 - Process required arguments
00163         7 - Exit the processing
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