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
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
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
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 }