home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / comp_lan / 85_febr / argpar.1 < prev    next >
Text File  |  1988-07-25  |  3KB  |  102 lines

  1.  
  2.                             Listing 1
  3.                                to
  4.                 Macros Special Series on C Macros
  5.                           February 1985
  6.  
  7.  
  8.      >> Simplified argument parsing, positional and flag <<
  9.  
  10.  
  11.  
  12. #define ArgBEGIN(A_argc, A_argv) \
  13.    { /* Begin block with local variables. Ends with ArgEND. */ \
  14.      struct \
  15.      { int     argc, *ptrArgCount; \
  16.        char ** argVector; \
  17.        char *  (*ptrFunction) (); \
  18.        char    keyTrigger, *keyPointer; \
  19.        int     argIndex, charIndex, nextPositional, keysTerminated; \
  20.      } a0; \
  21.      a0.ptrArgCount = &(A_argc); a0.argVector = (A_argv); \
  22.      a0.argc = *a0.ptrArgCount; a0.keyTrigger = '-'; \
  23.      a0.ptrFunction = argPos;
  24.  
  25. #define ArgPosCall(A_Function) a0.ptrFunction = (A_Function);
  26. #define ArgTrigger(A_Trigger)  a0.keyTrigger = (A_Trigger);
  27.  
  28. #define ArgLOOP \
  29.      a0.keysTerminated = 0; a0.nextPositional = 1; \
  30.      for ( (a0.argIndex = 1); (a0.argIndex < a0.argc); (++a0.argIndex) ) \
  31.      { /* for all arguments */ \
  32.        if ( ( a0.argVector[a0.argIndex][0] != a0.keyTrigger ) \
  33.        ||   ( a0.keysTerminated != 0                        ) \
  34.        ||   ( a0.argVector[a0.argIndex][1] == '\0'          ) ) \
  35.        { /* not a key: bubble up positional arguments */ \
  36.          a0.argVector[a0.nextPositional] = a0.argVector[a0.argIndex]; \
  37.          (void) (*a0.ptrFunction) ( '\0', a0.argVector[a0.nextPositional] ); \
  38.          ++a0.nextPositional; \
  39.        } \
  40.        else /* it is a key */ \
  41.        { \
  42.          for \
  43.          ( (a0.charIndex = 1, a0.keyPointer = & a0.argVector[a0.argIndex][1]) \
  44.          ; (  (   a0.keyPointer  != (char *) 0 ) \
  45.            && ( (*a0.keyPointer) != '\0' ) \
  46.            ) \
  47.          ; (++a0.charIndex, ++a0.keyPointer) \
  48.          ) \
  49.          { /* for all characters in an argument */ \
  50.            switch ( a0.keyPointer[0] ) \
  51.            {
  52.  
  53. #define ArgFlagSet(A_KeyLetter, A_FlagCounter) \
  54.            case A_KeyLetter: ++A_FlagCounter; break;
  55.  
  56. #define ArgFlagCall(A_KeyLetter, A_Function) \
  57.            case A_KeyLetter: (A_Function)( *a0.keyPointer, 0 ); break;
  58.  
  59. #define ArgEND \
  60.            default: \
  61.              (void) fprintf \è             ( stderr \
  62.              , " Stop. Key letter \'%c\' rejected.\n" \
  63.              , *a0.keyPointer \
  64.              ); \
  65.              exit (1); \
  66.            } /* switch */ \
  67.          } /* for all characters in argument */ \
  68.        } /* if key or not a key */ \
  69.      } /* for all arguments */ \
  70.      (* a0.ptrArgCount) = a0.nextPositional - 1; \
  71.    } /* End block begun with ArgBEGIN. */ \
  72.  
  73. static char * argPos( a_keyChar, a_argString )
  74. char   a_keyChar, *a_argString;
  75. { return ( (char *) 0 ); }
  76.  
  77. /* --------------------------------------------------------------- */
  78.  
  79. #if defined DriverH
  80.  
  81. #include <stdio.h>
  82.  
  83. void main(argCount, argVector)
  84. int    argCount;
  85. char * argVector[];
  86. {
  87.   int    f_flag = 0;
  88.  
  89.   ArgBEGIN    (argCount, argVector)
  90.   ArgPosCall  (argPos)
  91.   ArgTrigger  ('-')
  92.   ArgLOOP
  93.   ArgFlagSet  ('f', f_flag)
  94.   ArgFlagCall ('F', argPos)
  95.   ArgEND
  96.  
  97.   exit (0);
  98. } /* main */
  99.  
  100. #endif DriverH
  101.  
  102.