1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
package bjc.utils.ioutils.format;
import java.util.ArrayList;
import java.util.List;
import bjc.utils.esodata.Tape;
/**
* Represents a set of parameters to a CL format directive.
*
* @author Benjamin Culkin
*/
public class CLParameters {
private String[] params;
public CLParameters(String[] params) {
this.params = params;
}
public int length() {
return params.length;
}
/**
* Creates a set of parameters from an array of parameters.
*
* Mostly, this just fills in V and # parameters.
*
* @param params
* The parameters of the directive.
* @param dirParams
* The parameters of the format string.
*
* @return A set of CL parameters.
*/
public static CLParameters fromDirective(String[] params, Tape<Object> dirParams) {
List<String> parameters = new ArrayList<>();
for (String param : params) {
if (param.equalsIgnoreCase("V")) {
Object par = dirParams.item();
boolean succ = dirParams.right();
if (!succ) {
throw new IllegalStateException("Couldn't advance tape for parameter");
}
if (par == null) {
throw new IllegalArgumentException(
"Expected a format parameter for V inline parameter");
}
if (par instanceof Number) {
int val = ((Number) par).intValue();
parameters.add(Integer.toString(val));
} else if (par instanceof Character) {
char ch = ((Character) par);
parameters.add(Character.toString(ch));
} else {
throw new IllegalArgumentException(
"Incorrect type of parameter for V inline parameter");
}
} else if (param.equals("#")) {
parameters.add(Integer.toString(dirParams.position()));
} else {
parameters.add(param);
}
}
return new CLParameters(parameters.toArray(new String[0]));
}
public char getCharDefault(int idx, String paramName, char directive, char def) {
if (!params[idx].equals("")) {
return getChar(idx, paramName, directive);
}
return def;
}
public char getChar(int idx, String paramName, char directive) {
String param = params[idx];
if (!param.startsWith("'")) {
throw new IllegalArgumentException(
String.format("Invalid %s %s to %c directive", paramName, param, directive));
}
return param.charAt(1);
}
public int getIntDefault(int idx, String paramName, char directive, int def) {
if (!params[idx].equals("")) {
}
return def;
}
public int getInt(int idx, String paramName, char directive) {
String param = params[idx];
try {
return Integer.parseInt(param);
} catch (NumberFormatException nfex) {
String msg = String.format("Invalid %s %s to %c directive", paramName, param, directive);
IllegalArgumentException iaex = new IllegalArgumentException(msg);
iaex.initCause(nfex);
throw iaex;
}
}
}
|