1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include "getargs.h"
6 
7 /*---------- usage --------------------------------------------------
8  * display usage message and exit
9  *-------------------------------------------------------------------*/
10 
print_usage(char ** usgmsg,char * errmsg)11 void print_usage (char **usgmsg, char *errmsg)
12 {
13     int n;
14 
15     if (NULL != errmsg)
16         fprintf (stderr, "ERROR: %s\n", errmsg);
17     for (n = 0; NULL != usgmsg[n]; n++)
18         fprintf (stderr, "%s\n", usgmsg[n]);
19     exit (NULL != errmsg);
20 }
21 
22 /*---------- getargs ---------------------------------------------------
23  * get option letter from argument vector or terminates on error
24  * this is similar to getopt()
25  *----------------------------------------------------------------------*/
26 
27 int argind = 0;  /* index into argv array */
28 int argerr = 1;  /* error output flag */
29 char *argarg;    /* pointer to argument string */
30 
getargs(int argc,char ** argv,char * ostr)31 int getargs (int argc, char **argv, char *ostr)
32 {
33     int argopt;
34     char *oli;
35     static char *place;
36     static int nextarg;
37 
38     /* initialization */
39 
40     if (!argind)
41         nextarg = 1;
42 
43     if (nextarg) {  /* update scanning pointer */
44         if (argind >= argc || ++argind == argc) {
45             argarg = NULL;
46             return (-1);
47         }
48         if ('-' != argv[argind][0]) {
49             argarg = argv[argind];
50             return (0);
51         }
52         place = argarg = &argv[argind][1];
53         if (!*place) {
54             if (++argind == argc) {
55                 argarg = NULL;
56                 return (-1);
57             }
58             argarg = argv[argind];
59             return (0);
60         }
61         nextarg = 0;
62     }
63 
64     /* check for valid option */
65 
66     if ((argopt = *place++) == ':' || argopt == ';' ||
67         (oli = strchr (ostr, argopt)) == NULL) {
68         if (argerr) {
69             fprintf (stderr, "invalid option - `%c'\n", argopt);
70             exit (-1);
71         }
72         return (argopt);
73     }
74 
75     /* don't need argument */
76 
77     if (*++oli != ':') {
78         if (*place && *oli == ';') {    /* optional argument */
79             argarg = place;
80             nextarg = 1;
81         }
82         else {
83             argarg = NULL;
84             if (!*place)
85                 nextarg = 1;
86         }
87         return (argopt);
88     }
89 
90     /* get argument */
91 
92     if (!*place) {
93         if (++argind >= argc) {
94             if (!argerr) return (':');
95             fprintf (stderr, "missing argument for option `%c'\n", argopt);
96             exit (1);
97         }
98         place = argv[argind];
99     }
100     argarg = place;
101     nextarg = 1;
102     return (argopt);
103 }
104