From f0ca9cd732a0c09f1b925807bed4c36ed4cbbb03 Mon Sep 17 00:00:00 2001 From: krasimir Date: Wed, 13 Apr 2016 12:49:08 +0000 Subject: [PATCH] added getFunctionsByCat --- src/runtime/java/jpgf.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) 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, "", "()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) {