plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

getopt.c (1055B)


      1 #include	<stdio.h>
      2 #include <string.h>
      3 #include "ext.h"
      4 #define ERR(str, chr)       if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
      5 int     opterr = 1;
      6 int     optind = 1;
      7 int	optopt;
      8 char    *optarg;
      9 
     10 int
     11 getopt (int argc, char **argv, char *opts)
     12 {
     13 	static int sp = 1;
     14 	register int c;
     15 	register char *cp;
     16 
     17 	if (sp == 1)
     18 		if (optind >= argc ||
     19 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
     20 			return EOF;
     21 		else if (strcmp(argv[optind], "--") == 0) {
     22 			optind++;
     23 			return EOF;
     24 		}
     25 	optopt = c = argv[optind][sp];
     26 	if (c == ':' || (cp=strchr(opts, c)) == NULL) {
     27 		ERR (": illegal option -- ", c);
     28 		if (argv[optind][++sp] == '\0') {
     29 			optind++;
     30 			sp = 1;
     31 		}
     32 		return '?';
     33 	}
     34 	if (*++cp == ':') {
     35 		if (argv[optind][sp+1] != '\0')
     36 			optarg = &argv[optind++][sp+1];
     37 		else if (++optind >= argc) {
     38 			ERR (": option requires an argument -- ", c);
     39 			sp = 1;
     40 			return '?';
     41 		} else
     42 			optarg = argv[optind++];
     43 		sp = 1;
     44 	} else {
     45 		if (argv[optind][++sp] == '\0') {
     46 			sp = 1;
     47 			optind++;
     48 		}
     49 		optarg = NULL;
     50 	}
     51 	return c;
     52 }