Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / nsgmls / Options.C
1 /* $XConsortium: Options.C /main/1 1996/07/29 16:59:26 cde-hp $ */
2 // Derived from comp.sources.unix/volume3/att_getopt.
3
4 #ifndef Options_DEF_INCLUDED
5 #define Options_DEF_INCLUDED 1
6
7 #ifndef OPTION_CHAR
8 #define OPTION_CHAR T('-')
9 #endif
10
11 #ifdef SP_NAMESPACE
12 namespace SP_NAMESPACE {
13 #endif
14
15 template<class T>
16 Options<T>::Options(int argc, T *const *argv, const T *opts)
17 : argc_(argc), argv_(argv), opts_(opts), ind_(1), sp_(1)
18 {
19 }
20
21 template<class T>
22 const T *Options<T>::search(T c) const
23 {
24   for (const T *s = opts_; *s; s++)
25     if (*s == c)
26       return s;
27   return 0;
28 }
29
30 template<class T>
31 bool Options<T>::get(T &c)
32 {
33   const T *cp;
34   if (sp_ == 1) {
35     if (ind_ >= argc_)
36       return false;
37     if ((
38 #ifdef OTHER_OPTION_CHAR
39          argv_[ind_][0] != OTHER_OPTION_CHAR &&
40 #endif
41          argv_[ind_][0] != OPTION_CHAR) || argv_[ind_][1] == 0) {
42 #ifdef REORDER_ARGS
43       int i;
44       for (i = ind_; i < argc_; i++)
45         if ((
46 #ifdef OTHER_OPTION_CHAR
47              argv_[i][0] == OTHER_OPTION_CHAR ||
48 #endif
49              argv_[i][0] == OPTION_CHAR) && argv_[i][1] != 0)
50           break;
51       if (i < argc_) {
52         c = argv_[i][1];
53         if (c != T(':') && c != OPTION_CHAR
54             && (cp = search(c)) != 0
55             && cp[1] == T(':') && argv_[i][2] == 0 && i < argc_ - 1) {
56           int j;
57           T *temp1 = argv_[i];
58           T *temp2 = argv_[i + 1];
59           for (j = i - 1; j >= ind_; j--)
60             argv_[j+2] = argv_[j];
61           argv_[ind_] = temp1;
62           argv_[ind_ + 1] = temp2;
63         }
64         else {
65           int j;
66           T *temp = argv_[i];
67           for (j = i - 1; j >= ind_; j--)
68             argv_[j+1] = argv_[j];
69           argv_[ind_] = temp;
70         }
71       }
72       else
73 #endif
74         return false;
75     }
76     if ((argv_[ind_][0] == OPTION_CHAR && argv_[ind_][1] == OPTION_CHAR
77          && argv_[ind_][2] == 0)
78 #ifdef OTHER_OPTION_CHAR
79         || (argv_[ind_][0] == OTHER_OPTION_CHAR
80             && argv_[ind_][1] == OTHER_OPTION_CHAR
81             && argv_[ind_][2] == 0)
82 #endif
83         ) {
84       ind_++;
85       return false;
86     }
87   }
88   opt_ = c = argv_[ind_][sp_];
89   if (c == T(':') || (cp = search(c)) == 0) {
90     if (argv_[ind_][++sp_] == 0) {
91       ind_++;
92       sp_ = 1;
93     }
94     c = T('?');
95     return true;
96   }
97   if (*++cp == T(':')) {
98     if (argv_[ind_][sp_ + 1] != 0)
99       arg_ = &argv_[ind_++][sp_ + 1];
100     else if (++ind_ >= argc_) {
101       sp_ = 1;
102       c = (*opts_ == T(':') ? T(':') : T('?'));
103       return true;
104     }
105     else
106       arg_ = argv_[ind_++];
107     sp_ = 1;
108   } 
109   else {
110     if (argv_[ind_][++sp_] == 0) {
111       sp_ = 1;
112       ind_++;
113     }
114     arg_ = 0;
115   }
116   return true;
117 }
118
119 #ifdef SP_NAMESPACE
120 }
121 #endif
122
123 #endif /* not Options_DEF_INCLUDED */