summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/ioutils/CLParameters.java
blob: 9d0c9c62f661e7a672f19eebdaf008f4d55c2bb5 (plain)
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;

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