Skip to content

Commit 00c6da3

Browse files
committed
fix pack() WIP - refactoring
1 parent 2fdec44 commit 00c6da3

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package org.perlonjava.operators;
22

33
import org.perlonjava.runtime.*;
4+
import org.perlonjava.operators.pack.*;
45

56
import java.io.ByteArrayOutputStream;
67
import java.io.IOException;
78
import java.nio.charset.StandardCharsets;
89
import java.util.List;
910
import java.util.Map;
1011
import java.util.HashMap;
11-
1212
/**
1313
* Provides functionality to pack a list of scalars into a binary string
1414
* based on a specified template, similar to Perl's pack function.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.perlonjava.operators.pack;
2+
3+
import org.perlonjava.runtime.RuntimeScalar;
4+
import java.io.ByteArrayOutputStream;
5+
import java.util.List;
6+
7+
/**
8+
* Handles 'x' format - null padding
9+
*/
10+
public class NullPadHandler implements PackFormatHandler {
11+
@Override
12+
public int pack(ByteArrayOutputStream output, List<RuntimeScalar> values,
13+
int valueIndex, int count, PackModifiers modifiers) {
14+
// 'x' doesn't consume any values, just writes null bytes
15+
for (int j = 0; j < count; j++) {
16+
output.write(0);
17+
}
18+
return 0; // consumes no values
19+
}
20+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.perlonjava.operators.pack;
2+
3+
import org.perlonjava.runtime.RuntimeScalar;
4+
import java.io.ByteArrayOutputStream;
5+
import java.util.List;
6+
7+
/**
8+
* Interface for handling pack format characters
9+
*/
10+
public interface PackFormatHandler {
11+
/**
12+
* Pack values according to this format
13+
*
14+
* @param output The output stream to write to
15+
* @param values The list of values to pack
16+
* @param valueIndex Current position in values list
17+
* @param count Repeat count (Integer.MAX_VALUE for *)
18+
* @param modifiers Format modifiers (endianness, etc.)
19+
* @return number of values consumed from the values list
20+
*/
21+
int pack(ByteArrayOutputStream output, List<RuntimeScalar> values,
22+
int valueIndex, int count, PackModifiers modifiers);
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.perlonjava.operators.pack;
2+
3+
/**
4+
* Holds format modifiers like endianness
5+
*/
6+
public class PackModifiers {
7+
public final boolean bigEndian;
8+
public final boolean littleEndian;
9+
public final boolean nativeSize;
10+
11+
public PackModifiers(boolean bigEndian, boolean littleEndian, boolean nativeSize) {
12+
this.bigEndian = bigEndian;
13+
this.littleEndian = littleEndian;
14+
this.nativeSize = nativeSize;
15+
}
16+
17+
public static PackModifiers DEFAULT = new PackModifiers(false, false, false);
18+
}

0 commit comments

Comments
 (0)