summaryrefslogtreecommitdiff
path: root/src/runtime/java
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2016-04-13 12:49:08 +0000
committerkrasimir <krasimir@chalmers.se>2016-04-13 12:49:08 +0000
commitf0ca9cd732a0c09f1b925807bed4c36ed4cbbb03 (patch)
treeb7e05f0ab241eedae8bfc348a239ab18624d6e88 /src/runtime/java
parent1019b7faf54dc6dc5a5be20829f774b4cbbc152d (diff)
added getFunctionsByCat
Diffstat (limited to 'src/runtime/java')
-rw-r--r--src/runtime/java/jpgf.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c
index 60027ea99..0daf3e88c 100644
--- a/src/runtime/java/jpgf.c
+++ b/src/runtime/java/jpgf.c
@@ -314,6 +314,40 @@ Java_org_grammaticalframework_pgf_PGF_getFunctions(JNIEnv* env, jobject self)
return functions;
}
+JNIEXPORT jobject JNICALL
+Java_org_grammaticalframework_pgf_PGF_getFunctionsByCat(JNIEnv* env, jobject self, jstring jcat)
+{
+ jclass list_class = (*env)->FindClass(env, "java/util/ArrayList");
+ if (!list_class)
+ return NULL;
+ jmethodID constrId = (*env)->GetMethodID(env, list_class, "<init>", "()V");
+ if (!constrId)
+ return NULL;
+ jobject functions = (*env)->NewObject(env, list_class, constrId);
+ if (!functions)
+ return NULL;
+
+ PgfPGF* pgf = get_ref(env, self);
+
+ GuPool* tmp_pool = gu_local_pool();
+
+ PgfCId cat = j2gu_string(env, jcat, tmp_pool);
+
+ // Create an exception frame that catches all errors.
+ GuExn* err = gu_exn(tmp_pool);
+
+ JPGFClosure clo = { { pgf_collect_names }, env, self, functions };
+ pgf_iter_functions_by_cat(pgf, cat, &clo.fn, err);
+ if (!gu_ok(err)) {
+ gu_pool_free(tmp_pool);
+ return NULL;
+ }
+
+ gu_pool_free(tmp_pool);
+
+ return functions;
+}
+
JNIEXPORT jstring JNICALL
Java_org_grammaticalframework_pgf_Concr_getName(JNIEnv* env, jobject self)
{