summaryrefslogtreecommitdiff
path: root/src/runtime/java/jpgf.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-05-28 12:59:19 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-05-28 12:59:19 +0000
commit3147e164536ab6d5221302f09ccab627638f84be (patch)
tree84dfb1caf5171da6373286a2d0479fe259686d9f /src/runtime/java/jpgf.c
parent29f1487aa4454e9418a3f80642a39d1347125df5 (diff)
an initial skeleton for building a Java binding to the C runtime
Diffstat (limited to 'src/runtime/java/jpgf.c')
-rw-r--r--src/runtime/java/jpgf.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c
new file mode 100644
index 000000000..4796e32dd
--- /dev/null
+++ b/src/runtime/java/jpgf.c
@@ -0,0 +1,31 @@
+#include <pgf/pgf.h>
+#include <gu/mem.h>
+#include "org_grammaticalframework_PGF.h"
+
+JNIEXPORT jobject JNICALL
+Java_org_grammaticalframework_PGF_readPGF(JNIEnv *env, jclass cls, jstring s)
+{
+ const char *fpath = (*env)->GetStringUTFChars(env, s, 0);
+
+ GuPool* pool = gu_new_pool();
+ GuPool* tmp_pool = gu_local_pool();
+
+ // Create an exception frame that catches all errors.
+ GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool);
+
+ // Read the PGF grammar.
+ PgfPGF* pgf = pgf_read(fpath, pool, err);
+ if (!gu_ok(err)) {
+ gu_pool_free(pool);
+ gu_pool_free(tmp_pool);
+ return NULL;
+ }
+
+ gu_pool_free(tmp_pool);
+
+ (*env)->ReleaseStringUTFChars(env, s, fpath);
+
+ jmethodID constrId = (*env)->GetMethodID(env, cls, "<init>", "(II)V");
+
+ return (*env)->NewObject(env, cls, constrId, (int) pool, (int) pgf);
+}