source: golgotha/src/i4/loaders/mp3/getlopt.cc @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 11 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 3.3 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9/*
10 *   getlopt.c
11 *
12 *   Oliver Fromme  <oliver.fromme@heim3.tu-clausthal.de>
13 *   Tue Apr  8 07:15:13 MET DST 1997
14 */
15
16#include "loaders/mp3/getlopt.hh"
17
18int loptind = 1;        /* index in argv[] */
19int loptchr = 0;        /* index in argv[loptind] */
20char *loptarg;          /* points to argument if present, else to option */
21static char shortopt[2] = {0, 0};
22
23void init_getlopt(void)
24{
25        loptind = 1;    /* index in argv[] */
26        loptchr = 0;    /* index in argv[loptind] */
27        shortopt[0] = 0;
28        shortopt[1] = 0;
29}
30
31#if defined(ultrix) || defined(ULTRIX)
32char *strdup (char *src)
33{
34        char *dest;
35
36        if (!(dest = (char *) malloc(strlen(src)+1)))
37                return (NULL);
38        return (strcpy(dest, src));
39}
40#endif
41
42topt *findopt (int islong, char *opt, topt *opts)
43{
44        if (!opts)
45                return (0);
46        while (opts->lname) {
47                if (islong) {
48                        if (!strcmp(opts->lname, opt))
49                                return (opts);
50                }
51                else
52                        if (opts->sname == *opt)
53                                return (opts);
54                opts++;
55        }
56        return (0);
57}
58
59int performoption (int argc, char *argv[], topt *opt)
60{
61        int result = GLO_CONTINUE;
62
63        if (!(opt->flags & 1)) /* doesn't take argument */
64                if (opt->var)
65                        if (opt->flags & 2) /* var is *char */
66                                *((char *) opt->var) = (char) opt->value;
67                        else
68                                *((int *) opt->var) = opt->value;
69                else
70                        result = opt->value ? opt->value : opt->sname;
71        else { /* requires argument */
72                if (loptind >= argc)
73                        return (GLO_NOARG);
74                loptarg = argv[loptind++]+loptchr;
75                loptchr = 0;
76                if (opt->var)
77                        if (opt->flags & 2) /* var is *char */
78                                *((char **) opt->var) = strdup(loptarg);
79                        else
80                                *((int *) opt->var) = atoi(loptarg);
81                else
82                        result = opt->value ? opt->value : opt->sname;
83        }
84        if (opt->func)
85                opt->func(loptarg);
86        return (result);
87}
88
89int getsingleopt (int argc, char *argv[], topt *opts)
90{
91        char *thisopt;
92        topt *opt;
93
94        if (loptind >= argc)
95                return (GLO_END);
96        thisopt = argv[loptind];
97        if (!loptchr) { /* start new option string */
98                if (thisopt[0] != '-' || !thisopt[1]) /* no more options */
99                        return (GLO_END);
100                if (thisopt[1] == '-') /* "--" */
101                        if (thisopt[2]) { /* long option */
102                                loptarg = thisopt+2;
103                                loptind++;
104                                if (!(opt = findopt(1, thisopt+2, opts)))
105                                        return (GLO_UNKNOWN);
106                                else
107                                        return (performoption(argc, argv, opt));
108                        }
109                        else { /* "--" == end of options */
110                                loptind++;
111                                return (GLO_END);
112                        }
113                else /* start short option(s) */
114                        loptchr = 1;
115        }
116        shortopt[0] = thisopt[loptchr];
117        loptarg = shortopt;
118        opt = findopt(0, thisopt+(loptchr++), opts);
119        if (!thisopt[loptchr]) {
120                loptind++;
121                loptchr = 0;
122        }
123        if (!opt)
124                return (GLO_UNKNOWN);
125        else
126                return (performoption(argc, argv, opt));
127}
128
129int getlopt (int argc, char *argv[], topt *opts)
130{
131        int result;
132       
133        while ((result = getsingleopt(argc, argv, opts)) == GLO_CONTINUE);
134        return (result);
135}
136
137/* EOF */
Note: See TracBrowser for help on using the repository browser.