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