1 //
2 // keyvalagg.cc
3 //
4 // Copyright (C) 1996 Limit Point Systems, Inc.
5 //
6 // Author: Curtis Janssen <cljanss@limitpt.com>
7 // Maintainer: LPS
8 //
9 // This file is part of the SC Toolkit.
10 //
11 // The SC Toolkit is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU Library General Public License as published by
13 // the Free Software Foundation; either version 2, or (at your option)
14 // any later version.
15 //
16 // The SC Toolkit is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU Library General Public License for more details.
20 //
21 // You should have received a copy of the GNU Library General Public License
22 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 //
25 // The U.S. Government is granted a limited license as per AL 91-7.
26 //
27
28 extern "C" {
29 #include <ctype.h>
30 #include <stdlib.h>
31 }
32 #include <util/misc/formio.h>
33 #include <util/keyval/keyval.h>
34
35 using namespace std;
36 using namespace sc;
37
38 /////////////////////////////////////////////////////////////////////
39 // AggregateKeyVal
40
AggregateKeyVal(const Ref<KeyVal> & kv0)41 AggregateKeyVal::AggregateKeyVal(const Ref<KeyVal>&kv0)
42 {
43 kv[0] = kv0;
44 kv[1] = 0;
45 kv[2] = 0;
46 kv[3] = 0;
47 }
48
AggregateKeyVal(const Ref<KeyVal> & kv0,const Ref<KeyVal> & kv1)49 AggregateKeyVal::AggregateKeyVal(const Ref<KeyVal>&kv0,const Ref<KeyVal>&kv1)
50 {
51 kv[0] = kv0;
52 kv[1] = kv1;
53 kv[2] = 0;
54 kv[3] = 0;
55 }
56
AggregateKeyVal(const Ref<KeyVal> & kv0,const Ref<KeyVal> & kv1,const Ref<KeyVal> & kv2)57 AggregateKeyVal::AggregateKeyVal(const Ref<KeyVal>&kv0,const Ref<KeyVal>&kv1,
58 const Ref<KeyVal>&kv2)
59 {
60 kv[0] = kv0;
61 kv[1] = kv1;
62 kv[2] = kv2;
63 kv[3] = 0;
64 }
65
AggregateKeyVal(const Ref<KeyVal> & kv0,const Ref<KeyVal> & kv1,const Ref<KeyVal> & kv2,const Ref<KeyVal> & kv3)66 AggregateKeyVal::AggregateKeyVal(const Ref<KeyVal>&kv0,const Ref<KeyVal>&kv1,
67 const Ref<KeyVal>&kv2,const Ref<KeyVal>&kv3)
68 {
69 kv[0] = kv0;
70 kv[1] = kv1;
71 kv[2] = kv2;
72 kv[3] = kv3;
73 }
74
~AggregateKeyVal()75 AggregateKeyVal::~AggregateKeyVal()
76 {
77 }
78
79 Ref<KeyVal>
getkeyval(const char * keyword)80 AggregateKeyVal::getkeyval(const char* keyword)
81 {
82 Ref<KeyVal> lastkeyval;
83 for (int i=0; i<MaxKeyVal && kv[i].nonnull(); i++) {
84 kv[i]->exists(keyword);
85 seterror(kv[i]->error());
86 if (error() != KeyVal::UnknownKeyword) return kv[i];
87 lastkeyval = kv[i];
88 }
89 // The last keyval in the list is used to lookup the value
90 // if the keyword is not found. This only affects printing
91 // in verbose keyvals.
92 return lastkeyval;
93 }
94
95 Ref<KeyValValue>
key_value(const char * arg,const KeyValValue & def)96 AggregateKeyVal::key_value(const char*arg, const KeyValValue &def)
97 {
98 Ref<KeyVal> kval = getkeyval(arg);
99 if (kval.nonnull()) return kval->key_value(arg,def);
100 else return 0;
101 }
102
103 int
key_exists(const char * key)104 AggregateKeyVal::key_exists(const char* key)
105 {
106 Ref<KeyVal> kval = getkeyval(key);
107 if (kval.nonnull()) return kval->exists(key);
108 else return 0;
109 }
110
111 void
errortrace(ostream & fp)112 AggregateKeyVal::errortrace(ostream&fp)
113 {
114 fp << indent << "AggregateKeyVal: error: \"" << errormsg() << "\"" << endl;
115 for (int i = 0; i<4; i++) {
116 if (kv[i].nonnull()) {
117 fp << indent << " KeyVal #" << i << ":" << endl;
118 fp << incindent;
119 kv[i]->errortrace(fp);
120 fp << decindent;
121 }
122 }
123 }
124
125 void
dump(ostream & fp)126 AggregateKeyVal::dump(ostream&fp)
127 {
128 fp << indent << "AggregateKeyVal: error: \"" << errormsg() << "\"" << endl;
129 for (int i = 0; i<4; i++) {
130 if (kv[i].nonnull()) {
131 fp << indent << " KeyVal #" << i << ":" << endl;
132 fp << incindent;
133 kv[i]->dump(fp);
134 fp << decindent;
135 }
136 }
137 }
138
139 /////////////////////////////////////////////////////////////////////////////
140
141 // Local Variables:
142 // mode: c++
143 // c-file-style: "CLJ"
144 // End:
145