1 /* $XConsortium: Options.C /main/1 1996/07/29 16:59:26 cde-hp $ */
2 // Derived from comp.sources.unix/volume3/att_getopt.
4 #ifndef Options_DEF_INCLUDED
5 #define Options_DEF_INCLUDED 1
8 #define OPTION_CHAR T('-')
12 namespace SP_NAMESPACE {
16 Options<T>::Options(int argc, T *const *argv, const T *opts)
17 : argc_(argc), argv_(argv), opts_(opts), ind_(1), sp_(1)
22 const T *Options<T>::search(T c) const
24 for (const T *s = opts_; *s; s++)
31 bool Options<T>::get(T &c)
38 #ifdef OTHER_OPTION_CHAR
39 argv_[ind_][0] != OTHER_OPTION_CHAR &&
41 argv_[ind_][0] != OPTION_CHAR) || argv_[ind_][1] == 0) {
44 for (i = ind_; i < argc_; i++)
46 #ifdef OTHER_OPTION_CHAR
47 argv_[i][0] == OTHER_OPTION_CHAR ||
49 argv_[i][0] == OPTION_CHAR) && argv_[i][1] != 0)
53 if (c != T(':') && c != OPTION_CHAR
54 && (cp = search(c)) != 0
55 && cp[1] == T(':') && argv_[i][2] == 0 && i < argc_ - 1) {
58 T *temp2 = argv_[i + 1];
59 for (j = i - 1; j >= ind_; j--)
60 argv_[j+2] = argv_[j];
62 argv_[ind_ + 1] = temp2;
67 for (j = i - 1; j >= ind_; j--)
68 argv_[j+1] = argv_[j];
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)
88 opt_ = c = argv_[ind_][sp_];
89 if (c == T(':') || (cp = search(c)) == 0) {
90 if (argv_[ind_][++sp_] == 0) {
97 if (*++cp == T(':')) {
98 if (argv_[ind_][sp_ + 1] != 0)
99 arg_ = &argv_[ind_++][sp_ + 1];
100 else if (++ind_ >= argc_) {
102 c = (*opts_ == T(':') ? T(':') : T('?'));
106 arg_ = argv_[ind_++];
110 if (argv_[ind_][++sp_] == 0) {
123 #endif /* not Options_DEF_INCLUDED */