JaRMoS  1.1
Java Reduced Model Simulations
 All Classes Namespaces Files Functions Variables Enumerator Groups Pages
GetPot.java
Go to the documentation of this file.
1 package rb;
2 
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.PushbackInputStream;
6 import java.util.Enumeration;
7 import java.util.StringTokenizer;
8 import java.util.Vector;
9 
31 public class GetPot {
32 
33  // variable structure
34  public class variable {
35  // (*) constructor
36  variable(String Name, String Value) {
37  name = Name;
38  take(Value);
39  }
40 
42  name = "";
43  value = new String[1];
44  value[0] = "";
45  original = "";
46  }
47 
48  // (*) get a specific element in the string vector
49  String get_element(int Idx) {
50  if (Idx < 0 || Idx > value.length)
51  return new String("");
52  else
53  return value[Idx];
54  }
55 
56  void take(String Value) {
57  original = Value;
58  StringTokenizer st = new StringTokenizer(Value);
59  value = new String[st.countTokens()];
60  for (int i = 0; st.hasMoreTokens(); i++)
61  value[i] = st.nextToken();
62  }
63 
64  // (*) data memebers
65  String name; // identifier of variable
66  String value[]; // value of variable stored in vector
67  String original; // value of variable as given on command line
68  };
69 
70  String prefix; // prefix indicating section for search
71  String section; // section for dollar bracket parsing
72  Vector<String> argv; // String[]
73  Vector<String> section_list;
74  int cursor;
75  Vector<Integer> idx_nominus; // int[]
77  boolean search_loop_f;
78  boolean search_failed_f;
79  Vector<variable> variables; // class variable
80 
81  // (*) constructor
82  GetPot(String argv_[], String applicationName) {
83  prefix = "";
84  cursor = 0;
85  nominus_cursor = -1;
86  search_loop_f = true;
87  search_failed_f = false;
88 
89  Vector<String> __argv = new Vector<String>();
90  idx_nominus = new Vector<Integer>();
91  variables = new Vector<variable>();
92  section_list = new Vector<String>();
93 
94  // in java the argv[0] does not contain the application name
95  // => append application name to argv vector by hand
96 
97  for (int i = 0; i < argv_.length; i++) {
98  String copied_str = new String(argv_[i]);
99  __argv.addElement(copied_str);
100  }
101 
102  argv = new Vector<String>();
103  __argv.insertElementAt(applicationName, 0);
104  __parse_argument_vector(__argv);
105  }
106 
107  // GetPot(Context c_in, String FileName, boolean isAssetFile_in) {
108  //
109  // androidContext = c_in; // Added Android Context for file I/O
110  // isAssetFile = isAssetFile_in; // Added boolean for app
111  //
112  // prefix = "";
113  // cursor = 0;
114  // nominus_cursor = -1;
115  // search_loop_f = true;
116  // search_failed_f = false;
117  //
118  // Vector<String> __argv = new Vector<String>();
119  // idx_nominus = new Vector<Integer>();
120  // variables = new Vector<variable>();
121  // section_list = new Vector<String>();
122  //
123  // __argv = read_in_file(FileName);
124  //
125  // argv = new Vector<String>();
126  // __argv.insertElementAt(FileName, 0);
127  // __parse_argument_vector(__argv);
128  // }
129 
141  public GetPot(InputStream in, String filename) {
142 
143  prefix = "";
144  cursor = 0;
145  nominus_cursor = -1;
146  search_loop_f = true;
147  search_failed_f = false;
148 
149  Vector<String> __argv = new Vector<String>();
150  idx_nominus = new Vector<Integer>();
151  variables = new Vector<variable>();
152  section_list = new Vector<String>();
153 
154  __argv = read_in_stream(new PushbackInputStream(in));
155 
156  // Dunno what that is for, but added an extra argument to have it set, too
157  argv = new Vector<String>();
158  __argv.insertElementAt(filename, 0);
159  __parse_argument_vector(__argv);
160  }
161 
162  void __parse_argument_vector(Vector<String> _argv) {
163  // build internal database
164  // 1) array with no-minus arguments (usually used as filenames)
165  // 2) section label treatment
166  // 3) variable assignments:
167  // 'variable name' '=' number | string
168  int i = 0;
169  section = "";
170  Vector<String> section_stack = new Vector<String>();
171  if (_argv.size() < 1)
172  return;
173 
174  for (Enumeration<String> arge = _argv.elements(); arge.hasMoreElements(); i++) {
175  String arg = arge.nextElement();
176 
177  if (i == 0) {
178  argv.addElement(arg);
179  continue;
180  }
181  if (arg.length() == 0)
182  continue;
183 
184  // -- [section] labels
185  if (arg.length() > 1 && arg.charAt(0) == '[' && arg.charAt(arg.length() - 1) == ']') {
186  String name = DBE_expand_string(arg.substring(1, arg.length() - 1));
187  // String name = arg.substring(1, arg.length()-1);
188  section = process_section_label(name, section_stack);
189  // new section --> append to list of sections
190  if (section_list.indexOf(section) == -1)
191  if (section.length() != 0)
192  section_list.addElement(section);
193  argv.addElement(arg);
194  } else {
195  arg = section + DBE_expand_string(arg);
196  argv.addElement(arg);
197  }
198 
199  // 1) separate array for nominus arguments
200  if (arg.charAt(0) != '-')
201  idx_nominus.addElement(new Integer(i));
202 
203  // 2) variables: does _argv[i] contain a '=' operator ?
204  int k = arg.indexOf('=');
205  if (k > 0) {
206  variable Var = find_variable(arg.substring(0, k));
207  if (Var.name.compareTo("") == 0)
208  variables.addElement(new variable(arg.substring(0, k), arg.substring(k + 1)));
209  else
210  Var.take(arg.substring(k + 1));
211  }
212  }
213  }
214 
215  // // file parsing
216  // Vector<String> read_in_file(String filename) {
217  // Vector<String> Empty = new Vector<String>();
218  // try {
219  // // InputStream i = new FileInputStream(filename);
220  // InputStream i;
221  // if (!isAssetFile) { // Modified for Android
222  // i = androidContext.openFileInput(filename);
223  // } else {
224  // i = androidContext.getAssets().open(filename);
225  // }
226  // if (i.available() == 0)
227  // return Empty;
228  // // argv[0] == the filename of the file that was read in
229  // return read_in_stream(new PushbackInputStream(i));
230  // } catch (FileNotFoundException ID_10T) {
231  // return Empty;
232  // } catch (IOException ID_20T) {
233  // return Empty;
234  // }
235  // }
236 
237  Vector<String> read_in_stream(PushbackInputStream istr) {
238  Vector<String> brute_tokens = new Vector<String>();
239  String token;
240  Vector<String> arglist = new Vector<String>();
241 
242  while (true) {
243  if (__skip_whitespace(istr) == -1)
244  break;
245  token = __get_next_token(istr);
246  if (token.length() == 0)
247  break;
248  brute_tokens.addElement(token);
249  }
250 
251  // for(int i=0; i<brute_tokens.size() ; i++)
252  // System.out.println((String)(brute_tokens.elementAt(i)));
253 
254  // -- reduce expressions of token1'='token2 to a single
255  // string 'token1=token2'
256  // -- copy everything into 'result'
257  // -- arguments preceded by something like '[' name ']' (section)
258  // produce a second copy of each argument with a prefix '[name]argument'
259  int i1 = 0;
260  int i2 = 1;
261  int i3 = 2;
262 
263  while (i1 < brute_tokens.size()) {
264  String SRef = brute_tokens.elementAt(i1);
265  // 1) concatinate 'abcdef' '=' 'efgasdef' to 'abcdef=efgasdef'
266  // note: java.lang.String: substring(a,b) = from a to b-1
267  // C++ string: substr(a,b) = from a to a + b
268  if (i2 < brute_tokens.size() && brute_tokens.elementAt(i2).charAt(0) == '=') {
269  if (i3 >= brute_tokens.size())
270  arglist.addElement(brute_tokens.elementAt(i1) + brute_tokens.elementAt(i2));
271  else
272  arglist.addElement(brute_tokens.elementAt(i1) + brute_tokens.elementAt(i2)
273  + brute_tokens.elementAt(i3));
274 
275  i1 = i3 + 1;
276  i2 = i3 + 2;
277  i3 = i3 + 3;
278  continue;
279  } else {
280  arglist.addElement(SRef);
281  i1 = i2;
282  i2 = i3;
283  i3++;
284  }
285  }
286  return arglist;
287  }
288 
289  int __skip_whitespace(PushbackInputStream istr) {
290  try {
291  while (true) {
292  int tmp = istr.read(); // read first character out of stream
293  if (tmp == -1)
294  return -1;
295  while ((char) tmp == ' ' || (char) tmp == '\t' || (char) tmp == '\n') {
296  tmp = istr.read();
297  if (tmp == -1)
298  return -1;
299  }
300 
301  // found a non whitespace
302  if ((char) tmp == '#') {
303  // comment => skip until end of line
304  do {
305  tmp = istr.read();
306  if (tmp == -1)
307  return -1;
308  } while ((char) tmp != '\n');
309 
310  istr.unread(tmp);
311  continue;
312  } else {
313  // go back to last mark
314  istr.unread(tmp);
315  return 1;
316  }
317  }
318  } catch (IOException ID_10T) {
319  }
320  return 1;
321  }
322 
323  String __get_next_token(PushbackInputStream istr) {
324  // get next concatinates string token. consider quotes that embrace
325  // whitespaces
326  try {
327  String token = new String("");
328  int tmp0 = 0;
329  char tmp = 0;
330  char last_letter = 0;
331  while (true) {
332  last_letter = tmp;
333  tmp0 = istr.read();
334  tmp = (char) tmp0;
335  if (tmp == -1 || ((tmp == ' ' || tmp == '\t' || tmp == '\n') && last_letter != '\\')) {
336  return token;
337  } else if (tmp == '\'' && last_letter != '\\') {
338  // QUOTES: un-backslashed quotes => it's a string
339  token += __get_string(istr);
340  continue;
341  } else if (tmp == '{' && last_letter == '$') {
342  token += '{' + __get_until_closing_bracket(istr);
343  continue;
344  } else if (tmp == '$' && last_letter == '\\') {
345  token += tmp;
346  tmp = 0; // so that last_letter will become = 0, not '$';
347  continue;
348  } else if (tmp == '\\' && last_letter != '\\')
349  continue; // don't append un-backslashed backslashes
350  token += tmp;
351  }
352  } catch (IOException ID_10T) {
353  }
354  return "";
355  }
356 
357  String __get_string(PushbackInputStream istr) {
358  // parse input until next matching '
359 
360  try {
361  String str = new String("");
362  int tmp0 = 0;
363  char tmp = 0;
364  char last_letter = 0;
365  while (true) {
366  last_letter = tmp;
367  tmp0 = istr.read();
368  tmp = (char) tmp0;
369  if (tmp0 == -1)
370  return str;
371  // un-backslashed quotes => it's the end of the string
372  else if (tmp == '\'' && last_letter != '\\')
373  return str;
374  else if (tmp == '\\' && last_letter != '\\')
375  continue; // don't append
376 
377  str += tmp;
378  }
379  // return str;
380  } catch (IOException ID_10T) {
381  }
382  return "";
383  }
384 
385  String __get_until_closing_bracket(PushbackInputStream istr) {
386  try {
387  // parse input until next matching }
388  String str = new String("");
389  int tmp0 = 0;
390  char tmp = 0;
391  char last_letter = 0;
392  int brackets = 1;
393  while (true) {
394  last_letter = tmp;
395  tmp0 = istr.read();
396  tmp = (char) tmp0;
397  if (tmp == -1)
398  return str;
399  else if (tmp == '{' && last_letter == '$')
400  brackets += 1;
401  else if (tmp == '}') {
402  brackets -= 1;
403  // un-backslashed brackets => it's the end of the string
404  if (brackets == 0)
405  return str + '}';
406  else if (tmp == '\\' && last_letter != '\\')
407  continue; // do not append an unbackslashed backslash
408  }
409  str += tmp;
410  }
411  } catch (IOException ID_10T) {
412  }
413  return "";
414  }
415 
416  String process_section_label(String label, Vector<String> section_stack) {
417  String sname = label;
418  // 1) subsection of actual section ('./' prefix)
419  if (sname.length() >= 2 && sname.substring(0, 2).compareTo("./") == 0) {
420  sname = sname.substring(2, sname.length());
421  }
422  // 2) subsection of parent section ('../' prefix)
423  else if (sname.length() >= 3 && sname.substring(0, 3).compareTo("../") == 0) {
424  do {
425  if (section_stack.size() != 0)
426  section_stack.removeElementAt(section_stack.size() - 1);
427  sname = sname.substring(3, sname.length());
428  } while (sname.substring(0, 3).compareTo("../") == 0);
429  }
430  // 3) subsection of the root-section
431  else {
432  // a root section
433  section_stack.removeAllElements();
434  }
435 
436  if (sname.compareTo("") != 0) {
437  // parse section name for 'slashes'
438  int i = 0;
439  while (i < sname.length()) {
440  if (sname.charAt(i) == '/') {
441  section_stack.addElement(sname.substring(0, i));
442  if (i + 1 < sname.length() - 1)
443  sname = sname.substring(i + 1, sname.length());
444  i = 0;
445  } else
446  i++;
447  }
448  section_stack.addElement(sname);
449  }
450  // else: "[]" => back to root section
451 
452  String section = new String("");
453  if (section_stack.size() != 0)
454  for (int i = 0; i < section_stack.size(); i++)
455  section += (section_stack.elementAt(i)) + "/";
456  return section;
457  }
458 
459  // (*) helper functions
460  int __convert_to_type(String S, int Default) {
461  int start_i = 0;
462  if (S.length() >= 2 && S.substring(0, 2).compareTo("0x") == 0)
463  start_i = 2;
464  else if (S.length() >= 3 && S.substring(0, 3).compareTo("-0x") == 0)
465  start_i = 3;
466  else {
467  // a normal integer, not a hex number
468  try {
469  return Integer.parseInt(S);
470  } catch (NumberFormatException ID_10T) {
471  try {
472  return (int) java.lang.Math.rint(Double.valueOf(S).doubleValue());
473  } catch (NumberFormatException ID_20T) {
474  return Default;
475  }
476  }
477  }
478 
479  // a hexadecimal number
480  int number = 0;
481  for (int i = start_i; i < S.length(); i++) {
482  int c = S.charAt(i);
483  int digit = 0;
484  if (c >= '0' && c <= '9')
485  digit = c - '0';
486  else if (c >= 'a' && c <= 'f')
487  digit = c - 'a';
488  else if (c >= 'A' && c <= 'F')
489  digit = c - 'a';
490  else
491  break;
492  number *= 16;
493  number += digit;
494  }
495  if (start_i == 2)
496  return number;
497  else
498  return -number;
499  }
500 
501  double __convert_to_type(String S, double Default) {
502  try {
503  return Double.valueOf(S).doubleValue();
504  } catch (NumberFormatException ID_10T) {
505  return Default;
506  }
507  }
508 
509  void set_prefix(String Prefix) {
510  prefix = Prefix;
511  }
512 
513  String __get_remaining_string(String String, String Start) {
514  // Checks if 'String' begins with 'Start' and returns the remaining
515  // String.
516  // Returns None if String does not begin with Start.
517 
518  // note: java.lang.String: substring(a,b) = from a to b-1
519  // C++ string: substr(a,b) = from a to a + b
520  if (Start.compareTo("") == 0)
521  return String;
522  if (String.indexOf(Start) == 0)
523  return String.substring(Start.length(), String.length());
524  else
525  return "";
526  }
527 
528  // /////////////////////////////////////////////////////////////////////////////
529  // (*) cursor oriented functions
530  // .............................................................................
531  //
532  void disable_loop() {
533  search_loop_f = false;
534  }
535 
536  void enable_loop() {
537  search_loop_f = true;
538  }
539 
540  void reset_cursor() {
541  search_failed_f = false;
542  cursor = 0;
543  }
544 
546  disable_loop();
547  reset_cursor();
548  }
549 
550  // -- search for a certain argument and set cursor to position
551  boolean search(String Option) {
552  int OldCursor = cursor;
553  String SearchTerm = prefix + Option;
554 
555  if (OldCursor >= argv.size())
556  OldCursor = argv.size() - 1;
557  search_failed_f = true;
558 
559  // (*) first loop from cursor position until end
560  for (int c = cursor; c < argv.size(); c++) {
561  if (argv.elementAt(c).compareTo(SearchTerm) == 0) {
562  cursor = c;
563  search_failed_f = false;
564  return true;
565  }
566  }
567  if (!search_loop_f)
568  return false;
569 
570  // (*) second loop from 0 to old cursor position
571  for (int c = 1; c < OldCursor; c++) {
572  if (argv.elementAt(c).compareTo(SearchTerm) == 0) {
573  cursor = c;
574  search_failed_f = false;
575  return true;
576  }
577  }
578  // in case nothing is found the cursor stays where it was
579  return false;
580  }
581 
582  boolean search(String P[]) {
583  for (int i = 0; i < P.length; i++)
584  if (search(P[i]) == true)
585  return true;
586  return false;
587  }
588 
589  boolean search(String P1, String P2) {
590  if (search(P1) == true)
591  return true;
592  else if (search(P2) == true)
593  return true;
594  else
595  return false;
596  }
597 
598  boolean search(String P1, String P2, String P3) {
599  if (search(P1, P2) == true)
600  return true;
601  else if (search(P3) == true)
602  return true;
603  else
604  return false;
605  }
606 
607  boolean search(String P1, String P2, String P3, String P4) {
608  if (search(P1, P2, P3) == true)
609  return true;
610  else if (search(P4) == true)
611  return true;
612  else
613  return false;
614  }
615 
616  boolean search(String P1, String P2, String P3, String P4, String P5) {
617  if (search(P1, P2, P3, P4) == true)
618  return true;
619  else if (search(P5) == true)
620  return true;
621  else
622  return false;
623  }
624 
625  boolean search(String P1, String P2, String P3, String P4, String P5, String P6) {
626  if (search(P1, P2, P3, P4, P5) == true)
627  return true;
628  else if (search(P6) == true)
629  return true;
630  else
631  return false;
632  }
633 
634  // /////////////////////////////////////////////////////////////////////////////
635  // (*) No operator overloading in java
636  // => give them the 'python names'
637  String getitem(int idx) {
638  if (idx < argv.size())
639  return argv.elementAt(idx);
640  else
641  return new String("");
642  }
643 
644  int get(int Idx, int Default) {
645  if (Idx >= argv.size())
646  return Default;
647  return __convert_to_type(argv.elementAt(Idx), Default);
648  }
649 
650  double get(int Idx, double Default) {
651  if (Idx >= argv.size())
652  return Default;
653  return __convert_to_type(argv.elementAt(Idx), Default);
654  }
655 
656  String get(int Idx, String Default) {
657  if (Idx >= argv.size())
658  return Default;
659  else
660  return argv.elementAt(Idx);
661  }
662 
663  int size() {
664  return argv.size();
665  }
666 
667  // -- next() function group
668  int next(int Default) {
669  if (search_failed_f)
670  return Default;
671  cursor++;
672  if (cursor >= argv.size()) {
673  cursor = argv.size();
674  return Default;
675  }
676 
677  if (prefix.compareTo("") == 0)
678  return __convert_to_type(argv.elementAt(cursor), Default);
679 
680  String Remain = __get_remaining_string(argv.elementAt(cursor), prefix);
681 
682  return Remain.compareTo("") != 0 ? __convert_to_type(Remain, Default) : Default;
683  }
684 
685  double next(double Default) {
686  if (search_failed_f)
687  return Default;
688  cursor++;
689  if (cursor >= argv.size()) {
690  cursor = argv.size();
691  return Default;
692  }
693 
694  if (prefix.compareTo("") == 0)
695  return __convert_to_type(argv.elementAt(cursor), Default);
696 
697  String Remain = __get_remaining_string(argv.elementAt(cursor), prefix);
698 
699  return Remain.compareTo("") != 0 ? __convert_to_type(Remain, Default) : Default;
700  }
701 
702  String next(String Default) {
703  if (search_failed_f)
704  return Default;
705  cursor++;
706  if (cursor >= argv.size()) {
707  cursor = argv.size();
708  return Default;
709  }
710 
711  if (prefix.compareTo("") == 0)
712  return argv.elementAt(cursor);
713 
714  String Remain = __get_remaining_string(argv.elementAt(cursor), prefix);
715 
716  return Remain.compareTo("") != 0 ? Remain : Default;
717  }
718 
719  // -- follow() function group
720  // distinct option to be searched for
721  int follow(int Default, String A1) {
722  if (search(A1) == false)
723  return Default;
724  return next(Default);
725  }
726 
727  int follow(int Default, String A[]) {
728  if (search(A) == false)
729  return Default;
730  return next(Default);
731  }
732 
733  int follow(int Default, String A1, String A2) {
734  if (search(A1, A2) == false)
735  return Default;
736  return next(Default);
737  }
738 
739  int follow(int Default, String A1, String A2, String A3) {
740  if (search(A1, A2, A3) == false)
741  return Default;
742  return next(Default);
743  }
744 
745  int follow(int Default, String A1, String A2, String A3, String A4) {
746  if (search(A1, A2, A3, A4) == false)
747  return Default;
748  return next(Default);
749  }
750 
751  int follow(int Default, String A1, String A2, String A3, String A4, String A5) {
752  if (search(A1, A2, A3, A4, A5) == false)
753  return Default;
754  return next(Default);
755  }
756 
757  int follow(int Default, String A1, String A2, String A3, String A4, String A5, String A6) {
758  if (search(A1, A2, A3, A4, A5, A6) == false)
759  return Default;
760  return next(Default);
761  }
762 
763  // /////// double
764  double follow(double Default, String A1) {
765  if (search(A1) == false)
766  return Default;
767  return next(Default);
768  }
769 
770  double follow(double Default, String A[]) {
771  if (search(A) == false)
772  return Default;
773  return next(Default);
774  }
775 
776  double follow(double Default, String A1, String A2) {
777  if (search(A1, A2) == false)
778  return Default;
779  return next(Default);
780  }
781 
782  double follow(double Default, String A1, String A2, String A3) {
783  if (search(A1, A2, A3) == false)
784  return Default;
785  return next(Default);
786  }
787 
788  double follow(double Default, String A1, String A2, String A3, String A4) {
789  if (search(A1, A2, A3, A4) == false)
790  return Default;
791  return next(Default);
792  }
793 
794  double follow(double Default, String A1, String A2, String A3, String A4, String A5) {
795  if (search(A1, A2, A3, A4, A5) == false)
796  return Default;
797  return next(Default);
798  }
799 
800  double follow(double Default, String A1, String A2, String A3, String A4, String A5, String A6) {
801  if (search(A1, A2, A3, A4, A5, A6) == false)
802  return Default;
803  return next(Default);
804  }
805 
806  // /////// String ...
807  String follow(String Default, String A1) {
808  if (search(A1) == false)
809  return Default;
810  return next(Default);
811  }
812 
813  String follow(String Default, String A[]) {
814  if (search(A) == false)
815  return Default;
816  return next(Default);
817  }
818 
819  String follow(String Default, String A1, String A2) {
820  if (search(A1, A2) == false)
821  return Default;
822  return next(Default);
823  }
824 
825  String follow(String Default, String A1, String A2, String A3) {
826  if (search(A1, A2, A3) == false)
827  return Default;
828  return next(Default);
829  }
830 
831  String follow(String Default, String A1, String A2, String A3, String A4) {
832  if (search(A1, A2, A3, A4) == false)
833  return Default;
834  return next(Default);
835  }
836 
837  String follow(String Default, String A1, String A2, String A3, String A4, String A5) {
838  if (search(A1, A2, A3, A4, A5) == false)
839  return Default;
840  return next(Default);
841  }
842 
843  String follow(String Default, String A1, String A2, String A3, String A4, String A5, String A6) {
844  if (search(A1, A2, A3, A4, A5, A6) == false)
845  return Default;
846  return next(Default);
847  }
848 
849  // (*) directly followed arguments
850  int direct_follow(int Default, String Option) {
851  String FollowStr = match_starting_string(Option);
852  if (FollowStr.compareTo("") == 0)
853  return Default;
854 
855  int Value = __convert_to_type(FollowStr, Default);
856  if (++cursor >= argv.size())
857  cursor = argv.size();
858  return Value;
859  }
860 
861  double direct_follow(double Default, String Option) {
862  String FollowStr = match_starting_string(Option);
863  if (FollowStr.compareTo("") == 0)
864  return Default;
865  double Value = __convert_to_type(FollowStr, Default);
866  if (++cursor >= argv.size())
867  cursor = argv.size();
868  return Value;
869  }
870 
871  String direct_follow(String Default, String Option) {
872  String FollowStr = match_starting_string(Option);
873  if (FollowStr.compareTo("") == 0)
874  return Default;
875  if (++cursor >= argv.size())
876  cursor = argv.size();
877  return FollowStr;
878  }
879 
880  String match_starting_string(String StartString) {
881  // pointer to the place where the string after
882  // the match inside the found argument starts.
883  // 0 no argument matches the starting string.
884  int N = StartString.length();
885  int OldCursor = cursor;
886  if (OldCursor >= argv.size())
887  OldCursor = argv.size() - 1;
888  search_failed_f = true;
889 
890  // (*) first loop from cursor position until end
891  for (int c = cursor; c < argv.size(); c++) {
892  String Arg = argv.elementAt(c);
893  if (Arg.length() >= N && Arg.substring(0, N).compareTo(StartString) == 0) {
894  cursor = c;
895  search_failed_f = false;
896  return argv.elementAt(c).substring(N);
897  }
898  }
899 
900  if (search_loop_f == false)
901  return "";
902 
903  // (*) second loop from 0 to old cursor position
904  for (int c = 1; c < OldCursor; c++) {
905  String Arg = argv.elementAt(c);
906  if (Arg.length() >= N && Arg.substring(0, N).compareTo(StartString) == 0) {
907  cursor = c;
908  search_failed_f = false;
909  return argv.elementAt(c).substring(N);
910  }
911  }
912  return "";
913  }
914 
915  // /////////////////////////////////////////////////////////////////////////////
916  // (*) search for flags
917  // .............................................................................
918  //
919  boolean options_contain(String FlagList) {
920  // go through all arguments that start with a '-', but not more than one
921  for (int i = 0; i < argv.size(); i++) {
922  String str;
923  if (prefix.compareTo("") != 0)
924  str = __get_remaining_string(argv.elementAt(i), prefix);
925  else
926  str = argv.elementAt(i);
927 
928  if (str.length() > 1 && str.charAt(0) == '-' && str.charAt(1) != '-')
929  if (check_flags(str, FlagList))
930  return true;
931  }
932  return false;
933  }
934 
935  boolean argument_contains(int Idx, String FlagList) {
936  if (Idx >= argv.size() || Idx < 0)
937  return false;
938 
939  if (prefix.compareTo("") == 0)
940  return check_flags(argv.elementAt(Idx), FlagList);
941 
942  // if a prefix is set, then the argument index is the index
943  // inside the 'namespace'
944  // => only check list of arguments that start with prefix
945  int no_matches = 0;
946  for (int i = 0; i < argv.size(); i++) {
947  String Remain = __get_remaining_string(argv.elementAt(i), prefix);
948  if (Remain.compareTo("") != 0) {
949  no_matches += 1;
950  if (no_matches == Idx)
951  return check_flags(Remain, FlagList);
952  }
953  }
954  // no argument in this namespace
955  return false;
956 
957  }
958 
959  boolean check_flags(String Str, String FlagList) {
960  for (int i = 0; i != FlagList.length(); i++)
961  if (Str.indexOf(FlagList.charAt(i)) != -1)
962  // one of the flags was found in given string
963  return true;
964  return false;
965  }
966 
967  // /////////////////////////////////////////////////////////////////////////////
968  // (*) nominus arguments
969  String[] nominus_vector() {
970  String nv[] = new String[idx_nominus.size()];
971  int i = 0;
972  for (Enumeration<Integer> inm = idx_nominus.elements(); inm.hasMoreElements(); i++) {
973  Integer e = inm.nextElement();
974  nv[i] = argv.elementAt(e.intValue());
975  }
976  return nv;
977  }
978 
979  String next_nominus() {
980  if (nominus_cursor >= idx_nominus.size() - 1)
981  return "";
982  int C = ++nominus_cursor;
983  return argv.elementAt(idx_nominus.elementAt(C).intValue());
984  }
985 
987  nominus_cursor = -1;
988  }
989 
990  boolean search_failed() {
991  return search_failed_f;
992  }
993 
994  // /////////////////////////////////////////////////////////////////////////////
995  // (*) variables
996  // (no operator overloading, => functions with 'python names' for
997  // operators
998  public int call(String VarName, int Default) {
999  variable sv = find_variable(VarName);
1000  if (sv.name.compareTo("") == 0)
1001  return Default;
1002  return __convert_to_type(sv.original, Default);
1003  }
1004 
1005  double call(String VarName, double Default) {
1006  variable sv = find_variable(VarName);
1007  if (sv.name.compareTo("") == 0)
1008  return Default;
1009  return __convert_to_type(sv.original, Default);
1010  }
1011 
1012  public String call(String VarName, String Default) {
1013  variable sv = find_variable(VarName);
1014  if (sv.name.compareTo("") == 0)
1015  return Default;
1016  return sv.original.replace("\r", "");
1017  }
1018 
1019  int call(String VarName, int Default, int Idx) {
1020  variable sv = find_variable(VarName);
1021  if (sv.name.compareTo("") == 0)
1022  return Default;
1023  String element = sv.get_element(Idx);
1024  if (element.compareTo("") == 0)
1025  return Default;
1026  return __convert_to_type(element, Default);
1027  }
1028 
1029  double call(String VarName, double Default, int Idx) {
1030  variable sv = find_variable(VarName);
1031  if (sv.name.compareTo("") == 0)
1032  return Default;
1033  String element = sv.get_element(Idx);
1034  if (element.compareTo("") == 0)
1035  return Default;
1036  return __convert_to_type(element, Default);
1037  }
1038 
1039  String call(String VarName, String Default, int Idx) {
1040  variable sv = find_variable(VarName);
1041  if (sv.name.compareTo("") == 0)
1042  return Default;
1043  String element = sv.get_element(Idx);
1044  if (element.compareTo("") == 0)
1045  return Default;
1046  return element;
1047  }
1048 
1049  int vector_variable_size(String VarName) {
1050  variable sv = find_variable(VarName);
1051  if (sv.name.compareTo("") == 0)
1052  return 0;
1053  return sv.value.length;
1054  }
1055 
1056  variable find_variable(String NameX) {
1057  String Name = prefix + NameX;
1058  for (Enumeration<variable> inm = variables.elements(); inm.hasMoreElements();) {
1059  variable v = inm.nextElement();
1060  if (v.name.compareTo(Name) == 0)
1061  return v;
1062  }
1063  return new variable("", "");
1064  }
1065 
1066  String[] get_variable_names() {
1067  Vector<String> result = new Vector<String>();
1068  int length = 0;
1069  for (Enumeration<variable> inm = variables.elements(); inm.hasMoreElements();) {
1070  String Name = inm.nextElement().name;
1071  String Tmp = __get_remaining_string(Name, prefix);
1072  if (Tmp != "") {
1073  result.addElement(new String(Tmp));
1074  length++;
1075  }
1076  }
1077  String end[] = new String[length];
1078  int i = 0;
1079  for (Enumeration<String> inm = result.elements(); inm.hasMoreElements(); i++) {
1080  String Name = inm.nextElement();
1081  end[i] = Name;
1082  }
1083  return end;
1084  }
1085 
1086  // /////////////////////////////////////////////////////////////////////////////
1087  // (*) ouput (basically for debugging reasons)
1088  // .............................................................................
1089  //
1090  void print() {
1091  System.out.println("argc = " + argv.size() + "\n");
1092  for (int i = 0; i < argv.size(); i++)
1093  System.out.println(argv.elementAt(i));
1094  return;
1095  }
1096 
1097  // (*) dollar bracket expressions (DBEs)
1098  // ------------------------------------
1099  //
1100  // 1) Entry Function: dbe_expand_string()
1101  // Takes a string such as
1102  //
1103  // "${+ ${x} ${y}} Subject-${& ${section} ${subsection}}: ${title}"
1104  //
1105  // calls DBE_expand_string() for each of the expressions
1106  //
1107  // ${+ ${x} ${y}}
1108  // ${& ${section} ${subsection}}
1109  // ${Title}
1110  //
1111  // and returns the string
1112  //
1113  // "4711 Subject-1.01: Mit den Clowns kamen die Schwaene"
1114  //
1115  // assuming that
1116  // x = "4699"
1117  // y = "12"
1118  // section = "1."
1119  // subsection = "01"
1120  // title = "Mit den Clowns kamen die Schwaene"
1121  //
1122  // 2) DBE_expand():
1123  //
1124  // checks for the command, i.e. the 'sign' that follows '${'
1125  // divides the argument list into sub-expressions using
1126  // DBE_get_expr_list()
1127  //
1128  // ${+ ${x} ${y}} -> "${x}" "${y}"
1129  // ${& ${section} ${subsection}} -> "${section}" "${subsection}"
1130  // ${Title} -> Nothing, variable expansion
1131  //
1132  // 3) DBE_expression_list():
1133  //
1134  // builds a vector of unbracketed whitespace separated strings, i.e.
1135  //
1136  // " ${Number}.a ${: Das Marmorbild} AB-${& Author= ${Eichendorf}-1870}"
1137  //
1138  // is split into a vector
1139  //
1140  // [0] ${Number}.a
1141  // [1] ${: Das Marmorbild}
1142  // [2] AB-${& Author= ${Eichendorf}}-1870
1143  //
1144  // Each sub-expression is expanded using expand().
1145  // ---------------------------------------------------------------------------
1146  String DBE_expand_string(String str) {
1147  // Parses for closing operators '${ }' and expands them letting
1148  // white spaces and other letters as they are.
1149  String new_string = "";
1150  int open_brackets = 0;
1151  int first = 0;
1152  for (int i = 0; i < str.length(); i++) {
1153  if (i < str.length() - 2 && str.substring(i, i + 2).compareTo("${") == 0) {
1154  if (open_brackets == 0)
1155  first = i + 2;
1156  open_brackets++;
1157  } else if (str.charAt(i) == '}' && open_brackets > 0) {
1158  open_brackets -= 1;
1159  if (open_brackets == 0) {
1160  String Replacement = DBE_expand(str.substring(first, i));
1161  new_string += Replacement;
1162  }
1163  } else if (open_brackets == 0)
1164  new_string += str.charAt(i);
1165  }
1166  return new_string;
1167  }
1168 
1169  Vector<String> DBE_get_expr_list(String str_, int ExpectedNumber) {
1170  // ensures that the resulting vector has the expected number
1171  // of arguments, but they may contain an error message
1172 
1173  String str = str_;
1174  // Separates expressions by non-bracketed whitespaces, expands them
1175  // and puts them into a list.
1176  int i = 0;
1177 
1178  // (1) eat initial whitespaces
1179  for (; i < str.length(); i++) {
1180  char tmp = str.charAt(i);
1181  if (tmp != ' ' && tmp != '\t' && tmp != '\n')
1182  break;
1183  }
1184 
1185  Vector<String> expr_list = new Vector<String>();
1186  int open_brackets = 0;
1187  Vector<Integer> start_idx = new Vector<Integer>();
1188  int start_new_string = i;
1189  int l = str.length();
1190 
1191  // (2) search for ${ } expressions ...
1192  while (i < l) {
1193  char letter = str.charAt(i);
1194  // whitespace -> end of expression
1195  if ((letter == ' ' || letter == '\t' || letter == '\n') && open_brackets == 0) {
1196  expr_list.addElement(str.substring(start_new_string, i));
1197  boolean no_breakout_f = true;
1198  for (i++; i < l; i++) {
1199  char tmp = str.charAt(i);
1200  if (tmp != ' ' && tmp != '\t' && tmp != '\n') {
1201  no_breakout_f = false;
1202  start_new_string = i;
1203  break;
1204  }
1205  }
1206  if (no_breakout_f == true) {
1207  // end of expression list
1208  if (expr_list.size() < ExpectedNumber) {
1209  String pre_tmp = "<< ${ }: missing arguments>>";
1210  for (int ni = expr_list.size(); ni < ExpectedNumber; ni++)
1211  expr_list.addElement(pre_tmp);
1212  }
1213  return expr_list;
1214  }
1215  }
1216 
1217  // dollar-bracket expression
1218  if (str.length() >= i + 2 && str.substring(i, i + 2).compareTo("${") == 0) {
1219  open_brackets++;
1220  start_idx.addElement(new Integer(i + 2));
1221  } else if (letter == '}' && open_brackets > 0) {
1222  int start = start_idx.elementAt(start_idx.size() - 1).intValue();
1223  start_idx.removeElementAt(start_idx.size() - 1);
1224  String Replacement = DBE_expand(str.substring(start, i));
1225  if (start - 3 < 0)
1226  str = Replacement + str.substring(i + 1);
1227  else
1228  str = str.substring(0, start - 2) + Replacement + str.substring(i + 1);
1229  l = str.length();
1230  i = start + Replacement.length() - 3;
1231  open_brackets--;
1232  }
1233  i++;
1234  }
1235 
1236  // end of expression list
1237  expr_list.addElement(str.substring(start_new_string, i));
1238 
1239  if (expr_list.size() < ExpectedNumber) {
1240  String pre_tmp = "<< ${ }: missing arguments>>";
1241  for (int ni = expr_list.size(); ni < ExpectedNumber; ni++)
1242  expr_list.addElement(pre_tmp);
1243  }
1244  return expr_list;
1245  }
1246 
1247  variable DBE_get_variable(String VarName) {
1248  variable ev = new variable();
1249  String secure_Prefix = prefix;
1250 
1251  prefix = section;
1252  // (1) first search in currently active section
1253  variable var = find_variable(VarName);
1254  if (var.name != "") {
1255  prefix = secure_Prefix;
1256  return var;
1257  }
1258 
1259  // (2) search in root name space
1260  prefix = "";
1261  var = find_variable(VarName);
1262  if (var.name != "") {
1263  prefix = secure_Prefix;
1264  return var;
1265  }
1266 
1267  prefix = secure_Prefix;
1268 
1269  // error occured => variable name == ""
1270  ev.name = "";
1271  ev.original = "<<${ } variable '" + VarName + "' undefined>>";
1272  return ev;
1273  }
1274 
1275  String DBE_expand(String expr) {
1276  // ${: } pure text
1277  if (expr.charAt(0) == ':')
1278  return expr.substring(1);
1279 
1280  // ${& expr expr ... } text concatination
1281  else if (expr.charAt(0) == '&') {
1282  Vector<String> A = DBE_get_expr_list(expr.substring(1), 1);
1283  String result = "";
1284  for (Enumeration<String> e = A.elements(); e.hasMoreElements();) {
1285  String add = e.nextElement();
1286  result += add;
1287  }
1288  return result;
1289  }
1290 
1291  // ${<-> expr expr expr} text replacement
1292  else if (expr.length() >= 3 && expr.substring(0, 3).compareTo("<->") == 0) {
1293  Vector<String> A = DBE_get_expr_list(expr.substring(3), 3);
1294  String Arg0 = A.elementAt(0);
1295  String Arg1 = A.elementAt(1);
1296  String Arg2 = A.elementAt(2);
1297  int L = Arg1.length();
1298 
1299  while (true) {
1300  int tmp = Arg0.indexOf(Arg1);
1301  if (tmp == -1)
1302  break;
1303  if (tmp == 0)
1304  Arg0 = Arg2 + Arg0.substring(L);
1305  else
1306  Arg0 = Arg0.substring(0, tmp) + Arg2 + Arg0.substring(L + tmp);
1307  }
1308  return Arg0;
1309  }
1310  // ${+ ...}, ${- ...}, ${* ...}, ${/ ...} expressions
1311  else if (expr.charAt(0) == '+') {
1312  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1313 
1314  double result = 0.0;
1315 
1316  for (Enumeration<String> e = A.elements(); e.hasMoreElements();) {
1317  String add = e.nextElement();
1318  result += __convert_to_type(add, 0.0);
1319  }
1320 
1321  return (new Double(result)).toString();
1322  } else if (expr.charAt(0) == '-') {
1323  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1324 
1325  Enumeration<String> e = A.elements();
1326  double result = __convert_to_type(e.nextElement(), 0.0);
1327  for (; e.hasMoreElements();) {
1328  String sub = e.nextElement();
1329  result -= __convert_to_type(sub, 0.0);
1330  }
1331  return (new Double(result)).toString();
1332  } else if (expr.charAt(0) == '*') {
1333  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1334 
1335  double result = 1.0;
1336  for (Enumeration<String> e = A.elements(); e.hasMoreElements();) {
1337  String mul = e.nextElement();
1338  result *= __convert_to_type(mul, 0.0);
1339  }
1340 
1341  return (new Double(result)).toString();
1342  } else if (expr.charAt(0) == '/') {
1343  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1344  Enumeration<String> e = A.elements();
1345  double result = __convert_to_type(e.nextElement(), 0.0);
1346  if (result == 0)
1347  return "0.0";
1348  for (; e.hasMoreElements();) {
1349  double Q = __convert_to_type(e.nextElement(), 0.0);
1350  if (Q == 0.0)
1351  return "0.0";
1352  result /= Q;
1353  }
1354  return (new Double(result)).toString();
1355  }
1356 
1357  // ${^ ... } power expressions
1358  else if (expr.charAt(0) == '^') {
1359  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1360 
1361  Enumeration<String> e = A.elements();
1362  double result = __convert_to_type(e.nextElement(), 0.0);
1363  for (; e.hasMoreElements();) {
1364  double p = __convert_to_type(e.nextElement(), 0.0);
1365  result = java.lang.Math.pow(result, p);
1366  }
1367 
1368  return (new Double(result)).toString();
1369  }
1370 
1371  // ${== } ${<= } ${>= } comparisons (return the number of the first
1372  // 'match'
1373  else if (expr.length() >= 2
1374  && (expr.substring(0, 2).compareTo("==") == 0 || expr.substring(0, 2).compareTo(">=") == 0
1375  || expr.substring(0, 2).compareTo("<=") == 0 || expr.charAt(0) == '>' || expr.charAt(0) == '<')) {
1376  // differentiate between two and one sign operators
1377  int op = 0;
1378  // EQ = 0 GEQ = 1 LEQ = 2 GT = 3 LT = 4
1379  if (expr.substring(0, 2).compareTo("==") == 0)
1380  op = 0;
1381  else if (expr.substring(0, 2).compareTo(">=") == 0)
1382  op = 1;
1383  else if (expr.substring(0, 2).compareTo("<=") == 0)
1384  op = 2;
1385  else if (expr.charAt(0) == '>')
1386  op = 3;
1387  else
1388  op = 4;
1389 
1390  Vector<String> a = new Vector<String>();
1391  if (op >= 3)
1392  a = DBE_get_expr_list(expr.substring(1), 2);
1393  else
1394  a = DBE_get_expr_list(expr.substring(2), 2);
1395 
1396  Enumeration<String> e = a.elements();
1397  String x_orig = e.nextElement();
1398  double x = __convert_to_type(x_orig, 1e37);
1399  int i = 1;
1400  for (; e.hasMoreElements();) {
1401  String y_orig = e.nextElement();
1402  double y = __convert_to_type(y_orig, 1e37);
1403 
1404  // set the strings as reference if something wasn't a number
1405  if (x == 1e37 || y == 1e37) {
1406  // it's a string comparison
1407  int comparison = x_orig.compareTo(y_orig);
1408 
1409  if ((op == 0 && comparison == 0) || (op == 1 && comparison >= 0) || (op == 2 && comparison <= 0)
1410  || (op == 3 && comparison > 0) || (op == 4 && comparison < 0)) {
1411  return (new Integer(i)).toString();
1412  }
1413  } else {
1414  // it's a number comparison
1415  if ((op == 0 && x == y) || (op == 1 && x >= y) || (op == 2 && x <= y) || (op == 3 && x > y)
1416  || (op == 4 && x < y)) {
1417  return (new Integer(i)).toString();
1418  }
1419  }
1420  i++;
1421  }
1422  // nothing fulfills the condition => return 0
1423  return "0";
1424  }
1425  // ${?? expr expr} select
1426  else if (expr.length() >= 2 && expr.substring(0, 2).compareTo("??") == 0) {
1427  Vector<String> a = DBE_get_expr_list(expr.substring(2), 2);
1428  double x = __convert_to_type(a.elementAt(0), 1e37);
1429  // last element is always the default argument
1430  if (x == 1e37 || x < 0 || x >= a.size() - 1)
1431  return a.elementAt(a.size() - 1);
1432 
1433  // round x to closest integer
1434  int rx = (int) java.lang.Math.rint(x);
1435  return a.elementAt(rx);
1436  }
1437  // ${? expr expr expr} if then else conditions
1438  else if (expr.charAt(0) == '?') {
1439  Vector<String> a = DBE_get_expr_list(expr.substring(1), 2);
1440  if (__convert_to_type(a.elementAt(0), 0.0) == 1.0)
1441  return a.elementAt(1);
1442  else if (a.size() > 2)
1443  return a.elementAt(2);
1444  }
1445  // ${! expr} maxro expansion
1446  else if (expr.charAt(0) == '!') {
1447  variable Var = DBE_get_variable(expr.substring(1));
1448  // error
1449  if (Var.name == "")
1450  return Var.original;
1451 
1452  Vector<String> A = DBE_get_expr_list(Var.original, 2);
1453  return A.elementAt(0);
1454  }
1455  // ${@: } - string subscription
1456  else if (expr.length() >= 2 && expr.substring(0, 2).compareTo("@:") == 0) {
1457  Vector<String> A = DBE_get_expr_list(expr.substring(2), 2);
1458  double x = __convert_to_type(A.elementAt(1), 1e37);
1459 
1460  // last element is always the default argument
1461  if (x == 1e37 || x < 0 || x >= (double) A.elementAt(0).length() - 1)
1462  return "<<1st index out of range>>";
1463 
1464  if (A.size() > 2) {
1465  double y = __convert_to_type(A.elementAt(2), 1e37);
1466  if (y != 1e37 && y > 0 && y <= (double) A.elementAt(0).length() - 1 && y > x) {
1467  // note: java.lang.String: substring(a,b) = from a to b - 1
1468  // C++ string: substr(a,b) = from a to a + b
1469  int rx1 = (int) java.lang.Math.rint(x);
1470  int rx2 = (int) java.lang.Math.rint(y + 1.0);
1471  return A.elementAt(0).substring(rx1, rx2);
1472  } else if (y == -1) {
1473  int rx = (int) java.lang.Math.rint(x);
1474  return A.elementAt(0).substring(rx);
1475  }
1476  return "<<2nd index out of range>>";
1477  } else {
1478  String tmp = A.elementAt(0);
1479  int rx = (int) java.lang.Math.rint(x);
1480  return tmp.substring(rx, rx + 1);
1481  }
1482  }
1483  // ${@ } - vector subscription
1484  else if (expr.charAt(0) == '@') {
1485  Vector<String> A = DBE_get_expr_list(expr.substring(1), 2);
1486  variable Var = DBE_get_variable(A.elementAt(0));
1487  // error
1488  if (Var.name == "") {
1489  // make a copy of the string if an error occured
1490  // (since the error variable is a static variable inside
1491  // get_variable())
1492  return Var.original;
1493  }
1494 
1495  double x = __convert_to_type(A.elementAt(1), 1e37);
1496 
1497  // last element is always the default argument
1498  if (x == 1e37 || x < 0 || x >= Var.value.length)
1499  return "<<1st index out of range>>";
1500 
1501  if (A.size() > 2) {
1502  double y = __convert_to_type(A.elementAt(2), 1e37);
1503  int begin = (int) java.lang.Math.rint(x);
1504  int end = 0;
1505  if (y != 1e37 && y > 0 && y <= Var.value.length && y > x)
1506  end = (int) java.lang.Math.rint(y + 1.0);
1507  else if (y == -1)
1508  end = Var.value.length;
1509  else
1510  return "<<2nd index out of range>>";
1511 
1512  String result = Var.get_element(begin);
1513  for (int i = begin + 1; i < end; i++)
1514  result += " " + Var.get_element(i);
1515  return result;
1516  } else {
1517  int tmp = (int) java.lang.Math.rint(x);
1518  return Var.get_element(tmp);
1519  }
1520  }
1521  Vector<String> A = DBE_get_expr_list(expr, 1);
1522  variable B = DBE_get_variable(A.elementAt(0));
1523 
1524  // make a copy of the string if an error occured
1525  // (since the error variable is a static variable inside get_variable())
1526  if (B.name == "")
1527  return B.original;
1528  else
1529  return B.original;
1530  }
1531 
1532  // /////////////////////////////////////////////////////////////////////////////
1533  // (*) unidentified flying objects
1534  // .............................................................................
1535  //
1536  String[] string_vector_to_string_array(Vector<String> Vec) {
1537  String[] result = new String[Vec.size()];
1538  for (int i = 0; i < Vec.size(); i++)
1539  result[i] = Vec.elementAt(i);
1540  return result;
1541  }
1542 
1543  int __search_string_array(String[] Arr, String Str) {
1544  for (int i = 0; i < Arr.length; i++)
1545  if (Str.compareTo(Arr[i]) == 0)
1546  return i;
1547  return -1;
1548  }
1549 
1550  String[] unidentified_arguments(String KnownArguments[]) {
1551  Vector<String> ufos = new Vector<String>();
1552  Enumeration<String> arge = argv.elements();
1553  if (arge.hasMoreElements() == false)
1554  return string_vector_to_string_array(ufos);
1555 
1556  // forget about first element (application name)
1557  String it = arge.nextElement();
1558  for (; arge.hasMoreElements();) {
1559  it = arge.nextElement();
1560  // -- argument belongs to prefixed section ?
1561  String arg = __get_remaining_string(it, prefix);
1562  if (arg == "")
1563  continue;
1564 
1565  // -- check if argument is known
1566  if (__search_string_array(KnownArguments, arg) == -1)
1567  ufos.addElement(it);
1568  }
1569  return string_vector_to_string_array(ufos);
1570  }
1571 
1572  String[] unidentified_options(String KnownOptions[]) {
1573  Vector<String> ufos = new Vector<String>();
1574 
1575  Enumeration<String> arge = argv.elements();
1576  if (arge.hasMoreElements() == false)
1577  return string_vector_to_string_array(ufos);
1578  // forget about first element (application name)
1579  String it = arge.nextElement();
1580  for (; arge.hasMoreElements();) {
1581  it = arge.nextElement();
1582  // -- argument belongs to prefixed section ?
1583  String arg = __get_remaining_string(it, prefix);
1584  if (arg == "")
1585  continue;
1586  // -- argument == option ?
1587  if (arg.length() < 1 || arg.charAt(0) != '-')
1588  continue;
1589  // -- check if argument is known
1590  if (__search_string_array(KnownOptions, arg) == -1)
1591  ufos.addElement(it);
1592  }
1593  return string_vector_to_string_array(ufos);
1594  }
1595 
1596  String unidentified_flags(String KnownFlagList) {
1597  return unidentified_flags(KnownFlagList, -1);
1598  }
1599 
1600  String unidentified_flags(String KFL, int ArgumentNumber) {
1601  // Two modes:
1602  // ArgumentNumber >= 0 check specific argument
1603  // ArgumentNumber == -1 check all options starting with one '-'
1604  // for flags
1605 
1606  String ufos = "";
1607 
1608  // (2) iteration over '-' arguments (options)
1609  if (ArgumentNumber == -1) {
1610  // iterate over all arguments
1611  Enumeration<String> arge = argv.elements();
1612  if (arge.hasMoreElements() == false)
1613  return ufos;
1614  // forget about first element (application name)
1615  String it = arge.nextElement();
1616  for (; arge.hasMoreElements();) {
1617  it = arge.nextElement();
1618  // -- argument belongs to prefixed section ?
1619  String arg = __get_remaining_string(it, prefix);
1620  if (arg == "")
1621  continue;
1622 
1623  // does arguments start with '-' (but not '--')
1624  if (arg.length() < 2)
1625  continue;
1626  else if (arg.charAt(0) != '-')
1627  continue;
1628  else if (arg.charAt(1) == '-')
1629  continue;
1630 
1631  // -- check out if flags inside option are contained in
1632  // KnownFlagList
1633  for (int i = 1; i < arg.length(); i++) {
1634  char flag = arg.charAt(i);
1635  if (KFL.indexOf(flag) == -1)
1636  ufos += flag;
1637  }
1638  }
1639  } else {
1640  int no_matches = 0;
1641  // -- only check arguments that start with prefix
1642  Enumeration<String> arge = argv.elements();
1643  if (arge.hasMoreElements() == false)
1644  return ufos;
1645  // forget about first element (application name)
1646  String it = arge.nextElement();
1647  for (; arge.hasMoreElements();) {
1648  it = arge.nextElement();
1649  String Remain = __get_remaining_string(it, prefix);
1650  if (Remain != "") {
1651  no_matches += 1;
1652  if (no_matches == ArgumentNumber) {
1653  // -- the right argument number inside the section is
1654  // found
1655  // => check it for flags
1656  for (int i = 0; i < Remain.length(); i++) {
1657  char flag = Remain.charAt(i);
1658  if (KFL.indexOf(flag) == -1)
1659  ufos += flag;
1660  }
1661  }
1662  }
1663  }
1664  }
1665  return ufos;
1666  }
1667 
1668  String[] unidentified_variables(String[] Knowns) {
1669  Vector<String> ufos = new Vector<String>();
1670 
1671  for (Enumeration<variable> inm = variables.elements(); inm.hasMoreElements();) {
1672  variable it = inm.nextElement();
1673  // -- variable belongs to prefixed section ?
1674  String var_name = __get_remaining_string(it.name, prefix);
1675  if (var_name == "")
1676  continue;
1677 
1678  // -- check if variable is known
1679  if (__search_string_array(Knowns, var_name) == -1)
1680  ufos.addElement(it.name);
1681  }
1682  return string_vector_to_string_array(ufos);
1683  }
1684 
1685  String[] unidentified_sections(String[] Knowns) {
1686  Vector<String> ufos = new Vector<String>();
1687 
1688  for (Enumeration<String> inm = section_list.elements(); inm.hasMoreElements();) {
1689  String it = inm.nextElement();
1690  // -- section a subsection of prefix ?
1691  String sec_name = __get_remaining_string(it, prefix);
1692  if (sec_name == "")
1693  continue;
1694 
1695  // -- section is known ?
1696  if (__search_string_array(Knowns, sec_name) == -1)
1697  ufos.addElement(it);
1698  }
1699  return string_vector_to_string_array(ufos);
1700  }
1701 
1702  String[] unidentified_nominuses(String[] KnownNominuses) {
1703  Vector<String> ufos = new Vector<String>();
1704 
1705  // iterate over all arguments
1706  Enumeration<String> arge = argv.elements();
1707  if (arge.hasMoreElements() == false)
1708  return string_vector_to_string_array(ufos);
1709  // forget about first element (application name)
1710  String it = arge.nextElement();
1711  for (; arge.hasMoreElements();) {
1712  it = arge.nextElement();
1713  // -- argument belongs to prefixed section ?
1714  String arg = __get_remaining_string(it, prefix);
1715  if (arg == "")
1716  continue;
1717 
1718  if (arg.length() < 1)
1719  continue;
1720  // option ? --> not a nomius
1721  if (arg.charAt(0) == '-')
1722  continue;
1723  // section ? --> not a real nominus
1724  if (arg.charAt(0) == '[' && arg.charAt(arg.length() - 1) == ']')
1725  continue;
1726  // variable definition ? --> not a real nominus
1727  boolean continue_f = false;
1728  for (int i = 0; i < arg.length(); i++)
1729  if (arg.charAt(i) == '=') {
1730  continue_f = true;
1731  break;
1732  }
1733  if (continue_f)
1734  continue;
1735 
1736  // real nominuses are compared with the given list
1737  if (__search_string_array(KnownNominuses, arg) == -1)
1738  ufos.addElement(it);
1739  }
1740  return string_vector_to_string_array(ufos);
1741  }
1742 }
String[] unidentified_variables(String[] Knowns)
Definition: GetPot.java:1668
String match_starting_string(String StartString)
Definition: GetPot.java:880
String __get_until_closing_bracket(PushbackInputStream istr)
Definition: GetPot.java:385
int __skip_whitespace(PushbackInputStream istr)
Definition: GetPot.java:289
String DBE_expand(String expr)
Definition: GetPot.java:1275
Utility helper class from rbAppMIT included for compatibility of rbAppMIT model loading.
Definition: GetPot.java:31
String __get_string(PushbackInputStream istr)
Definition: GetPot.java:357
double call(String VarName, double Default, int Idx)
Definition: GetPot.java:1029
String follow(String Default, String A1, String A2, String A3, String A4, String A5)
Definition: GetPot.java:837
double call(String VarName, double Default)
Definition: GetPot.java:1005
Vector< String > read_in_stream(PushbackInputStream istr)
Definition: GetPot.java:237
boolean search(String P1, String P2, String P3, String P4, String P5, String P6)
Definition: GetPot.java:625
int follow(int Default, String A1, String A2)
Definition: GetPot.java:733
String follow(String Default, String A[])
Definition: GetPot.java:813
String value[]
Definition: GetPot.java:66
int follow(int Default, String A[])
Definition: GetPot.java:727
void set_prefix(String Prefix)
Definition: GetPot.java:509
String unidentified_flags(String KFL, int ArgumentNumber)
Definition: GetPot.java:1600
int next(int Default)
Definition: GetPot.java:668
boolean search(String Option)
Definition: GetPot.java:551
String follow(String Default, String A1, String A2, String A3)
Definition: GetPot.java:825
String prefix
Definition: GetPot.java:68
void disable_loop()
Definition: GetPot.java:532
double direct_follow(double Default, String Option)
Definition: GetPot.java:861
String[] unidentified_sections(String[] Knowns)
Definition: GetPot.java:1685
boolean check_flags(String Str, String FlagList)
Definition: GetPot.java:959
String getitem(int idx)
Definition: GetPot.java:637
String call(String VarName, String Default)
Definition: GetPot.java:1012
double follow(double Default, String A1, String A2, String A3, String A4)
Definition: GetPot.java:788
void reset_nominus_cursor()
Definition: GetPot.java:986
int follow(int Default, String A1, String A2, String A3)
Definition: GetPot.java:739
double follow(double Default, String A1, String A2, String A3, String A4, String A5)
Definition: GetPot.java:794
GetPot(InputStream in, String filename)
Added this constructor for the modified version of rbAPPmit.
Definition: GetPot.java:141
int follow(int Default, String A1, String A2, String A3, String A4, String A5, String A6)
Definition: GetPot.java:757
Vector< String > DBE_get_expr_list(String str_, int ExpectedNumber)
Definition: GetPot.java:1169
Vector< Integer > idx_nominus
Definition: GetPot.java:75
String unidentified_flags(String KnownFlagList)
Definition: GetPot.java:1596
int call(String VarName, int Default)
Definition: GetPot.java:998
boolean argument_contains(int Idx, String FlagList)
Definition: GetPot.java:935
variable DBE_get_variable(String VarName)
Definition: GetPot.java:1247
int follow(int Default, String A1)
Definition: GetPot.java:721
boolean search(String P1, String P2, String P3, String P4)
Definition: GetPot.java:607
void print()
Definition: GetPot.java:1090
int call(String VarName, int Default, int Idx)
Definition: GetPot.java:1019
double follow(double Default, String A1, String A2, String A3)
Definition: GetPot.java:782
String next(String Default)
Definition: GetPot.java:702
int __convert_to_type(String S, int Default)
Definition: GetPot.java:460
String __get_next_token(PushbackInputStream istr)
Definition: GetPot.java:323
String[] get_variable_names()
Definition: GetPot.java:1066
int __search_string_array(String[] Arr, String Str)
Definition: GetPot.java:1543
String follow(String Default, String A1)
Definition: GetPot.java:807
GetPot(String argv_[], String applicationName)
Definition: GetPot.java:82
int nominus_cursor
Definition: GetPot.java:76
String direct_follow(String Default, String Option)
Definition: GetPot.java:871
boolean search(String P1, String P2, String P3, String P4, String P5)
Definition: GetPot.java:616
String follow(String Default, String A1, String A2, String A3, String A4)
Definition: GetPot.java:831
String[] unidentified_options(String KnownOptions[])
Definition: GetPot.java:1572
int vector_variable_size(String VarName)
Definition: GetPot.java:1049
String process_section_label(String label, Vector< String > section_stack)
Definition: GetPot.java:416
double follow(double Default, String A1)
Definition: GetPot.java:764
String[] unidentified_nominuses(String[] KnownNominuses)
Definition: GetPot.java:1702
String __get_remaining_string(String String, String Start)
Definition: GetPot.java:513
String[] unidentified_arguments(String KnownArguments[])
Definition: GetPot.java:1550
void __parse_argument_vector(Vector< String > _argv)
Definition: GetPot.java:162
String get_element(int Idx)
Definition: GetPot.java:49
String follow(String Default, String A1, String A2)
Definition: GetPot.java:819
variable(String Name, String Value)
Definition: GetPot.java:36
double follow(double Default, String A[])
Definition: GetPot.java:770
int direct_follow(int Default, String Option)
Definition: GetPot.java:850
int cursor
Definition: GetPot.java:74
Vector< String > section_list
Definition: GetPot.java:73
String follow(String Default, String A1, String A2, String A3, String A4, String A5, String A6)
Definition: GetPot.java:843
boolean search_failed_f
Definition: GetPot.java:78
String DBE_expand_string(String str)
Definition: GetPot.java:1146
Vector< variable > variables
Definition: GetPot.java:79
void init_multiple_occurrence()
Definition: GetPot.java:545
String call(String VarName, String Default, int Idx)
Definition: GetPot.java:1039
int follow(int Default, String A1, String A2, String A3, String A4, String A5)
Definition: GetPot.java:751
boolean options_contain(String FlagList)
Definition: GetPot.java:919
boolean search(String P1, String P2, String P3)
Definition: GetPot.java:598
boolean search_failed()
Definition: GetPot.java:990
String section
Definition: GetPot.java:71
boolean search_loop_f
Definition: GetPot.java:77
double follow(double Default, String A1, String A2, String A3, String A4, String A5, String A6)
Definition: GetPot.java:800
boolean search(String P[])
Definition: GetPot.java:582
void take(String Value)
Definition: GetPot.java:56
double follow(double Default, String A1, String A2)
Definition: GetPot.java:776
String[] nominus_vector()
Definition: GetPot.java:969
Vector< String > argv
Definition: GetPot.java:72
String[] string_vector_to_string_array(Vector< String > Vec)
Definition: GetPot.java:1536
double next(double Default)
Definition: GetPot.java:685
int follow(int Default, String A1, String A2, String A3, String A4)
Definition: GetPot.java:745
void enable_loop()
Definition: GetPot.java:536
void reset_cursor()
Definition: GetPot.java:540
String next_nominus()
Definition: GetPot.java:979
boolean search(String P1, String P2)
Definition: GetPot.java:589
double __convert_to_type(String S, double Default)
Definition: GetPot.java:501
variable find_variable(String NameX)
Definition: GetPot.java:1056
int size()
Definition: GetPot.java:663