View Javadoc

1   package com.tapina.robe.swi.os;
2   
3   import com.tapina.robe.swi.OS;
4   
5   import java.text.CharacterIterator;
6   import java.text.StringCharacterIterator;
7   
8   /***
9    * This class is used to hold state whilst a string is being translated using the GS* SWI calls.
10   */
11  public final class GSTranslator {
12      private final String input;
13      private final CharacterIterator iterator;
14      private CharacterIterator queue = null;
15      private final boolean spaceTerminates;
16      private boolean previousBar = false;
17      private boolean inQuotes = false;
18      private boolean inBrackets = false;
19      private boolean setTopBit = false;
20      private final OS osModule;
21  
22      public GSTranslator(String in, boolean spaceTerminates, final OS osModule) {
23          this.input = in;
24          this.spaceTerminates = spaceTerminates;
25          iterator = new StringCharacterIterator(in);
26          this.osModule = osModule;
27      }
28  
29      private char queuedCharacter() {
30          if (queue != null) {
31              char out = queue.next();
32              if (out == CharacterIterator.DONE) {
33                  queue = null;
34              }
35              return out;
36          } else {
37              return CharacterIterator.DONE;
38          }
39      }
40  
41      public final int getIndex() {
42          return iterator.getIndex();
43      }
44  
45      public final char nextCharacter() {
46          char out;
47          out = queuedCharacter();
48          if (out != CharacterIterator.DONE) {
49              return out;
50          }
51  
52          char c = iterator.current();
53          if (c == CharacterIterator.DONE || (c == ' ' && spaceTerminates && !inBrackets && !inQuotes && !previousBar)) {
54              return out;
55          }
56  
57          while (out == CharacterIterator.DONE) {
58              switch (c) {
59                  case '|':
60                      if (previousBar) {
61                          out = '|';
62                          previousBar = false;
63                      } else {
64                          previousBar = true;
65                      }
66                      break;
67                  case '\"':
68                      if (previousBar) {
69                          out = '\"';
70                      } else {
71                          inQuotes = !inQuotes;
72                      }
73                      break;
74                  case '<':
75                      if (previousBar) {
76                          out = '<';
77                      } else {
78                          inBrackets = !inBrackets;
79                      }
80                      break;
81                  case '!':
82                      if (previousBar) {
83                          setTopBit = true;
84                      } else {
85                          out = '!';
86                      }
87                      break;
88                  case ' ':
89                      if (spaceTerminates) {
90                          return CharacterIterator.DONE;
91                      } else {
92                          out = ' ';
93                      }
94                      break;
95                  default:
96                      if (inBrackets) {
97                          if (c >= '0' && c <= '9') {
98                              // Control character
99                              char control = (char) (c - '0');
100                             CharacterIterator iterator2 = new StringCharacterIterator(input, iterator.getIndex());
101                             for (char c2 = iterator2.next(); c2 >= '0' && c <= '9';) {
102                                 control = (char) (control * 10 + (c2 - '0'));
103                             }
104                             out = control;
105                         } else {
106                             // Environment variable
107                             StringBuffer varName = new StringBuffer(20);
108                             CharacterIterator iterator2 = new StringCharacterIterator(input, iterator.getIndex());
109                             for (char c2 = iterator2.current(); c2 != CharacterIterator.DONE && c2 != '>'; iterator2.next()) {
110                                 varName.append(c2);
111                             }
112                             queue = new StringCharacterIterator(osModule.readVarVal(varName.toString()));
113                         }
114                     } else if (previousBar) {
115                         // Control character
116                         char control = (char) (Character.toUpperCase(c) - 64);
117                         if (setTopBit) {
118                             control |= 128;
119                         }
120                         out = control;
121                     } else {
122                         out = c;
123                     }
124             }
125             c = iterator.next();
126         }
127         return out;
128     }
129 }