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