1 package com.sharkysoft.printf;
2
3 import com.sharkysoft.util.UnreachableCodeException;
4
5 abstract class Formatter
6 {
7
8 protected Formatter()
9 {
10 }
11
12 abstract void format(PrintfState ipPs);
13
14 abstract int argsRequired();
15
16 abstract Class[] argTypes();
17
18 private static final String LINE_SEPARATOR;
19
20 static
21 {
22 String vsLineSeparator = "\n";
23 try
24 {
25 vsLineSeparator = System.getProperty("line.separator");
26 }
27 catch (SecurityException e)
28 {
29 }
30 LINE_SEPARATOR = vsLineSeparator;
31 }
32
33 static Formatter create(FormatSpecifier ipPfs)
34 {
35 switch (ipPfs.mcType)
36 {
37
38 case FormatSpecifier.TYPE_LITERAL :
39 return new Formatter_Literal(ipPfs.msLiteral);
40 case FormatSpecifier.TYPE_SIGNED_DEC :
41 switch (ipPfs.mcInputSize)
42 {
43 case FormatSpecifier.INPUT_SIZE_NORMAL :
44 return new Formatter_d(ipPfs);
45 case FormatSpecifier.INPUT_SIZE_LONG :
46 return new Formatter_d_l(ipPfs);
47 case FormatSpecifier.INPUT_SIZE_SHORT :
48 return new Formatter_d_h(ipPfs);
49 case FormatSpecifier.INPUT_SIZE_BYTE :
50 return new Formatter_d_by(ipPfs);
51 case FormatSpecifier.INPUT_SIZE_BIG :
52 return new Formatter_d_Bi(ipPfs);
53 }
54 break;
55 case FormatSpecifier.TYPE_STRING :
56 return new Formatter_s(ipPfs);
57 case FormatSpecifier.TYPE_UNSIGNED_DEC :
58 switch (ipPfs.mcInputSize)
59 {
60 case FormatSpecifier.INPUT_SIZE_NORMAL :
61 return new Formatter_u(ipPfs);
62 case FormatSpecifier.INPUT_SIZE_LONG :
63 return new Formatter_u_l(ipPfs);
64 case FormatSpecifier.INPUT_SIZE_SHORT :
65 return new Formatter_u_h(ipPfs);
66 case FormatSpecifier.INPUT_SIZE_BYTE :
67 return new Formatter_u_By(ipPfs);
68 case FormatSpecifier.INPUT_SIZE_BIG :
69 return new Formatter_u_Bi(ipPfs);
70 }
71 break;
72 case FormatSpecifier.TYPE_HEX_LOWER :
73 case FormatSpecifier.TYPE_HEX_UPPER :
74 switch (ipPfs.mcInputSize)
75 {
76 case FormatSpecifier.INPUT_SIZE_NORMAL :
77 return new Formatter_x(ipPfs);
78 case FormatSpecifier.INPUT_SIZE_LONG :
79 return new Formatter_x_l(ipPfs);
80 case FormatSpecifier.INPUT_SIZE_SHORT :
81 return new Formatter_x_h(ipPfs);
82 case FormatSpecifier.INPUT_SIZE_BYTE :
83 return new Formatter_x_By(ipPfs);
84 case FormatSpecifier.INPUT_SIZE_BIG :
85 return new Formatter_x_Bi(ipPfs);
86 }
87 break;
88 case FormatSpecifier.TYPE_INTEGER_UPPER :
89 case FormatSpecifier.TYPE_INTEGER_LOWER :
90 switch (ipPfs.mcInputSize)
91 {
92 case FormatSpecifier.INPUT_SIZE_NORMAL :
93 return new Formatter_z(ipPfs);
94 case FormatSpecifier.INPUT_SIZE_LONG :
95 return new Formatter_z_l(ipPfs);
96 case FormatSpecifier.INPUT_SIZE_SHORT :
97 return new Formatter_z_h(ipPfs);
98 case FormatSpecifier.INPUT_SIZE_BYTE :
99 return new Formatter_z_by(ipPfs);
100 case FormatSpecifier.INPUT_SIZE_BIG :
101 return new Formatter_z_Bi(ipPfs);
102 }
103 break;
104 case FormatSpecifier.TYPE_OCT :
105 switch (ipPfs.mcInputSize)
106 {
107 case FormatSpecifier.INPUT_SIZE_NORMAL :
108 return new Formatter_o(ipPfs);
109 case FormatSpecifier.INPUT_SIZE_LONG :
110 return new Formatter_o_l(ipPfs);
111 case FormatSpecifier.INPUT_SIZE_SHORT :
112 return new Formatter_o_h(ipPfs);
113 case FormatSpecifier.INPUT_SIZE_BYTE :
114 return new Formatter_o_by(ipPfs);
115 case FormatSpecifier.INPUT_SIZE_BIG :
116 return new Formatter_o_Bi(ipPfs);
117 }
118 break;
119 case FormatSpecifier.TYPE_CHAR :
120 return new Formatter_c(ipPfs);
121 case FormatSpecifier.TYPE_FLOAT :
122 switch (ipPfs.mcInputSize)
123 {
124 case FormatSpecifier.INPUT_SIZE_NORMAL :
125 return new Formatter_f(ipPfs);
126 case FormatSpecifier.INPUT_SIZE_LONG :
127 return new Formatter_f_l(ipPfs);
128 case FormatSpecifier.INPUT_SIZE_BIG :
129 return new Formatter_f_Bi(ipPfs);
130 }
131 break;
132 case FormatSpecifier.TYPE_FLOAT_E_LOWER :
133 case FormatSpecifier.TYPE_FLOAT_E_UPPER :
134 switch (ipPfs.mcInputSize)
135 {
136 case FormatSpecifier.INPUT_SIZE_NORMAL :
137 return new Formatter_e(ipPfs);
138 case FormatSpecifier.INPUT_SIZE_LONG :
139 return new Formatter_e_l(ipPfs);
140 case FormatSpecifier.INPUT_SIZE_BIG :
141 return new Formatter_e_Bi(ipPfs);
142 }
143 break;
144 case FormatSpecifier.TYPE_FLOAT_G_LOWER :
145 case FormatSpecifier.TYPE_FLOAT_G_UPPER :
146 switch (ipPfs.mcInputSize)
147 {
148 case FormatSpecifier.INPUT_SIZE_NORMAL :
149 return new Formatter_g(ipPfs);
150 case FormatSpecifier.INPUT_SIZE_LONG :
151 return new Formatter_g_l(ipPfs);
152 case FormatSpecifier.INPUT_SIZE_BIG :
153 return new Formatter_g_Bi(ipPfs);
154 }
155 break;
156 case FormatSpecifier.TYPE_POINTER :
157 return new Formatter_p(ipPfs);
158 case FormatSpecifier.TYPE_CHARCOUNT :
159 return new Formatter_n(ipPfs);
160 case FormatSpecifier.TYPE_PERCENT :
161 return new Formatter_Literal("%");
162 case FormatSpecifier.TYPE_ENDL :
163 return new Formatter_Literal(LINE_SEPARATOR);
164 }
165 throw new UnreachableCodeException();
166 }
167 }
168