From aff27779cb065cb2d2ce78d1959a784e257bdb1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A6gis?= <github@æg.is> Date: Fri, 28 Sep 2012 17:58:21 +0200 Subject: [PATCH] Add draft JNI interface --- jni/NOTES | 12 ++++ jni/com/upstandinghackers/hammer/HAction.java | 8 +++ .../hammer/HParseResult.java | 9 +++ .../hammer/HParsedToken.java | 28 ++++++++ jni/com/upstandinghackers/hammer/HParser.java | 6 ++ .../upstandinghackers/hammer/HPredicate.java | 6 ++ jni/com/upstandinghackers/hammer/Hammer.java | 66 +++++++++++++++++++ 7 files changed, 135 insertions(+) create mode 100644 jni/NOTES create mode 100644 jni/com/upstandinghackers/hammer/HAction.java create mode 100644 jni/com/upstandinghackers/hammer/HParseResult.java create mode 100644 jni/com/upstandinghackers/hammer/HParsedToken.java create mode 100644 jni/com/upstandinghackers/hammer/HParser.java create mode 100644 jni/com/upstandinghackers/hammer/HPredicate.java create mode 100644 jni/com/upstandinghackers/hammer/Hammer.java diff --git a/jni/NOTES b/jni/NOTES new file mode 100644 index 00000000..2e6e5bb2 --- /dev/null +++ b/jni/NOTES @@ -0,0 +1,12 @@ +Compilation: +javac com/upstandinghackers/hammer/*.java + +Conversion to JNI headers: +find -name "*.class" | sed -e 's/.class$//' | tr '/' '.' | cut -c 3- | xargs javah + +Not working: +enums aren't converted at all, no idea why + +TODO: +Implement the entire JNI side +Testing diff --git a/jni/com/upstandinghackers/hammer/HAction.java b/jni/com/upstandinghackers/hammer/HAction.java new file mode 100644 index 00000000..09aeaaff --- /dev/null +++ b/jni/com/upstandinghackers/hammer/HAction.java @@ -0,0 +1,8 @@ +package com.upstandinghackers.hammer; + +import java.util.List; + +public interface HAction +{ + public List<HParsedToken> execute(HParseResult p); +} diff --git a/jni/com/upstandinghackers/hammer/HParseResult.java b/jni/com/upstandinghackers/hammer/HParseResult.java new file mode 100644 index 00000000..ed5c85be --- /dev/null +++ b/jni/com/upstandinghackers/hammer/HParseResult.java @@ -0,0 +1,9 @@ +package com.upstandinghackers.hammer; + +import java.util.List; + +public class HParseResult +{ + public native List<HParsedToken> getAst(); + public native long getBitLength(); +} diff --git a/jni/com/upstandinghackers/hammer/HParsedToken.java b/jni/com/upstandinghackers/hammer/HParsedToken.java new file mode 100644 index 00000000..d8a70d6a --- /dev/null +++ b/jni/com/upstandinghackers/hammer/HParsedToken.java @@ -0,0 +1,28 @@ +package com.upstandinghackers.hammer; + +import java.util.List; + +public class HParsedToken +{ + public native Hammer.HTokenType getTokenType(); + public native int getIndex(); + public native byte getBitOffset(); + public native byte[] getBytesValue(); + public native long getSIntValue(); + public native long getUIntValue(); + public native double getDoubleValue(); + public native float getFloatValue(); + public native List<HParsedToken> getSeqValue(); + public native Object getUserValue(); + + native void setTokenType(Hammer.HTokenType type); + native void setIndex(int index); + native void setBitOffset(byte offset); + native void setBytesValue(byte[] value); + native void setSIntValue(long value); + native void setUIntValue(long value); + native void setDoubleValue(double value); + native void setFloatValue(float value); + native void setSeqValue(List<HParsedToken> value); + native void setUserValue(Object value); +} diff --git a/jni/com/upstandinghackers/hammer/HParser.java b/jni/com/upstandinghackers/hammer/HParser.java new file mode 100644 index 00000000..9f2387aa --- /dev/null +++ b/jni/com/upstandinghackers/hammer/HParser.java @@ -0,0 +1,6 @@ +package com.upstandinghackers.hammer; + +public class HParser +{ + public native void bindIndirect(HParser inner); +} diff --git a/jni/com/upstandinghackers/hammer/HPredicate.java b/jni/com/upstandinghackers/hammer/HPredicate.java new file mode 100644 index 00000000..9c87875e --- /dev/null +++ b/jni/com/upstandinghackers/hammer/HPredicate.java @@ -0,0 +1,6 @@ +package com.upstandinghackers.hammer; + +public interface HPredicate +{ + public boolean apply(HParseResult p); +} diff --git a/jni/com/upstandinghackers/hammer/Hammer.java b/jni/com/upstandinghackers/hammer/Hammer.java new file mode 100644 index 00000000..08b75b1e --- /dev/null +++ b/jni/com/upstandinghackers/hammer/Hammer.java @@ -0,0 +1,66 @@ +package com.upstandinghackers.hammer; + +public class Hammer +{ + public final static byte BYTE_BIG_ENDIAN = 0x1; + public final static byte BIT_BIG_ENDIAN = 0x2; + public final static byte BYTE_LITTLE_ENDIAN = 0x0; + public final static byte BIT_LITTLE_ENDIAN = 0x0; + + public enum HTokenType + { + TT_NONE(1), + TT_BYTES(2), + TT_SINT(4), + TT_UINT(8), + TT_SEQUENCE(16), + TT_ERR(32), + TT_USER(64), + TT_MAX(128); + + private int value; + public int getValue() { return this.value; } + private HTokenType(int value) { this.value = value; } + } + + public static native HParseResult hParse(HParser parser, byte[] input, int length); + public static native HParser hToken(byte[] str, int length); + public static native HParser hCh(byte c); + public static native HParser hChRange(byte from, byte to); + public static native HParser hIntRange(HParser p, int lower, int upper); + public static native HParser hBits(int len, boolean sign); + public static native HParser hInt64(); + public static native HParser hInt32(); + public static native HParser hInt16(); + public static native HParser hInt8(); + public static native HParser hUInt64(); + public static native HParser hUInt32(); + public static native HParser hUInt16(); + public static native HParser hUInt8(); + public static native HParser hWhitespace(HParser p); + public static native HParser hLeft(HParser p, HParser q); + public static native HParser hRight(HParser p, HParser q); + public static native HParser hMiddle(HParser p, HParser x, HParser q); + public static native HParser hAction(HParser p, HAction a); + public static native HParser hIn(byte[] charset, int length); + public static native HParser hEndP(); + public static native HParser hNothingP(); + public static native HParser hSequence(HParser[] parsers); + public static native HParser hChoice(HParser[] parsers); + public static native HParser hButNot(HParser p1, HParser p2); + public static native HParser hDifference(HParser p1, HParser p2); + public static native HParser hXor(HParser p1, HParser p2); + public static native HParser hMany(HParser p); + public static native HParser hMany1(HParser p); + public static native HParser hRepeatN(HParser p, int n); + public static native HParser hOptional(HParser p); + public static native HParser hIgnore(HParser p); + public static native HParser hSepBy(HParser p, HParser sep); + public static native HParser hSepBy1(HParser p, HParser sep); + public static native HParser hEpsilonP(); + public static native HParser hLengthValue(HParser length, HParser value); + public static native HParser hAttrBool(HParser p, HPredicate pred); + public static native HParser hAnd(HParser p); + public static native HParser hNot(HParser p); + public static native HParser hIndirect(); +} -- GitLab