home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 189_01 / makearg.h < prev    next >
Text File  |  1985-08-21  |  2KB  |  96 lines

  1. /* ..make a global argv[] by parsing command line.. */
  2.  
  3. #include <stdio.h>
  4. #include <dos.h>
  5. #include <ctype.h>
  6.  
  7. #define MAXARGS 30
  8. #define START 1
  9. #define NORMAL 2
  10. #define QUOTE 3
  11.  
  12. int argc;
  13. extern unsigned _pspbase;
  14. char *cl, tail[0x80], **argv, *getarg(), *argbuf[MAXARGS];
  15.  
  16. makeargv()
  17. {
  18.     /* ..initialize argc/argv[].. */
  19.     argc = 0;
  20.     argv = argbuf;
  21.     argv[0] = "";
  22.  
  23.     /* ..get command line from DOS.. */
  24.     _copy(PTR(tail),0x80,_pspbase,0x80);
  25.     cl = tail + 1;
  26.     cl[*tail] = '\0';
  27.  
  28.     /* ..get parsed arguments.. */
  29.     while (argv[++argc] = getarg()) ;
  30. }
  31.  
  32. /* ..parse arguments.. */
  33. char *getarg()
  34. {
  35.     static char arg[0x80], *q;
  36.     int state;
  37.     register i;
  38.  
  39.     for (i = 0, state = START ; *cl ; ++cl)
  40.         switch(state)
  41.         {
  42.             case START:
  43.                 if (*cl == '\\')
  44.                     if (*++cl)
  45.                     {
  46.                         arg[i++] = *cl;
  47.                         state = NORMAL;
  48.                     }
  49.                     else
  50.                         goto done;
  51.                 else if (*cl == '\"')
  52.                     state = QUOTE;
  53.                 else if (!isspace(*cl))
  54.                 {
  55.                     --cl;
  56.                     state = NORMAL;
  57.                 }
  58.                 break;
  59.             case NORMAL:
  60.                 if (isspace(*cl))
  61.                     goto done;
  62.                 if (*cl == '\\' && *++cl == '\0')
  63.                     goto done;
  64.                 arg[i++] = *cl;
  65.                 break;
  66.             case QUOTE:
  67.                 if (*cl == '\"')
  68.                 {
  69.                     ++cl;
  70.                     goto done;
  71.                 }
  72.                 if (*cl == '\\' && *++cl == '\0')
  73.                     goto done;
  74.                 arg[i++] = *cl;
  75.                 break;
  76.         }
  77.  
  78. done:
  79.     /* ..ran out?.. */
  80.     if (i == 0)
  81.         return NULL;
  82.  
  83.     /* ..get some memory and store this arg.. */
  84.     arg[i] = '\0';
  85.     q = (char *) malloc(i);
  86.     strcpy(q,arg);
  87.     return q;
  88. }
  89. me,current_target);
  90.         filecopy(xfiles[i]->name,current_target);
  91.     }
  92. }
  93.  
  94. 
  95. ,n+1);
  96.