home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-base.tgz / ncftp-2.3.0-base.tar / contrib / ncftp / Getopt.c < prev    next >
C/C++ Source or Header  |  1995-03-07  |  2KB  |  75 lines

  1. /* Getopt.c */
  2.  
  3. #include "Sys.h"
  4. #include "Util.h"
  5. #include "Getopt.h"
  6.  
  7. int gOptErr = 1;                    /* if error message should be printed */
  8. int gOptInd = 1;                    /* index into parent argv vector */
  9. int gOptOpt;                        /* character checked for validity */
  10. char *gOptArg;                        /* argument associated with option */
  11. char *gOptPlace = kGetoptErrMsg;    /* saved position in an arg */
  12.  
  13. /* This must be called before each Getopt. */
  14. void GetoptReset(void)
  15. {
  16.     gOptInd = 1;
  17.     gOptPlace = kGetoptErrMsg;
  18. }    /* GetoptReset */
  19.  
  20.  
  21.  
  22.  
  23. static
  24. char *NextOption(char *ostr)
  25. {
  26.     if ((gOptOpt = (int) *gOptPlace++) == (int) ':')
  27.         return 0;
  28.     return strchr(ostr, gOptOpt);
  29. }    /* NextOption */
  30.  
  31.  
  32.  
  33.  
  34. int Getopt(int nargc, char **nargv, char *ostr)
  35. {
  36.     register char *oli;                   /* Option letter list index */
  37.  
  38.     if (!*gOptPlace) {                       /* update scanning pointer */
  39.         if (gOptInd >= nargc || *(gOptPlace = nargv[gOptInd]) != '-')
  40.             return (EOF);
  41.         if (gOptPlace[1] && *++gOptPlace == '-') {    /* found "--" */
  42.             ++gOptInd;
  43.             return (EOF);
  44.         }
  45.     }                                   /* Option letter okay? */
  46.     oli = NextOption(ostr);
  47.     if (oli == NULL) {
  48.         if (!*gOptPlace)
  49.             ++gOptInd;
  50.         if (gOptErr)
  51.             PrintF("%s%s%c\n", *nargv, ": illegal option -- ", gOptOpt);
  52.         return(kGetoptBadChar);
  53.     }
  54.     if (*++oli != ':') {               /* don't need argument */
  55.         gOptArg = NULL;
  56.         if (!*gOptPlace)
  57.             ++gOptInd;
  58.     } else {                           /* need an argument */
  59.         if (*gOptPlace)                       /* no white space */
  60.             gOptArg = gOptPlace;
  61.         else if (nargc <= ++gOptInd) {  /* no arg */
  62.             gOptPlace = kGetoptErrMsg;
  63.             if (gOptErr) 
  64.                 PrintF("%s%s%c\n", *nargv, ": option requires an argument -- ", gOptOpt);
  65.             return(kGetoptBadChar);
  66.         } else                           /* white space */
  67.             gOptArg = nargv[gOptInd];
  68.         gOptPlace = kGetoptErrMsg;
  69.         ++gOptInd;
  70.     }
  71.     return (gOptOpt);                   /* dump back Option letter */
  72. }                                       /* Getopt */
  73.  
  74. /* eof */
  75.