Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4UIcommand.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30
31#include "G4UIcommand.hh"
32#include "G4UImessenger.hh"
33#include "G4UImanager.hh"
34#include "G4UIcommandStatus.hh"
35#include "G4StateManager.hh"
36#include "G4UnitsTable.hh"
37#include "G4Tokenizer.hh"
38#include "G4ios.hh"
39#include <sstream>
40
42 : messenger(0), bp(0), token(IDENTIFIER), paramERR(0)
43{
44}
45
46G4UIcommand::G4UIcommand(const char * theCommandPath,
47 G4UImessenger * theMessenger)
48:messenger(theMessenger),token(IDENTIFIER),paramERR(0)
49{
50 G4String comStr = theCommandPath;
51 if(!theMessenger)
52 { // this must be a directory
53 if(comStr(comStr.length()-1)!='/')
54 {
55 G4cerr << "G4UIcommand Warning : " << G4endl;
56 G4cerr << " <" << theCommandPath << "> must be a directory." << G4endl;
57 G4cerr << " '/' is appended." << G4endl;
58 comStr += "/";
59 }
60 }
61 G4UIcommandCommonConstructorCode (comStr);
62 G4String nullString;
63 availabelStateList.clear();
64 availabelStateList.push_back(G4State_PreInit);
65 availabelStateList.push_back(G4State_Init);
66 availabelStateList.push_back(G4State_Idle);
67 availabelStateList.push_back(G4State_GeomClosed);
68 availabelStateList.push_back(G4State_EventProc);
69 availabelStateList.push_back(G4State_Abort);
70}
71
72void G4UIcommand::G4UIcommandCommonConstructorCode
73(const char * theCommandPath)
74{
75 commandPath = theCommandPath;
76 commandName = theCommandPath;
77 G4int commandNameIndex = commandName.last('/');
78 commandName.remove(0,commandNameIndex+1);
79
81}
82
84{
86 if(fUImanager) fUImanager->RemoveCommand(this);
87
88 G4int n_parameterEntry = parameter.size();
89 for( G4int i_thParameter=0; i_thParameter < n_parameterEntry; i_thParameter++ )
90 { delete parameter[i_thParameter]; }
91 parameter.clear();
92}
93
95{
96 return ( commandPath == right.GetCommandPath() );
97}
98
100{
101 return ( commandPath != right.GetCommandPath() );
102}
103
105{
106 G4String correctParameters;
107 G4int n_parameterEntry = parameter.size();
108 if( n_parameterEntry != 0 )
109 {
110 G4String aToken;
111 G4String correctToken;
112 G4Tokenizer parameterToken( parameterList );
113 for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ )
114 {
115 if(i_thParameter > 0)
116 {
117 correctParameters.append(" ");
118 }
119 aToken = parameterToken();
120 if( aToken.length()>0 && aToken(0)=='"' )
121 {
122 while( aToken(aToken.length()-1) != '"'
123 || ( aToken.length()==1 && aToken(0)=='"' ))
124 {
125 G4String additionalToken = parameterToken();
126 if( additionalToken.isNull() )
127 { return fParameterUnreadable+i_thParameter; }
128 aToken += " ";
129 aToken += additionalToken;
130 }
131 }
132 else if(i_thParameter==n_parameterEntry-1 && parameter[i_thParameter]->GetParameterType()=='s')
133 {
134 G4String anotherToken;
135 while(!((anotherToken=parameterToken()).isNull()))
136 {
137 G4int idxs = anotherToken.index("#");
138 if(idxs==G4int(std::string::npos))
139 {
140 aToken += " ";
141 aToken += anotherToken;
142 }
143 else if(idxs>0)
144 {
145 aToken += " ";
146 aToken += anotherToken(0,idxs);
147 break;
148 }
149 else
150 { break; }
151 }
152 }
153
154 if( aToken.isNull() || aToken == "!" )
155 {
156 if(parameter[i_thParameter]->IsOmittable())
157 {
158 if(parameter[i_thParameter]->GetCurrentAsDefault())
159 {
160 G4Tokenizer cvSt(messenger->GetCurrentValue(this));
161 G4String parVal;
162 for(G4int ii=0;ii<i_thParameter;ii++)
163 {
164 parVal = cvSt();
165 if (parVal(0)=='"')
166 {
167 while( parVal(parVal.length()-1) != '"' )
168 {
169 G4String additionalToken = cvSt();
170 if( additionalToken.isNull() )
171 { return fParameterUnreadable+i_thParameter; }
172 parVal += " ";
173 parVal += additionalToken;
174 }
175 }
176 }
177 G4String aCVToken = cvSt();
178 if (aCVToken(0)=='"')
179 {
180 while( aCVToken(aCVToken.length()-1) != '"' )
181 {
182 G4String additionalToken = cvSt();
183 if( additionalToken.isNull() )
184 { return fParameterUnreadable+i_thParameter; }
185 aCVToken += " ";
186 aCVToken += additionalToken;
187 }
188 // aCVToken.strip(G4String::both,'"');
189 }
190 correctParameters.append(aCVToken);
191 }
192 else
193 { correctParameters.append(parameter[i_thParameter]->GetDefaultValue()); }
194 }
195 else
196 { return fParameterUnreadable+i_thParameter; }
197 }
198 else
199 {
200 G4int stat = parameter[i_thParameter]->CheckNewValue( aToken );
201 if(stat) return stat+i_thParameter;
202 correctParameters.append(aToken);
203 }
204 }
205 }
206
207 if(CheckNewValue( correctParameters ))
208 { return fParameterOutOfRange+99; }
209
210 messenger->SetNewValue( this, correctParameters );
211 return 0;
212}
213
215{
216 return messenger->GetCurrentValue(this);
217}
218
220{
221 availabelStateList.clear();
222 availabelStateList.push_back(s1);
223}
224
227{
228 availabelStateList.clear();
229 availabelStateList.push_back(s1);
230 availabelStateList.push_back(s2);
231}
232
236{
237 availabelStateList.clear();
238 availabelStateList.push_back(s1);
239 availabelStateList.push_back(s2);
240 availabelStateList.push_back(s3);
241}
242
247{
248 availabelStateList.clear();
249 availabelStateList.push_back(s1);
250 availabelStateList.push_back(s2);
251 availabelStateList.push_back(s3);
252 availabelStateList.push_back(s4);
253}
254
260{
261 availabelStateList.clear();
262 availabelStateList.push_back(s1);
263 availabelStateList.push_back(s2);
264 availabelStateList.push_back(s3);
265 availabelStateList.push_back(s4);
266 availabelStateList.push_back(s5);
267}
268
270{
271 G4bool av = false;
272 G4ApplicationState currentState
274
275 G4int nState = availabelStateList.size();
276 for(G4int i=0;i<nState;i++)
277 {
278 if(availabelStateList[i]==currentState)
279 {
280 av = true;
281 break;
282 }
283 }
284
285 return av;
286}
287
288G4double G4UIcommand::ValueOf(const char* unitName)
289{
290 G4double value = 0.;
291 value = G4UnitDefinition::GetValueOf(unitName);
292 return value;
293}
294
296{
297 return G4UnitDefinition::GetCategory(unitName);
298}
299
300G4String G4UIcommand::UnitsList(const char* unitCategory)
301{
302 G4String retStr;
304 size_t i;
305 for(i=0;i<UTbl.size();i++)
306 { if(UTbl[i]->GetName()==unitCategory) break; }
307 if(i==UTbl.size())
308 {
309 G4cerr << "Unit category <" << unitCategory << "> is not defined." << G4endl;
310 return retStr;
311 }
312 G4UnitsContainer& UCnt = UTbl[i]->GetUnitsList();
313 retStr = UCnt[0]->GetSymbol();
314 G4int je = UCnt.size();
315 for(G4int j=1;j<je;j++)
316 {
317 retStr += " ";
318 retStr += UCnt[j]->GetSymbol();
319 }
320 for(G4int k=0;k<je;k++)
321 {
322 retStr += " ";
323 retStr += UCnt[k]->GetName();
324 }
325 return retStr;
326}
327
329{
330 G4cout << G4endl;
331 G4cout << G4endl;
332 if(commandPath(commandPath.length()-1)!='/')
333 { G4cout << "Command " << commandPath << G4endl; }
334 G4cout << "Guidance :" << G4endl;
335 G4int n_guidanceEntry = commandGuidance.size();
336 for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ )
337 { G4cout << commandGuidance[i_thGuidance] << G4endl; }
338 if( ! rangeString.isNull() )
339 { G4cout << " Range of parameters : " << rangeString << G4endl; }
340 G4int n_parameterEntry = parameter.size();
341 if( n_parameterEntry > 0 )
342 {
343 for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ )
344 { parameter[i_thParameter]->List(); }
345 }
346 G4cout << G4endl;
347}
348
350{
351 G4String vl = "0";
352 if(boolVal) vl = "1";
353 return vl;
354}
355
357{
358 std::ostringstream os;
359 os << intValue;
360 G4String vl = os.str();
361 return vl;
362}
363
365{
366 std::ostringstream os;
367 os << doubleValue;
368 G4String vl = os.str();
369 return vl;
370}
371
372G4String G4UIcommand::ConvertToString(G4double doubleValue,const char* unitName)
373{
374 G4String unt = unitName;
375 G4double uv = ValueOf(unitName);
376
377 std::ostringstream os;
378 os << doubleValue/uv << " " << unitName;
379 G4String vl = os.str();
380 return vl;
381}
382
384{
385 std::ostringstream os;
386 os << vec.x() << " " << vec.y() << " " << vec.z();
387 G4String vl = os.str();
388 return vl;
389}
390
392{
393 G4String unt = unitName;
394 G4double uv = ValueOf(unitName);
395
396 std::ostringstream os;
397 os << vec.x()/uv << " " << vec.y()/uv << " " << vec.z()/uv
398 << " " << unitName;
399 G4String vl = os.str();
400 return vl;
401}
402
404{
405 G4String v = st;
406 v.toUpper();
407 G4bool vl = false;
408 if( v=="Y" || v=="YES" || v=="1" || v=="T" || v=="TRUE" )
409 { vl = true; }
410 return vl;
411}
412
414{
415 G4int vl;
416 std::istringstream is(st);
417 is >> vl;
418 return vl;
419}
420
422{
423 G4double vl;
424 std::istringstream is(st);
425 is >> vl;
426 return vl;
427}
428
430{
431 G4double vl;
432 char unts[30];
433
434 std::istringstream is(st);
435 is >> vl >> unts;
436 G4String unt = unts;
437
438 return (vl*ValueOf(unt));
439}
440
442{
443 G4double vx;
444 G4double vy;
445 G4double vz;
446 std::istringstream is(st);
447 is >> vx >> vy >> vz;
448 return G4ThreeVector(vx,vy,vz);
449}
450
452{
453 G4double vx;
454 G4double vy;
455 G4double vz;
456 char unts[30];
457 std::istringstream is(st);
458 is >> vx >> vy >> vz >> unts;
459 G4String unt = unts;
460 G4double uv = ValueOf(unt);
461 return G4ThreeVector(vx*uv,vy*uv,vz*uv);
462}
463
464
465// ----- the following is used by CheckNewValue() ------------
466
467
468#include <ctype.h> // isalpha(), toupper()
469
470//#include "checkNewValue_debug.icc"
471//#define DEBUG 1
472
474CheckNewValue(const char * newValue)
475{
476 yystype result;
477 // if( TypeCheck(newValue) == 0 ) return 1;
478 if( ! rangeString.isNull() )
479 { if( RangeCheck(newValue) == 0 ) return fParameterOutOfRange; }
480 return 0; // succeeded
481}
482
483// ------------------ type check routines -------------------
484
485G4int G4UIcommand::
486TypeCheck(const char * t)
487{
488 G4String aNewValue;
489 char type;
490 std::istringstream is(t);
491 for (unsigned i=0; i< parameter.size(); i++) {
492 is >> aNewValue;
493 type = toupper(parameter[i]->GetParameterType());
494 switch ( type ) {
495 case 'D':
496 if( IsDouble(aNewValue)==0 ){
497 G4cerr << aNewValue << ": double value expected."
498 << G4endl;
499 return 0;
500 } break;
501 case 'I':
502 if( IsInt(aNewValue,20)==0 ){
503 G4cerr <<aNewValue<<": integer expected."
504 <<G4endl;
505 return 0;
506 } break;
507 case 'S':
508 break;
509 case 'B':
510 aNewValue.toUpper();
511 if (aNewValue == "Y" || aNewValue == "N"
512 ||aNewValue == "YES" || aNewValue == "NO"
513 ||aNewValue == "1" || aNewValue == "0"
514 ||aNewValue == "T" || aNewValue == "F"
515 ||aNewValue == "TRUE" || aNewValue == "FALSE")
516 return 1;
517 else return 0;
518 break;
519 default: ;
520 }
521 }
522 return 1;
523}
524
525
526G4int G4UIcommand::
527IsInt(const char* buf, short maxDigits)
528{
529 const char* p= buf;
530 G4int length=0;
531 if( *p == '+' || *p == '-') { ++p; }
532 if( isdigit( (G4int)(*p) )) {
533 while( isdigit( (G4int)(*p) )) { ++p; ++length; }
534 if( *p == '\0' ) {
535 if( length > maxDigits) {
536 G4cerr <<"digit length exceeds"<<G4endl;
537 return 0;
538 }
539 return 1;
540 } else {
541 // G4cerr <<"illegal character after int:"<<buf<<G4endl;
542 }
543 } else {
544 // G4cerr <<"illegal int:"<<buf<<G4endl;
545 }
546 return 0;
547}
548
549
550G4int G4UIcommand::
551ExpectExponent(const char* str) // used only by IsDouble()
552{
553 G4int maxExplength;
554 if( IsInt( str, maxExplength=7 )) return 1;
555 else return 0;
556}
557
558
559G4int G4UIcommand::
560IsDouble(const char* buf)
561{
562 const char* p= buf;
563 switch( *p) {
564 case '+': case '-': ++p;
565 if( isdigit(*p) ) {
566 while( isdigit( (G4int)(*p) )) { ++p; }
567 switch ( *p ) {
568 case '\0': return 1;
569 // break;
570 case 'E': case 'e':
571 return ExpectExponent(++p );
572 // break;
573 case '.': ++p;
574 if( *p == '\0' ) return 1;
575 if( *p == 'e' || *p =='E' ) return ExpectExponent(++p );
576 if( isdigit(*p) ) {
577 while( isdigit( (G4int)(*p) )) { ++p; }
578 if( *p == '\0' ) return 1;
579 if( *p == 'e' || *p =='E') return ExpectExponent(++p);
580 } else return 0; break;
581 default: return 0;
582 }
583 }
584 if( *p == '.' ) { ++p;
585 if( isdigit(*p) ) {
586 while( isdigit( (G4int)(*p) )) { ++p; }
587 if( *p == '\0' ) return 1;
588 if( *p == 'e' || *p =='E') return ExpectExponent(++p);
589 }
590 }
591 break;
592 case '.': ++p;
593 if( isdigit(*p) ) {
594 while( isdigit( (G4int)(*p) )) { ++p; }
595 if( *p == '\0' ) return 1;
596 if( *p == 'e' || *p =='E' ) return ExpectExponent(++p);
597 } break;
598 default: // digit is expected
599 if( isdigit(*p) ) {
600 while( isdigit( (G4int)(*p) )) { ++p; }
601 if( *p == '\0' ) return 1;
602 if( *p == 'e' || *p =='E') return ExpectExponent(++p);
603 if( *p == '.' ) { ++p;
604 if( *p == '\0' ) return 1;
605 if( *p == 'e' || *p =='E') return ExpectExponent(++p);
606 if( isdigit(*p) ) {
607 while( isdigit( (G4int)(*p) )) { ++p; }
608 if( *p == '\0' ) return 1;
609 if( *p == 'e' || *p =='E') return ExpectExponent(++p);
610 }
611 }
612 }
613 }
614 return 0;
615}
616
617
618// ------------------ range Check routines -------------------
619G4int G4UIcommand::
620RangeCheck(const char* t) {
621 yystype result;
622 char type;
623 bp = 0; // reset buffer pointer for G4UIpGetc()
624 std::istringstream is(t);
625 for (unsigned i=0; i< parameter.size(); i++) {
626 type= toupper(parameter[i]->GetParameterType());
627 switch ( type ) {
628 case 'D': is >> newVal[i].D; break;
629 case 'I': is >> newVal[i].I; break;
630 case 'S':
631 case 'B':
632 default: ;
633 }
634 }
635 // PrintToken(); // Print tokens (consumes all tokens)
636 token= Yylex();
637 result = Expression();
638
639 if( paramERR == 1 ) return 0;
640 if( result.type != CONSTINT) {
641 G4cerr << "Illegal Expression in parameter range." << G4endl;
642 return 0;
643 }
644 if ( result.I ) return 1;
645 G4cerr << "parameter out of range: "<< rangeString << G4endl;
646 return 0;
647}
648
649// ------------------ syntax node functions ------------------
650yystype G4UIcommand::
651Expression(void)
652{
653 yystype result;
654 #ifdef DEBUG
655 G4cerr << " Expression()" << G4endl;
656 #endif
657 result = LogicalORExpression();
658 return result;
659}
660
661yystype G4UIcommand::
662LogicalORExpression(void)
663{
664 yystype result;
665 yystype p;
666 p = LogicalANDExpression();
667 if( token != LOGICALOR) return p;
668 if( p.type == CONSTSTRING || p.type == IDENTIFIER ) {
669 G4cerr << "Parameter range: illegal type at '||'" << G4endl;
670 paramERR = 1;
671 }
672 result.I = p.I;
673 while (token == LOGICALOR)
674 {
675 token = Yylex();
676 p = LogicalANDExpression();
677 if( p.type == CONSTSTRING || p.type == IDENTIFIER ) {
678 G4cerr << "Parameter range: illegal type at '||'" <<G4endl;
679 paramERR = 1;
680 }
681 switch (p.type) {
682 case CONSTINT:
683 result.I += p.I;
684 result.type = CONSTINT; break;
685 case CONSTDOUBLE:
686 result.I += (p.D != 0.0);
687 result.type = CONSTINT; break;
688 default:
689 G4cerr << "Parameter range: unknown type"<<G4endl;
690 paramERR = 1;
691 }
692 }
693 return result;
694}
695
696yystype G4UIcommand::
697LogicalANDExpression(void)
698{
699 yystype result;
700 yystype p;
701 p = EqualityExpression();
702 if( token != LOGICALAND) return p;
703 if( p.type == CONSTSTRING || p.type == IDENTIFIER ) {
704 G4cerr << "Parameter range: illegal type at '&&'" << G4endl;
705 paramERR = 1;
706 }
707 result.I = p.I;
708 while (token == LOGICALAND)
709 {
710 token = Yylex();
711 p = EqualityExpression();
712 if( p.type == CONSTSTRING || p.type == IDENTIFIER ) {
713 G4cerr << "Parameter range: illegal type at '&&'" << G4endl;
714 paramERR = 1;
715 }
716 switch (p.type) {
717 case CONSTINT:
718 result.I *= p.I;
719 result.type = CONSTINT; break;
720 case CONSTDOUBLE:
721 result.I *= (p.D != 0.0);
722 result.type = CONSTINT; break;
723 default:
724 G4cerr << "Parameter range: unknown type."<< G4endl;
725 paramERR = 1;
726 }
727 }
728 return result;
729}
730
731
732yystype G4UIcommand::
733EqualityExpression(void)
734{
735 yystype arg1, arg2;
736 G4int operat;
737 yystype result;
738 #ifdef DEBUG
739 G4cerr << " EqualityExpression()" <<G4endl;
740 #endif
741 result = RelationalExpression();
742 if( token==EQ || token==NE ) {
743 operat = token;
744 token = Yylex();
745 arg1 = result;
746 arg2 = RelationalExpression();
747 result.I = Eval2( arg1, operat, arg2 ); // semantic action
748 result.type = CONSTINT;
749 #ifdef DEBUG
750 G4cerr << " return code of Eval2(): " << result.I <<G4endl;
751 #endif
752 } else {
753 if (result.type != CONSTINT && result.type != CONSTDOUBLE) {
754 G4cerr << "Parameter range: error at EqualityExpression"
755 << G4endl;
756 paramERR = 1;
757 }
758 }
759 return result;
760}
761
762
763yystype G4UIcommand::
764RelationalExpression(void)
765{
766 yystype arg1, arg2;
767 G4int operat;
768 yystype result;
769 #ifdef DEBUG
770 G4cerr << " RelationalExpression()" <<G4endl;
771 #endif
772
773 arg1 = AdditiveExpression();
774 if( token==GT || token==GE || token==LT || token==LE ) {
775 operat = token;
776 token = Yylex();
777 arg2 = AdditiveExpression();
778 result.I = Eval2( arg1, operat, arg2 ); // semantic action
779 result.type = CONSTINT;
780 #ifdef DEBUG
781 G4cerr << " return code of Eval2(): " << result.I << G4endl;
782 #endif
783 } else {
784 result = arg1;
785 }
786 #ifdef DEBUG
787 G4cerr <<" return RelationalExpression()"<< G4endl;
788 #endif
789 return result;
790}
791
792yystype G4UIcommand::
793AdditiveExpression(void)
794{ yystype result;
795 result = MultiplicativeExpression();
796 if( token != '+' && token != '-' ) return result;
797 G4cerr << "Parameter range: operator "
798 << (char)token
799 << " is not supported." << G4endl;
800 paramERR = 1;
801 return result;
802}
803
804yystype G4UIcommand::
805MultiplicativeExpression(void)
806{ yystype result;
807 result = UnaryExpression();
808 if( token != '*' && token != '/' && token != '%' ) return result;
809 G4cerr << "Parameter range: operator "
810 << (char)token
811 << " is not supported." << G4endl;
812 paramERR = 1;
813 return result;
814}
815
816yystype G4UIcommand::
817UnaryExpression(void)
818{
819 yystype result;
820 yystype p;
821 #ifdef DEBUG
822 G4cerr <<" UnaryExpression"<< G4endl;
823 #endif
824 switch(token) {
825 case '-':
826 token = Yylex();
827 p = UnaryExpression();
828 if (p.type == CONSTINT) {
829 result.I = - p.I;
830 result.type = CONSTINT;
831 }
832 if (p.type == CONSTDOUBLE) {
833 result.D = - p.D;
834 result.type = CONSTDOUBLE;
835 } break;
836 case '+':
837 token = Yylex();
838 result = UnaryExpression(); break;
839 case '!':
840 token = Yylex();
841 G4cerr << "Parameter range error: "
842 << "operator '!' is not supported (sorry)."
843 << G4endl;
844 paramERR = 1;
845 result = UnaryExpression(); break;
846 default:
847 result = PrimaryExpression();
848 }
849 return result;
850}
851
852
853yystype G4UIcommand::
854PrimaryExpression(void)
855{
856 yystype result;
857 #ifdef DEBUG
858 G4cerr <<" primary_exp"<<G4endl;
859 #endif
860 switch (token) {
861 case IDENTIFIER:
862 result.S = yylval.S;
863 result.type = token;
864 token = Yylex(); break;
865 case CONSTINT:
866 result.I = yylval.I;
867 result.type = token;
868 token= Yylex(); break;
869 case CONSTDOUBLE:
870 result.D = yylval.D;
871 result.type = token;
872 token = Yylex(); break;
873 case '(' :
874 token= Yylex();
875 result = Expression();
876 if( token != ')' ) {
877 G4cerr << " ')' expected" << G4endl;
878 paramERR = 1;
879 }
880 token = Yylex();
881 break;
882 default:
883 return result;
884 }
885 return result; // never executed
886}
887
888//---------------- semantic routines ---------------------------------
889
890G4int G4UIcommand::
891Eval2(yystype arg1, G4int op, yystype arg2)
892{
893 char newValtype;
894 if( (arg1.type != IDENTIFIER) && (arg2.type != IDENTIFIER)) {
895 G4cerr << commandName
896 << ": meaningless comparison"
897 << G4endl;
898 paramERR = 1;
899 }
900
901 if( arg1.type == IDENTIFIER) {
902 unsigned i = IndexOf( arg1.S );
903 newValtype = toupper(parameter[i]->GetParameterType());
904 switch ( newValtype ) {
905 case 'I':
906 if( arg2.type == CONSTINT ) {
907 return CompareInt( newVal[i].I, op, arg2.I );
908 } else {
909 G4cerr << "integer operand expected for "
910 << rangeString
911 << '.' << G4endl;
912 } break;
913 case 'D':
914 if( arg2.type == CONSTDOUBLE ) {
915 return CompareDouble( newVal[i].D, op, arg2.D );
916 } else
917 if ( arg2.type == CONSTINT ) { // integral promotion
918 return CompareDouble( newVal[i].D, op, arg2.I );
919 } break;
920 default: ;
921 }
922 }
923 if( arg2.type == IDENTIFIER) {
924 unsigned i = IndexOf( arg2.S );
925 newValtype = toupper(parameter[i]->GetParameterType());
926 switch ( newValtype ) {
927 case 'I':
928 if( arg1.type == CONSTINT ) {
929 return CompareInt( arg1.I, op, newVal[i].I );
930 } else {
931 G4cerr << "integer operand expected for "
932 << rangeString
933 << '.' << G4endl;
934 } break;
935 case 'D':
936 if( arg1.type == CONSTDOUBLE ) {
937 return CompareDouble( arg1.D, op, newVal[i].D );
938 } else
939 if ( arg1.type == CONSTINT ) { // integral promotion
940 return CompareDouble( arg1.I, op, newVal[i].D );
941 } break;
942 default: ;
943 }
944 }
945 return 0;
946}
947
948G4int G4UIcommand::
949CompareInt(G4int arg1, G4int op, G4int arg2)
950{
951 G4int result=-1;
952 G4String opr;
953 switch (op) {
954 case GT: result = ( arg1 > arg2); opr= ">" ; break;
955 case GE: result = ( arg1 >= arg2); opr= ">="; break;
956 case LT: result = ( arg1 < arg2); opr= "<" ; break;
957 case LE: result = ( arg1 <= arg2); opr= "<="; break;
958 case EQ: result = ( arg1 == arg2); opr= "=="; break;
959 case NE: result = ( arg1 != arg2); opr= "!="; break;
960 default:
961 G4cerr << "Parameter range: error at CompareInt" << G4endl;
962 paramERR = 1;
963 }
964 #ifdef DEBUG
965 G4cerr << "CompareInt "
966 << arg1 << " " << opr << arg2
967 << " result: " << result
968 << G4endl;
969 #endif
970 return result;
971}
972
973G4int G4UIcommand::
974CompareDouble(G4double arg1, G4int op, G4double arg2)
975{
976 G4int result=-1;
977 G4String opr;
978 switch (op) {
979 case GT: result = ( arg1 > arg2); opr= ">"; break;
980 case GE: result = ( arg1 >= arg2); opr= ">="; break;
981 case LT: result = ( arg1 < arg2); opr= "<"; break;
982 case LE: result = ( arg1 <= arg2); opr= "<="; break;
983 case EQ: result = ( arg1 == arg2); opr= "=="; break;
984 case NE: result = ( arg1 != arg2); opr= "!="; break;
985 default:
986 G4cerr << "Parameter range: error at CompareDouble"
987 << G4endl;
988 paramERR = 1;
989 }
990 #ifdef DEBUG
991 G4cerr << "CompareDouble "
992 << arg1 <<" " << opr << " "<< arg2
993 << " result: " << result
994 << G4endl;
995 #endif
996 return result;
997}
998
999unsigned G4UIcommand::
1000IndexOf(const char* nam)
1001{
1002 unsigned i;
1003 G4String pname;
1004 for( i=0; i<parameter.size(); i++)
1005 {
1006 pname = parameter[i]-> GetParameterName();
1007 if( pname == nam ) {
1008 return i;
1009 }
1010 }
1011 paramERR = 1;
1012 G4cerr << "parameter name:"<<nam<<" not found."<< G4endl;
1013 return 0;
1014}
1015
1016
1017unsigned G4UIcommand::
1018IsParameter(const char* nam)
1019{
1020 G4String pname;
1021 for(unsigned i=0; i<parameter.size(); i++)
1022 {
1023 pname = parameter[i]-> GetParameterName();
1024 if( pname == nam ) return 1;
1025 }
1026 return 0;
1027}
1028
1029
1030// --------------------- utility functions --------------------------
1031
1032tokenNum G4UIcommand::
1033Yylex() // reads input and returns token number, KR486
1034{ // (returns EOF)
1035 G4int c;
1036 G4String buf;
1037
1038 while(( c= G4UIpGetc())==' '|| c=='\t' || c== '\n' )
1039 ;
1040 if (c== EOF)
1041 return (tokenNum)EOF; // KR488
1042 buf= "";
1043 if (isdigit(c) || c== '.') { // I or D
1044 do {
1045 buf += G4String((unsigned char)c);
1046 c=G4UIpGetc();
1047 } while (c=='.' || isdigit(c) ||
1048 c=='e' || c=='E' || c=='+' || c=='-');
1049 G4UIpUngetc(c);
1050 const char* t = buf;
1051 std::istringstream is(t);
1052 if ( IsInt(buf.data(),20) ) {
1053 is >> yylval.I;
1054 return CONSTINT;
1055 } else
1056 if ( IsDouble(buf.data()) ) {
1057 is >> yylval.D;
1058 return CONSTDOUBLE;
1059 } else {
1060 G4cerr << buf<<": numeric format error."<<G4endl;
1061 }
1062 }
1063 buf="";
1064 if (isalpha(c)|| c=='_') { // IDENTIFIER
1065 do {
1066 buf += G4String((unsigned char)c);
1067 } while ((c=G4UIpGetc()) != EOF && (isalnum(c) || c=='_'));
1068 G4UIpUngetc(c);
1069 if( IsParameter(buf) ) {
1070 yylval.S =buf;
1071 return IDENTIFIER;
1072 } else {
1073 G4cerr << buf << " is not a parameter name."<< G4endl;
1074 paramERR = 1;
1075 }
1076 }
1077 switch (c) {
1078 case '>': return (tokenNum) Follow('=', GE, GT);
1079 case '<': return (tokenNum) Follow('=', LE, LT);
1080 case '=': return (tokenNum) Follow('=', EQ, '=');
1081 case '!': return (tokenNum) Follow('=', NE, '!');
1082 case '|': return (tokenNum) Follow('|', LOGICALOR, '|');
1083 case '&': return (tokenNum) Follow('&', LOGICALAND, '&');
1084 default:
1085 return (tokenNum) c;
1086 }
1087}
1088
1089
1090G4int G4UIcommand::
1091Follow(G4int expect, G4int ifyes, G4int ifno)
1092{
1093 G4int c = G4UIpGetc();
1094 if ( c== expect)
1095 return ifyes;
1096 G4UIpUngetc(c);
1097 return ifno;
1098}
1099
1100//------------------ low level routines -----------------------------
1101G4int G4UIcommand::
1102G4UIpGetc() { // emulation of getc()
1103 G4int length = rangeString.length();
1104 if( bp < length)
1105 return rangeString(bp++);
1106 else
1107 return EOF;
1108}
1109G4int G4UIcommand::
1110G4UIpUngetc(G4int c) { // emulation of ungetc()
1111 if (c<0) return -1;
1112 if (bp >0 && c == rangeString(bp-1)) {
1113 --bp;
1114 } else {
1115 G4cerr << "G4UIpUngetc() failed." << G4endl;
1116 G4cerr << "bp="<<bp <<" c="<<c
1117 << " pR(bp-1)=" << rangeString(bp-1)
1118 << G4endl;
1119 paramERR = 1;
1120 return -1;
1121 }
1122 return 0;
1123}
@ GT
Definition: Evaluator.cc:66
@ LT
Definition: Evaluator.cc:66
@ NE
Definition: Evaluator.cc:66
@ GE
Definition: Evaluator.cc:66
@ LE
Definition: Evaluator.cc:66
@ EQ
Definition: Evaluator.cc:66
G4ApplicationState
@ G4State_EventProc
@ G4State_Init
@ G4State_Idle
@ G4State_Abort
@ G4State_GeomClosed
@ G4State_PreInit
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
@ fParameterUnreadable
@ fParameterOutOfRange
tokenNum
Definition: G4UItokenNum.hh:37
@ LOGICALOR
Definition: G4UItokenNum.hh:51
@ IDENTIFIER
Definition: G4UItokenNum.hh:39
@ LOGICALAND
Definition: G4UItokenNum.hh:52
@ CONSTSTRING
Definition: G4UItokenNum.hh:43
@ CONSTINT
Definition: G4UItokenNum.hh:40
@ CONSTDOUBLE
Definition: G4UItokenNum.hh:41
std::vector< G4UnitsCategory * > G4UnitsTable
Definition: G4UnitsTable.hh:60
std::vector< G4UnitDefinition * > G4UnitsContainer
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
double z() const
double x() const
double y() const
G4ApplicationState GetCurrentState() const
static G4StateManager * GetStateManager()
G4String & remove(str_size)
G4String & append(const G4String &)
str_size index(const char *, G4int pos=0) const
G4bool isNull() const
void toUpper()
const char * data() const
G4int last(char) const
static G4ThreeVector ConvertTo3Vector(const char *st)
Definition: G4UIcommand.cc:441
G4int operator==(const G4UIcommand &right) const
Definition: G4UIcommand.cc:94
static G4String CategoryOf(const char *unitName)
Definition: G4UIcommand.cc:295
static G4double ValueOf(const char *unitName)
Definition: G4UIcommand.cc:288
virtual ~G4UIcommand()
Definition: G4UIcommand.cc:83
virtual G4int DoIt(G4String parameterList)
Definition: G4UIcommand.cc:104
static G4String ConvertToString(G4bool boolVal)
Definition: G4UIcommand.cc:349
const G4String & GetCommandPath() const
Definition: G4UIcommand.hh:134
G4int operator!=(const G4UIcommand &right) const
Definition: G4UIcommand.cc:99
G4int CheckNewValue(const char *newValue)
Definition: G4UIcommand.cc:474
G4bool IsAvailable()
Definition: G4UIcommand.cc:269
static G4int ConvertToInt(const char *st)
Definition: G4UIcommand.cc:413
static G4String UnitsList(const char *unitCategory)
Definition: G4UIcommand.cc:300
static G4bool ConvertToBool(const char *st)
Definition: G4UIcommand.cc:403
static G4double ConvertToDouble(const char *st)
Definition: G4UIcommand.cc:421
static G4double ConvertToDimensionedDouble(const char *st)
Definition: G4UIcommand.cc:429
virtual void List()
Definition: G4UIcommand.cc:328
void AvailableForStates(G4ApplicationState s1)
Definition: G4UIcommand.cc:219
static G4ThreeVector ConvertToDimensioned3Vector(const char *st)
Definition: G4UIcommand.cc:451
G4String GetCurrentValue()
Definition: G4UIcommand.cc:214
void AddNewCommand(G4UIcommand *newCommand)
Definition: G4UImanager.cc:220
void RemoveCommand(G4UIcommand *aCommand)
Definition: G4UImanager.cc:225
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
virtual G4String GetCurrentValue(G4UIcommand *command)
virtual void SetNewValue(G4UIcommand *command, G4String newValue)
static G4double GetValueOf(const G4String &)
static G4String GetCategory(const G4String &)
static G4UnitsTable & GetUnitsTable()
G4int I
Definition: G4UItokenNum.hh:64
tokenNum type
Definition: G4UItokenNum.hh:62
G4double D
Definition: G4UItokenNum.hh:63
G4String S
Definition: G4UItokenNum.hh:66