1219b2ee8SDavid du Colombier #ifndef _POSIX_SOURCE
2219b2ee8SDavid du Colombier #include <u.h>
3219b2ee8SDavid du Colombier #include <libc.h>
4*14f51593SDavid du Colombier #else
5*14f51593SDavid du Colombier #define _BSD_EXTENSION
6*14f51593SDavid du Colombier #include <stdlib.h>
7*14f51593SDavid du Colombier #include <unistd.h>
8*14f51593SDavid du Colombier #include <string.h>
9219b2ee8SDavid du Colombier #endif
10*14f51593SDavid du Colombier
11219b2ee8SDavid du Colombier #include <stdio.h>
12*14f51593SDavid du Colombier
13219b2ee8SDavid du Colombier #define ERR(str, chr) if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
14*14f51593SDavid du Colombier
15219b2ee8SDavid du Colombier int opterr = 1;
16219b2ee8SDavid du Colombier int optind = 1;
17219b2ee8SDavid du Colombier int optopt;
18219b2ee8SDavid du Colombier char *optarg;
19219b2ee8SDavid du Colombier
20219b2ee8SDavid du Colombier int
getopt(argc,argv,opts)21219b2ee8SDavid du Colombier getopt (argc, argv, opts)
22219b2ee8SDavid du Colombier char **argv, *opts;
23219b2ee8SDavid du Colombier {
24219b2ee8SDavid du Colombier static int sp = 1;
25219b2ee8SDavid du Colombier register c;
26219b2ee8SDavid du Colombier register char *cp;
27219b2ee8SDavid du Colombier
28219b2ee8SDavid du Colombier if (sp == 1)
29219b2ee8SDavid du Colombier if (optind >= argc ||
30219b2ee8SDavid du Colombier argv[optind][0] != '-' || argv[optind][1] == '\0')
31219b2ee8SDavid du Colombier return EOF;
327ad596ffSDavid du Colombier else if (strcmp(argv[optind], "--") == 0) {
33219b2ee8SDavid du Colombier optind++;
34219b2ee8SDavid du Colombier return EOF;
35219b2ee8SDavid du Colombier }
36219b2ee8SDavid du Colombier optopt = c = argv[optind][sp];
37219b2ee8SDavid du Colombier if (c == ':' || (cp=strchr(opts, c)) == NULL) {
38219b2ee8SDavid du Colombier ERR (": illegal option -- ", c);
39219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') {
40219b2ee8SDavid du Colombier optind++;
41219b2ee8SDavid du Colombier sp = 1;
42219b2ee8SDavid du Colombier }
43219b2ee8SDavid du Colombier return '?';
44219b2ee8SDavid du Colombier }
45219b2ee8SDavid du Colombier if (*++cp == ':') {
46219b2ee8SDavid du Colombier if (argv[optind][sp+1] != '\0')
47219b2ee8SDavid du Colombier optarg = &argv[optind++][sp+1];
48219b2ee8SDavid du Colombier else if (++optind >= argc) {
49219b2ee8SDavid du Colombier ERR (": option requires an argument -- ", c);
50219b2ee8SDavid du Colombier sp = 1;
51219b2ee8SDavid du Colombier return '?';
52219b2ee8SDavid du Colombier } else
53219b2ee8SDavid du Colombier optarg = argv[optind++];
54219b2ee8SDavid du Colombier sp = 1;
55219b2ee8SDavid du Colombier } else {
56219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') {
57219b2ee8SDavid du Colombier sp = 1;
58219b2ee8SDavid du Colombier optind++;
59219b2ee8SDavid du Colombier }
60219b2ee8SDavid du Colombier optarg = NULL;
61219b2ee8SDavid du Colombier }
62219b2ee8SDavid du Colombier return c;
63219b2ee8SDavid du Colombier }
64