Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,6 @@

<dependencies>

<dependency>
<groupId>org.metricshub</groupId>
<artifactId>printf4j</artifactId>
<version>0.9.08</version>
</dependency>

<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
Expand Down
29 changes: 20 additions & 9 deletions src/main/java/io/jawk/backend/AVM.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
import io.jawk.intermediate.UninitializedObject;
import io.jawk.intermediate.UntypedObject;
import io.jawk.jrt.AssocArray;
import io.jawk.jrt.AwkPrintf;
import io.jawk.jrt.AwkRuntimeException;
import io.jawk.jrt.AwkSink;
import io.jawk.jrt.BlockManager;
Expand Down Expand Up @@ -1785,7 +1786,7 @@ private void executeTuples(PositionTracker position)
}
case INTFUNC: {
// stack[0] = arg to int() function
push((long) JRT.toDouble(pop()));
push(JRT.truncateToScalar(JRT.toDouble(pop())));
position.next();
break;
}
Expand Down Expand Up @@ -2830,23 +2831,23 @@ private void execPrintToPipe(CountTuple tuple) throws IOException {
private void execPrintf(CountTuple tuple) throws IOException {
long numArgs = tuple.getCount();
Object[] values = popArguments(numArgs - 1);
String format = jrt.toAwkString(pop());
String format = checkPosixFormat(jrt.toAwkString(pop()));
jrt.printfDefault(format, values);
}

private void execPrintfToFile(CountAndAppendTuple tuple) throws IOException {
String key = jrt.toAwkString(pop());
long numArgs = tuple.getCount();
Object[] values = popArguments(numArgs - 1);
String format = jrt.toAwkString(pop());
String format = checkPosixFormat(jrt.toAwkString(pop()));
jrt.printfToFile(key, tuple.isAppend(), format, values);
}

private void execPrintfToPipe(CountTuple tuple) throws IOException {
String cmd = jrt.toAwkString(pop());
long numArgs = tuple.getCount();
Object[] values = popArguments(numArgs - 1);
String format = jrt.toAwkString(pop());
String format = checkPosixFormat(jrt.toAwkString(pop()));
jrt.printfToProcess(cmd, format, values);
}

Expand Down Expand Up @@ -3003,7 +3004,7 @@ private Object invokeIndirectBuiltin(
return jrt.index(jrt.toAwkString(args[0]), jrt.toAwkString(args[1]));
case INT:
requireIndirectArgumentCount(builtin, args, 1, 1, lineNumber);
return Long.valueOf((long) JRT.toDouble(args[0]));
return JRT.truncateToScalar(JRT.toDouble(args[0]));
case LENGTH:
requireIndirectArgumentCount(builtin, args, 0, 1, lineNumber);
return args.length == 0 ? Integer.valueOf(jrt.jrtGetInputField(0).toString().length()) : lengthOf(args[0]);
Expand All @@ -3029,9 +3030,8 @@ private Object invokeIndirectBuiltin(
case SPRINTF:
requireIndirectArgumentCount(builtin, args, 1, Integer.MAX_VALUE, lineNumber);
return jrt
.getAwkSink()
.sprintf(
jrt.toAwkString(args[0]),
checkPosixFormat(jrt.toAwkString(args[0])),
Arrays.copyOfRange(args, 1, args.length));
case SQRT:
requireIndirectArgumentCount(builtin, args, 1, 1, lineNumber);
Expand Down Expand Up @@ -3783,8 +3783,19 @@ private Object[] popArguments(long numArgs) {
*/
private String sprintfFunction(long numArgs) {
Object[] argArray = popArguments(numArgs - 1);
String fmt = jrt.toAwkString(pop());
return jrt.getAwkSink().sprintf(fmt, argArray);
String fmt = checkPosixFormat(jrt.toAwkString(pop()));
return jrt.sprintf(fmt, argArray);
}

/**
* Rejects gawk positional argument references in strict POSIX mode, like
* {@code gawk --posix}.
*/
private String checkPosixFormat(String format) {
if (settings.isPosix() && AwkPrintf.usesPositionalArguments(format)) {
throw new AwkRuntimeException("`$' is not permitted in awk formats");
}
return format;
}

private void setNumOnJRT(long fieldNum, double num) {
Expand Down
48 changes: 12 additions & 36 deletions src/main/java/io/jawk/intermediate/AwkTuples.java
Original file line number Diff line number Diff line change
Expand Up @@ -2383,55 +2383,37 @@ private Object foldBinary(Object left, Object right, Tuple operation) {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = d1 + d2;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case SUBTRACT: {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = d1 - d2;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case MULTIPLY: {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = d1 * d2;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case DIVIDE: {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = d1 / d2;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case MOD: {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = d1 % d2;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case POW: {
double d1 = JRT.toDouble(left);
double d2 = JRT.toDouble(right);
double ans = Math.pow(d1, d2);
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case CMP_EQ:
case CMP_LT:
Expand Down Expand Up @@ -2462,17 +2444,11 @@ private Object foldUnary(Object literal, Tuple operation) {
case NEGATE: {
double value = JRT.toDouble(literal);
double ans = -value;
if (JRT.isActuallyLong(ans)) {
return Long.valueOf((long) Math.rint(ans));
}
return Double.valueOf(ans);
return JRT.toScalarNumber(ans);
}
case UNARY_PLUS: {
double value = JRT.toDouble(literal);
if (JRT.isActuallyLong(value)) {
return Long.valueOf((long) Math.rint(value));
}
return Double.valueOf(value);
return JRT.toScalarNumber(value);
}
default:
return null;
Expand All @@ -2488,11 +2464,11 @@ private Tuple createLiteralPush(Object value, int lineNumber) {
} else if (value instanceof Double) {
tuple = new Tuple.PushDoubleTuple(((Double) value).doubleValue());
} else if (value instanceof Number) {
double d = ((Number) value).doubleValue();
if (JRT.isActuallyLong(d)) {
tuple = new Tuple.PushLongTuple((long) Math.rint(d));
Object scalar = JRT.toScalarNumber(((Number) value).doubleValue());
if (scalar instanceof Long) {
tuple = new Tuple.PushLongTuple(((Long) scalar).longValue());
} else {
tuple = new Tuple.PushDoubleTuple(d);
tuple = new Tuple.PushDoubleTuple(((Double) scalar).doubleValue());
}
} else if (value instanceof String) {
tuple = new Tuple.PushStringTuple((String) value);
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/io/jawk/jrt/AppendableAwkSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ public void print(String ofs, String ors, String ofmt, Object... values) throws
}

@Override
public void printf(String ofs, String ors, String ofmt, String format, Object... values)
public void printf(String ofs, String ors, String ofmt, String convfmt, String format, Object... values)
throws IOException {
synchronized (lock) {
appendable.append(formatPrintfResult(format, values));
appendable.append(sprintf(convfmt, format, values));
}
}

Expand Down
Loading
Loading