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