source: ThirdParty/mpqc_open/src/lib/util/keyval/keyval.cc@ 00f983

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 00f983 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 17.1 KB
Line 
1//
2// keyval.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#ifdef __GNUG__
29#pragma implementation
30#endif
31
32extern "C" {
33#include <ctype.h>
34#include <stdio.h>
35#include <stdlib.h>
36}
37
38#include <iostream>
39
40#include <util/misc/formio.h>
41#include <util/keyval/keyval.h>
42
43using namespace std;
44using namespace sc;
45
46////////////////////////////////////////////////////////////////////////
47// KeyVal
48
49KeyVal::KeyVal() :
50 errcod(OK),
51 verbose_(0)
52{
53}
54
55KeyVal::~KeyVal()
56{
57}
58
59const char* KeyVal::errormsg(KeyValError err)
60 {
61 const char* msg1 = "No problem.";
62 const char* msg2 = "The keyword was not found.";
63 const char* msg3 = "The requested operation failed.";
64 const char* msg4 = "The datum is not of the appropiate type.";
65 const char* msg5 = "The keyword has no value.";
66 const char* invalid = "The KeyValError is invalid.";
67 if (err == OK ) return msg1;
68 else if (err == UnknownKeyword ) return msg2;
69 else if (err == OperationFailed) return msg3;
70 else if (err == WrongType ) return msg4;
71 else if (err == HasNoValue ) return msg5;
72 else return invalid;
73 }
74int KeyVal::key_count(const char* key)
75 {
76 int i=0;
77 while(exists(key,i)) i++;
78 if (i!=0) seterror(OK);
79 return i;
80 }
81
82double
83KeyVal::key_doublevalue(const char* key, const KeyValValue& def)
84{
85 Ref<KeyValValue> val(key_value(key,def));
86 double result;
87 if (val.nonnull()) {
88 seterror(val->doublevalue(result));
89 }
90 else {
91 KeyValValue::KeyValValueError err = def.doublevalue(result);
92 if (error() == OK) seterror(err);
93 }
94 return result;
95}
96int
97KeyVal::key_booleanvalue(const char* key, const KeyValValue& def)
98{
99 Ref<KeyValValue> val(key_value(key,def));
100 int result;
101 if (val.nonnull()) {
102 seterror(val->booleanvalue(result));
103 }
104 else {
105 KeyValValue::KeyValValueError err = def.booleanvalue(result);
106 if (error() == OK) seterror(err);
107 }
108 return result;
109}
110int
111KeyVal::key_intvalue(const char* key, const KeyValValue& def)
112{
113 Ref<KeyValValue> val(key_value(key,def));
114 int result;
115 if (val.nonnull()) {
116 seterror(val->intvalue(result));
117 }
118 else {
119 KeyValValue::KeyValValueError err = def.intvalue(result);
120 if (error() == OK) seterror(err);
121 }
122 return result;
123}
124size_t
125KeyVal::key_sizevalue(const char* key, const KeyValValue& def)
126{
127 Ref<KeyValValue> val(key_value(key,def));
128 size_t result;
129 if (val.nonnull()) {
130 seterror(val->sizevalue(result));
131 }
132 else {
133 KeyValValue::KeyValValueError err = def.sizevalue(result);
134 if (error() == OK) seterror(err);
135 }
136 return result;
137}
138float
139KeyVal::key_floatvalue(const char* key, const KeyValValue& def)
140{
141 Ref<KeyValValue> val(key_value(key,def));
142 float result;
143 if (val.nonnull()) {
144 seterror(val->floatvalue(result));
145 }
146 else {
147 KeyValValue::KeyValValueError err = def.floatvalue(result);
148 if (error() == OK) seterror(err);
149 }
150 return result;
151}
152char
153KeyVal::key_charvalue(const char* key, const KeyValValue& def)
154{
155 Ref<KeyValValue> val(key_value(key,def));
156 char result;
157 if (val.nonnull()) {
158 seterror(val->charvalue(result));
159 }
160 else {
161 KeyValValue::KeyValValueError err = def.charvalue(result);
162 if (error() == OK) seterror(err);
163 }
164 return result;
165}
166char*
167KeyVal::key_pcharvalue(const char* key, const KeyValValue& def)
168{
169 Ref<KeyValValue> val(key_value(key,def));
170 const char* result;
171 if (val.nonnull()) {
172 seterror(val->pcharvalue(result));
173 }
174 else {
175 KeyValValue::KeyValValueError err = def.pcharvalue(result);
176 if (error() == OK) seterror(err);
177 }
178 if (result) return strcpy(new char[strlen(result)+1], result);
179 else return 0;
180}
181std::string
182KeyVal::key_stringvalue(const char* key, const KeyValValue& def)
183{
184 Ref<KeyValValue> val(key_value(key,def));
185 std::string result;
186 if (val.nonnull()) {
187 seterror(val->stringvalue(result));
188 }
189 else {
190 KeyValValue::KeyValValueError err = def.stringvalue(result);
191 if (error() == OK) seterror(err);
192 }
193 return result;
194}
195Ref<DescribedClass>
196KeyVal::key_describedclassvalue(const char* key, const KeyValValue& def)
197{
198 Ref<KeyValValue> val(key_value(key,def));
199 Ref<DescribedClass> result;
200 if (val.nonnull()) {
201 seterror(val->describedclassvalue(result));
202 val = 0; // fix for gcc 2.7.0 bug
203 }
204 else {
205 KeyValValue::KeyValValueError err = def.describedclassvalue(result);
206 if (error() == OK) seterror(err);
207 }
208 return result;
209}
210
211int
212KeyVal::exists(const char*key)
213{
214 return key_exists(key);
215}
216int
217KeyVal::count(const char*key)
218{
219 return key_count(key);
220}
221Ref<KeyValValue>
222KeyVal::value(const char*key,const KeyValValue &def)
223{
224 return key_value(key,def);
225}
226int
227KeyVal::booleanvalue(const char*key,const KeyValValue& def)
228{
229 return key_booleanvalue(key,def);
230}
231double
232KeyVal::doublevalue(const char*key,const KeyValValue& def)
233{
234 return key_doublevalue(key,def);
235}
236float
237KeyVal::floatvalue(const char*key,const KeyValValue& def)
238{
239 return key_floatvalue(key,def);
240}
241char
242KeyVal::charvalue(const char*key,const KeyValValue& def)
243{
244 return key_charvalue(key,def);
245}
246int
247KeyVal::intvalue(const char*key,const KeyValValue& def)
248{
249 return key_intvalue(key,def);
250}
251size_t
252KeyVal::sizevalue(const char*key,const KeyValValue& def)
253{
254 return key_sizevalue(key,def);
255}
256char*
257KeyVal::pcharvalue(const char*key,const KeyValValue& def)
258{
259 return key_pcharvalue(key,def);
260}
261std::string
262KeyVal::stringvalue(const char*key,const KeyValValue& def)
263{
264 return key_stringvalue(key,def);
265}
266Ref<DescribedClass>
267KeyVal::describedclassvalue(const char*key,const KeyValValue& def)
268{
269 return key_describedclassvalue(key,def);
270}
271
272static void getnewkey(char*newkey,const char*key,int n1)
273 {
274 if (key) sprintf(newkey,"%s:%d",key,n1);
275 else sprintf(newkey,"%d",n1);
276 }
277
278static void getnewkey(char*newkey,const char*key,int n1,int n2)
279 {
280 if (key) sprintf(newkey,"%s:%d:%d",key,n1,n2);
281 else sprintf(newkey,"%d:%d",n1,n2);
282 }
283
284//static void getnewkey(char*newkey,const char*key,int n1,int n2,int n3)
285// {
286// if (key) sprintf(newkey,"%s:%d:%d:%d",key,n1,n2,n3);
287// else sprintf(newkey,"%d:%d:%d",n1,n2,n3);
288// }
289
290//static void getnewkey(char*newkey,const char*key,int n1,int n2,int n3,int n4)
291// {
292// if (key) sprintf(newkey,"%s:%d:%d:%d:%d",key,n1,n2,n3,n4);
293// else sprintf(newkey,"%d:%d:%d:%d",n1,n2,n3,n4);
294// }
295
296// For vectors:
297int KeyVal::exists(const char* key,int n1)
298 {
299 char newkey[MaxKeywordLength];
300 getnewkey(newkey,key,n1);
301 return key_exists(newkey);
302 }
303int KeyVal::count(const char* key,int n1)
304 {
305 char newkey[MaxKeywordLength];
306 getnewkey(newkey,key,n1);
307 return key_count(newkey);
308 }
309double KeyVal::doublevalue(const char* key,int n1,const KeyValValue& def)
310 {
311 char newkey[MaxKeywordLength];
312 getnewkey(newkey,key,n1);
313 return key_doublevalue(newkey,def);
314 }
315float KeyVal::floatvalue(const char* key,int n1,const KeyValValue& def)
316 {
317 char newkey[MaxKeywordLength];
318 getnewkey(newkey,key,n1);
319 return key_floatvalue(newkey,def);
320 }
321char KeyVal::charvalue(const char* key,int n1,const KeyValValue& def)
322 {
323 char newkey[MaxKeywordLength];
324 getnewkey(newkey,key,n1);
325 return key_charvalue(newkey,def);
326 }
327int KeyVal::intvalue(const char* key,int n1,const KeyValValue& def)
328 {
329 char newkey[MaxKeywordLength];
330 getnewkey(newkey,key,n1);
331 return key_intvalue(newkey,def);
332 }
333size_t KeyVal::sizevalue(const char* key,int n1,const KeyValValue& def)
334 {
335 char newkey[MaxKeywordLength];
336 getnewkey(newkey,key,n1);
337 return key_sizevalue(newkey,def);
338 }
339int KeyVal::booleanvalue(const char* key,int n1,const KeyValValue& def)
340 {
341 char newkey[MaxKeywordLength];
342 getnewkey(newkey,key,n1);
343 return key_booleanvalue(newkey,def);
344 }
345char* KeyVal::pcharvalue(const char* key,int n1,const KeyValValue& def)
346 {
347 char newkey[MaxKeywordLength];
348 getnewkey(newkey,key,n1);
349 return key_pcharvalue(newkey,def);
350 }
351std::string KeyVal::stringvalue(const char* key,int n1,const KeyValValue& def)
352 {
353 char newkey[MaxKeywordLength];
354 getnewkey(newkey,key,n1);
355 return key_stringvalue(newkey,def);
356 }
357Ref<DescribedClass> KeyVal::describedclassvalue(const char* key,int n1,
358 const KeyValValue& def)
359 {
360 char newkey[MaxKeywordLength];
361 getnewkey(newkey,key,n1);
362 return key_describedclassvalue(newkey,def);
363 }
364
365// For arrays:
366int KeyVal::exists(const char* key,int n1,int n2)
367 {
368 char newkey[MaxKeywordLength];
369 getnewkey(newkey,key,n1,n2);
370 return key_exists(newkey);
371 }
372int KeyVal::count(const char* key,int n1,int n2)
373 {
374 char newkey[MaxKeywordLength];
375 getnewkey(newkey,key,n1,n2);
376 return key_count(newkey);
377 }
378double KeyVal::doublevalue(const char* key,int n1,int n2,
379 const KeyValValue& def)
380 {
381 char newkey[MaxKeywordLength];
382 getnewkey(newkey,key,n1,n2);
383 return key_doublevalue(newkey,def);
384 }
385float KeyVal::floatvalue(const char* key,int n1,int n2,
386 const KeyValValue& def)
387 {
388 char newkey[MaxKeywordLength];
389 getnewkey(newkey,key,n1,n2);
390 return key_floatvalue(newkey,def);
391 }
392char KeyVal::charvalue(const char* key,int n1,int n2,
393 const KeyValValue& def)
394 {
395 char newkey[MaxKeywordLength];
396 getnewkey(newkey,key,n1,n2);
397 return key_charvalue(newkey,def);
398 }
399int KeyVal::intvalue(const char* key,int n1,int n2,
400 const KeyValValue& def)
401 {
402 char newkey[MaxKeywordLength];
403 getnewkey(newkey,key,n1,n2);
404 return key_intvalue(newkey,def);
405 }
406size_t KeyVal::sizevalue(const char* key,int n1,int n2,
407 const KeyValValue& def)
408 {
409 char newkey[MaxKeywordLength];
410 getnewkey(newkey,key,n1,n2);
411 return key_sizevalue(newkey,def);
412 }
413int KeyVal::booleanvalue(const char* key,int n1,int n2,
414 const KeyValValue& def)
415 {
416 char newkey[MaxKeywordLength];
417 getnewkey(newkey,key,n1,n2);
418 return key_booleanvalue(newkey,def);
419 }
420char* KeyVal::pcharvalue(const char* key,int n1,int n2,
421 const KeyValValue& def)
422 {
423 char newkey[MaxKeywordLength];
424 getnewkey(newkey,key,n1,n2);
425 return key_pcharvalue(newkey,def);
426 }
427std::string KeyVal::stringvalue(const char* key,int n1,int n2,
428 const KeyValValue& def)
429 {
430 char newkey[MaxKeywordLength];
431 getnewkey(newkey,key,n1,n2);
432 return key_stringvalue(newkey,def);
433 }
434Ref<DescribedClass> KeyVal::describedclassvalue(const char* key,int n1,int n2,
435 const KeyValValue& def)
436 {
437 char newkey[MaxKeywordLength];
438 getnewkey(newkey,key,n1,n2);
439 return key_describedclassvalue(newkey,def);
440 }
441
442// new and improved for the intel, we can once again use va_arg(), so the
443// 12 arg limit is gone. Unfortunately we can't use new here, so the vals
444// array is hardwired to 80. That should suffice in the foreseeable future
445//
446#define getnewvakey(newkey,key,narg) \
447 strcpy(newkey,key); \
448 if(narg!=0) { \
449 int vals[80]; \
450 if(narg > 80) { \
451 ExEnv::errn() << "keyval.cc: getnewvakey: too many varargs...sorry" << endl; \
452 exit(1); \
453 } \
454 va_start(args,narg); \
455 int i; \
456 for(i=0; i < narg; i++) \
457 vals[i] = va_arg(args,int); \
458 va_end(args); \
459 for(i=0; i < narg; i++) \
460 sprintf((newkey+strlen(newkey)),":%d",vals[i]); \
461 }
462
463// For all else:
464int KeyVal::Va_exists(const char* key,int narg,...)
465 {
466 va_list args;
467 char newkey[MaxKeywordLength];
468 getnewvakey(newkey,key,narg);
469 return key_exists(newkey);
470 }
471int KeyVal::Va_count(const char* key,int narg,...)
472 {
473 va_list args;
474 char newkey[MaxKeywordLength];
475 getnewvakey(newkey,key,narg);
476 return key_count(newkey);
477 }
478double KeyVal::Va_doublevalue(const char* key,int narg,...)
479 {
480 va_list args;
481 char newkey[MaxKeywordLength];
482 getnewvakey(newkey,key,narg);
483 return key_doublevalue(newkey,KeyValValuedouble());
484 }
485float KeyVal::Va_floatvalue(const char* key,int narg,...)
486 {
487 va_list args;
488 char newkey[MaxKeywordLength];
489 getnewvakey(newkey,key,narg);
490 return key_floatvalue(newkey,KeyValValuefloat());
491 }
492char KeyVal::Va_charvalue(const char* key,int narg,...)
493 {
494 va_list args;
495 char newkey[MaxKeywordLength];
496 getnewvakey(newkey,key,narg);
497 return key_charvalue(newkey,KeyValValuechar());
498 }
499int KeyVal::Va_intvalue(const char* key,int narg,...)
500 {
501 va_list args;
502 char newkey[MaxKeywordLength];
503 getnewvakey(newkey,key,narg);
504 return key_intvalue(newkey,KeyValValueint());
505 }
506size_t KeyVal::Va_sizevalue(const char* key,int narg,...)
507 {
508 va_list args;
509 char newkey[MaxKeywordLength];
510 getnewvakey(newkey,key,narg);
511 return key_sizevalue(newkey,KeyValValuesize());
512 }
513char* KeyVal::Va_pcharvalue(const char* key,int narg,...)
514 {
515 va_list args;
516 char newkey[MaxKeywordLength];
517 getnewvakey(newkey,key,narg);
518 return key_pcharvalue(newkey,KeyValValuepchar());
519 }
520std::string KeyVal::Va_stringvalue(const char* key,int narg,...)
521 {
522 va_list args;
523 char newkey[MaxKeywordLength];
524 getnewvakey(newkey,key,narg);
525 return key_stringvalue(newkey,KeyValValuestring());
526 }
527Ref<DescribedClass> KeyVal::Va_describedclassvalue(const char* key,int narg,...)
528 {
529 va_list args;
530 char newkey[MaxKeywordLength];
531 getnewvakey(newkey,key,narg);
532 return key_describedclassvalue(newkey,KeyValValueRefDescribedClass());
533 }
534
535void KeyVal::errortrace(ostream&fp)
536{
537 fp << indent << "KeyVal: error: \"" << errormsg() << "\"" << endl;
538}
539
540void KeyVal::dump(ostream&fp)
541{
542 fp << indent << "KeyVal: error: \"" << errormsg() << "\"" << endl;
543}
544
545void KeyVal::print_unseen(ostream&fp)
546{
547 fp << indent << "(this keyval does not record unread variables)" << endl;
548}
549
550int KeyVal::have_unseen()
551{
552 return -1;
553}
554
555void
556KeyVal::seterror(KeyValValue::KeyValValueError e)
557{
558 if (e == KeyValValue::OK) {
559 seterror(KeyVal::OK);
560 }
561 else if (e == KeyValValue::WrongType) {
562 seterror(KeyVal::WrongType);
563 }
564 else {
565 // shouldn't get here
566 seterror(KeyVal::OperationFailed);
567 }
568}
569
570// here are some inline candidates that are here for now because
571// they were making executables big
572void
573KeyVal::seterror(KeyValError err)
574{
575 errcod = err;
576}
577
578int
579KeyVal::exists(int i)
580{
581 return exists((const char*)0,i);
582}
583
584int
585KeyVal::count(int i)
586{
587 return count((const char*)0,i);
588}
589
590int
591KeyVal::booleanvalue(int i,const KeyValValue& def)
592{
593 return booleanvalue((const char*)0,i,def);
594}
595
596double
597KeyVal::doublevalue(int i,const KeyValValue& def)
598{
599 return doublevalue((const char*)0,i,def);
600}
601
602float
603KeyVal::floatvalue(int i,const KeyValValue& def)
604{
605 return floatvalue((const char*)0,i,def);
606}
607
608char
609KeyVal::charvalue(int i,const KeyValValue& def)
610{
611 return charvalue((const char*)0,i,def);
612}
613
614int
615KeyVal::intvalue(int i,const KeyValValue& def)
616{
617 return intvalue((const char*)0,i,def);
618}
619
620size_t
621KeyVal::sizevalue(int i,const KeyValValue& def)
622{
623 return sizevalue((const char*)0,i,def);
624}
625
626char*
627KeyVal::pcharvalue(int i,const KeyValValue& def)
628{
629 return pcharvalue((const char*)0,i,def);
630}
631
632std::string
633KeyVal::stringvalue(int i,const KeyValValue& def)
634{
635 return stringvalue((const char*)0,i,def);
636}
637
638Ref<DescribedClass>
639KeyVal::describedclassvalue(int i,const KeyValValue& def)
640{
641 return describedclassvalue((const char*)0,i,def);
642}
643
644int
645KeyVal::exists(int i,int j)
646{
647 return exists((const char*)0,i,j);
648}
649
650int
651KeyVal::count(int i,int j)
652{
653 return count((const char*)0,i,j);
654}
655
656int
657KeyVal::booleanvalue(int i,int j,const KeyValValue& def)
658{
659 return booleanvalue((const char*)0,i,j,def);
660}
661
662double
663KeyVal::doublevalue(int i,int j,const KeyValValue& def)
664{
665 return doublevalue((const char*)0,i,j,def);
666}
667
668float
669KeyVal::floatvalue(int i,int j,const KeyValValue& def)
670{
671 return floatvalue((const char*)0,i,j,def);
672}
673
674char
675KeyVal::charvalue(int i,int j,const KeyValValue& def)
676{
677 return charvalue((const char*)0,i,j,def);
678}
679
680int
681KeyVal::intvalue(int i,int j,const KeyValValue& def)
682{
683 return intvalue((const char*)0,i,j,def);
684}
685
686size_t
687KeyVal::sizevalue(int i,int j,const KeyValValue& def)
688{
689 return sizevalue((const char*)0,i,j,def);
690}
691
692char*
693KeyVal::pcharvalue(int i,int j,const KeyValValue& def)
694{
695 return pcharvalue((const char*)0,i,j,def);
696}
697
698std::string
699KeyVal::stringvalue(int i,int j,const KeyValValue& def)
700{
701 return stringvalue((const char*)0,i,j,def);
702}
703
704Ref<DescribedClass>
705KeyVal::describedclassvalue(int i,int j,const KeyValValue& def)
706{
707 return describedclassvalue((const char*)0,i,j,def);
708}
709
710KeyVal::KeyValError
711KeyVal::error()
712{
713 return errcod;
714}
715
716const char*
717KeyVal::errormsg()
718{
719 return errormsg(errcod);
720}
Note: See TracBrowser for help on using the repository browser.