home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / c_spec / sources / reargv.c < prev    next >
C/C++ Source or Header  |  1986-02-20  |  2KB  |  120 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define    MAXARGC        (unsigned)128
  5. #define isquote(c)    ((c)=='"' || (c)=='\'')
  6.  
  7. extern    char    *getenv( char*       );
  8. extern  char    *malloc( unsigned );
  9.  
  10. /*----------------------------------------------------------------------*/
  11.  
  12. static char    *nextarg( pp )
  13. char        **pp;
  14. {
  15.     register char    *p;
  16.     char        *start;
  17.     register int    term;
  18.  
  19.     if( !*(p = *pp)  )        /* No more args to get , return 0 */
  20.         return (char *) 0;
  21.  
  22.     while( isspace(*p) )        /* Skip white space          */
  23.         p++;
  24.  
  25.     if( isquote(*p) )         /* Can't use a conditional because */
  26.         term = *p++;        /* of order of evaluation problems */
  27.     else
  28.         term = ' ';
  29.  
  30.     for( start = p; *p ; p++)
  31.     {
  32.         if( *p == term &&  *(p-1) != '\\' )
  33.         {
  34.             *p++ = '\0';
  35.             break;
  36.         }
  37.     }
  38.  
  39.     *pp = p;
  40.  
  41.     return start;
  42. }
  43.  
  44. /*----------------------------------------------------------------------*/
  45.  
  46. int    reargv( argcp, argvp )
  47. char    ***argvp;
  48. int    *argcp;
  49. {
  50.     register int    argc = 0 ;
  51.     register int    maxc = MAXARGC ;
  52.     char        **argv, **start_argv ;
  53.     char        *env, *p ;
  54.  
  55.     if( !(env = getenv("CMDLINE")) ||  !*env )
  56.         return 0;
  57.  
  58.     if( !(p = malloc( strlen(env)+1 )))
  59.         return 0;
  60.  
  61.     if( !(argv = (char **) malloc( MAXARGC * sizeof(char *)) ))
  62.         return 0;
  63.  
  64.     strcpy(p, env);
  65.     start_argv = argv;
  66.     for( maxc=MAXARGC; --maxc >= 0 && (*argv++ = nextarg(&p)); argc++)
  67.         ;
  68.  
  69.     if( maxc < 0 )
  70.         fprintf(stderr, "Command line truncated\n");
  71.  
  72.     *argcp = argc;
  73.     *argvp = start_argv;
  74.     return 1;
  75. }
  76.  
  77. /*----------------------------------------------------------------------*/
  78.  
  79. switchar()
  80. {
  81.     /* Returns the first character in the SWITCHAR environment
  82.      * if one is defined, else returns '-'.
  83.      */
  84.  
  85.     register char *env;
  86.  
  87.     if( !(env = getenv("SWITCHAR"))  ||  !*env )
  88.         return '-';
  89.     else
  90.         return *env ;
  91.  
  92. }
  93.  
  94. /*----------------------------------------------------------------------*/
  95.  
  96. #ifdef DEBUG
  97.  
  98. main( argc, argv )
  99. char    **argv;
  100. {
  101.     printf("Original command line is: |");
  102.     while( --argc >= 0 )
  103.         printf("%s|", *argv++ );
  104.  
  105.     if( !reargv( &argc, &argv ) )
  106.         printf("\nCMDLINE not present\n");
  107.     else
  108.     {
  109.         printf("New argc = %d\n", argc );
  110.         printf("\nModified command line is: |");
  111.  
  112.         while( --argc >= 0 )
  113.             printf("%s|", *argv++ );
  114.  
  115.         printf("\n");
  116.     }
  117. }
  118.  
  119. #endif
  120.