Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.  * This is a version of the public domain getopt implementation by
  3.  * Henry Spencer originally posted to net.sources.
  4.  *
  5.  * This file is in the public domain.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. #define getopt fz_getopt
  12. #define optarg fz_optarg
  13. #define optind fz_optind
  14.  
  15. char *optarg; /* Global argument pointer. */
  16. int optind = 0; /* Global argv index. */
  17.  
  18. static char *scan = NULL; /* Private scan pointer. */
  19.  
  20. int
  21. getopt(int argc, char *argv[], char *optstring)
  22. {
  23.         char c;
  24.         char *place;
  25.  
  26.         optarg = NULL;
  27.  
  28.         if (scan == NULL || *scan == '\0') {
  29.                 if (optind == 0)
  30.                         optind++;
  31.  
  32.                 if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
  33.                         return EOF;
  34.                 if (argv[optind][1] == '-' && argv[optind][2] == '\0') {
  35.                         optind++;
  36.                         return EOF;
  37.                 }
  38.  
  39.                 scan = argv[optind]+1;
  40.                 optind++;
  41.         }
  42.  
  43.         c = *scan++;
  44.         place = strchr(optstring, c);
  45.  
  46.         if (place == NULL || c == ':') {
  47.                 fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
  48.                 return '?';
  49.         }
  50.  
  51.         place++;
  52.         if (*place == ':') {
  53.                 if (*scan != '\0') {
  54.                         optarg = scan;
  55.                         scan = NULL;
  56.                 } else if( optind < argc ) {
  57.                         optarg = argv[optind];
  58.                         optind++;
  59.                 } else {
  60.                         fprintf(stderr, "%s: option requires argument -%c\n", argv[0], c);
  61.                         return ':';
  62.                 }
  63.         }
  64.  
  65.         return c;
  66. }
  67.