Skip to content

Commit 54bd307

Browse files
committed
fix sprintf WIP
1 parent bea7272 commit 54bd307

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

src/main/java/org/perlonjava/operators/SprintfOperator.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ public static RuntimeScalar sprintf(RuntimeScalar runtimeScalar, RuntimeList lis
103103
}
104104

105105
if (widthArgIndex >= list.size()) {
106-
result.append(" MISSING");
106+
WarnDie.warn(new RuntimeScalar("Missing argument in sprintf"), new RuntimeScalar(""));
107+
width = 0; // Use default width
107108
continue;
108109
}
109110
width = ((RuntimeScalar) list.elements.get(widthArgIndex)).getInt();
@@ -128,7 +129,8 @@ public static RuntimeScalar sprintf(RuntimeScalar runtimeScalar, RuntimeList lis
128129
}
129130

130131
if (precArgIndex >= list.size()) {
131-
result.append(" MISSING");
132+
WarnDie.warn(new RuntimeScalar("Missing argument in sprintf"), new RuntimeScalar(""));
133+
precision = -1; // Use default precision
132134
continue;
133135
}
134136
precision = ((RuntimeScalar) list.elements.get(precArgIndex)).getInt();
@@ -150,16 +152,13 @@ public static RuntimeScalar sprintf(RuntimeScalar runtimeScalar, RuntimeList lis
150152
if (valueArgIndex >= list.size()) {
151153
// Generate warning
152154
WarnDie.warn(new RuntimeScalar("Missing argument in sprintf"), new RuntimeScalar(""));
153-
155+
154156
// Append appropriate default value directly to result
155157
if (spec.conversionChar == 'f' || spec.conversionChar == 'F') {
156-
if (spec.precision >= 0) {
157-
result.append(String.format("%." + spec.precision + "f", 0.0));
158-
} else {
159-
result.append("0.000000"); // Default precision is 6
160-
}
158+
int prec = (spec.precision != null) ? spec.precision : 6; // Default precision is 6
159+
result.append(String.format("%." + prec + "f", 0.0));
161160
} else if (spec.conversionChar == 'g' || spec.conversionChar == 'G') {
162-
if (spec.precision == 0) {
161+
if (spec.precision != null && spec.precision == 0) {
163162
result.append("0");
164163
} else {
165164
result.append("0"); // %g removes trailing zeros
@@ -200,11 +199,32 @@ public static RuntimeScalar sprintf(RuntimeScalar runtimeScalar, RuntimeList lis
200199
precision, spec.conversionChar);
201200
}
202201
result.append(formatted);
203-
204202
} catch (Exception e) {
205-
// Reset arg index and append error
203+
// Reset arg index and generate warning
206204
argIndex = savedArgIndex;
207-
result.append(" MISSING");
205+
WarnDie.warn(new RuntimeScalar("Missing argument in sprintf"), new RuntimeScalar(""));
206+
207+
// Append appropriate default value based on spec.conversionChar
208+
if (spec.conversionChar == 'f' || spec.conversionChar == 'F') {
209+
int prec = (spec.precision != null) ? spec.precision : 6; // Default 6
210+
result.append(String.format("%." + prec + "f", 0.0));
211+
} else if (spec.conversionChar == 'g' || spec.conversionChar == 'G') {
212+
if (spec.precision != null && spec.precision == 0) {
213+
result.append("0");
214+
} else {
215+
result.append("0"); // %g removes trailing zeros
216+
}
217+
} else if (spec.conversionChar == 'd' || spec.conversionChar == 'i' ||
218+
spec.conversionChar == 'u' || spec.conversionChar == 'o' ||
219+
spec.conversionChar == 'x' || spec.conversionChar == 'X') {
220+
result.append("0");
221+
} else if (spec.conversionChar == 's') {
222+
result.append(""); // Empty string for %s
223+
} else if (spec.conversionChar == 'c') {
224+
result.append("\0"); // Null character for %c
225+
} else {
226+
result.append(""); // Default empty
227+
}
208228
}
209229
}
210230
}

0 commit comments

Comments
 (0)