home *** CD-ROM | disk | FTP | other *** search
/ DEFCON 15 / DefCon15.bin / Speakers / Jennings / Extras / incognito / XGetopt.c < prev    next >
C/C++ Source or Header  |  2007-03-11  |  1KB  |  71 lines

  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. char    *optarg;        // global argument pointer
  5. int        optind = 0;     // global argv index
  6. char c;
  7. char *cp;
  8.  
  9. int getopt(int argc, char *argv[], char *optstring)
  10. {
  11.     static char *next = NULL;
  12.     if (optind == 0)
  13.         next = NULL;
  14.  
  15.     optarg = NULL;
  16.  
  17.     if (next == NULL || *next == '\0')
  18.     {
  19.         if (optind == 0)
  20.             optind++;
  21.  
  22.         if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
  23.         {
  24.             optarg = NULL;
  25.             if (optind < argc)
  26.                 optarg = argv[optind];
  27.             return EOF;
  28.         }
  29.  
  30.         if (strcmp(argv[optind], "--") == 0)
  31.         {
  32.             optind++;
  33.             optarg = NULL;
  34.             if (optind < argc)
  35.                 optarg = argv[optind];
  36.             return EOF;
  37.         }
  38.  
  39.         next = argv[optind];
  40.         next++;        // skip past -
  41.         optind++;
  42.     }
  43.  
  44.     c = *next++;
  45.     cp = strchr(optstring, c);
  46.  
  47.     if (cp == NULL || c == ':')
  48.         return '?';
  49.  
  50.     cp++;
  51.     if (*cp == ':')
  52.     {
  53.         if (*next != '\0')
  54.         {
  55.             optarg = next;
  56.             next = NULL;
  57.         }
  58.         else if (optind < argc)
  59.         {
  60.             optarg = argv[optind];
  61.             optind++;
  62.         }
  63.         else
  64.         {
  65.             return ':';
  66.         }
  67.     }
  68.  
  69.     return c;
  70. }
  71.