00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <jni.h>
00012 #include "com_xsb_interprolog_NativeEngine.h"
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include <time.h>
00017
00018 #include "sig_xsb.h"
00019 #include <signal.h>
00020
00021 extern void keyint_proc(int);
00022
00023
00024
00025
00026 #include "xsb_config.h"
00027 #include "auxlry.h"
00028 #include "cell_xsb.h"
00029 #include "memory_xsb.h"
00030 #include "register.h"
00031 #include "flags_xsb.h"
00032 #include "heap_xsb.h"
00033 #include "subp.h"
00034 #include "cinterf.h"
00035 #include "error_xsb.h"
00036 #include "loader_xsb.h"
00037 #include "cinterf.h"
00038 #include "thread_xsb.h"
00039
00040
00041 JNIEnv *theEnv;
00042 jobject theObj;
00043 jboolean debug;
00044 #ifdef MULTI_THREAD
00045 static th_context *th ;
00046 #endif
00047
00048
00049 JNIEXPORT jbyteArray JNICALL
00050 Java_com_xsb_interprolog_NativeEngine_get_1bytes
00051 (JNIEnv *env, jobject obj) {
00052 int i = 1;
00053 jbyteArray bytes;
00054
00055 jsize size = p2p_arg(reg_term(CTXTc 1), 3);
00056 int newHead, newTail;
00057 jbyte *b;
00058
00059 if (size == -1) {
00060 xsb_close_query(CTXT);
00061 return NULL;
00062 }
00063 b = (jbyte *) mem_alloc(size,INTERPROLOG_SPACE);
00064 newHead = p2p_car(p2p_arg(reg_term(CTXTc 1), 2));
00065 newTail = p2p_cdr(p2p_arg(reg_term(CTXTc 1), 2));
00066 b[i-1] = p2c_int(newHead);
00067 while(is_nil(newTail) == 0) {
00068 newHead = p2p_car(newTail);
00069 b[i] = p2c_int(newHead);
00070 newTail = p2p_cdr(newTail);
00071 i++;
00072 }
00073 xsb_close_query(CTXT);
00074 bytes = (*env)->NewByteArray(env, size);
00075 (*env)->SetByteArrayRegion(env, bytes, 0, size, b);
00076 mem_dealloc(b,size,INTERPROLOG_SPACE);
00077 return bytes;
00078 }
00079
00080 JNIEXPORT jint JNICALL
00081 Java_com_xsb_interprolog_NativeEngine_put_1bytes
00082 (JNIEnv *env, jobject obj, jbyteArray b, jint size, jint args, jstring jStr) {
00083 int head, tail, newVar, newVar2;
00084 int i = 1;
00085 int rc;
00086
00087
00088 jbyte *bytes; char *argString;
00089
00090
00091 check_glstack_overflow(3, pcreg, (size+4)*2*sizeof(Cell)) ;
00092
00093 bytes = (*env)->GetByteArrayElements(env, b, 0);
00094
00095
00096
00097
00098 argString = (char *)((*env)->GetStringUTFChars(env, jStr, 0));
00099 c2p_functor(CTXTc argString, args, reg_term(CTXTc 1));
00100 c2p_list(CTXTc p2p_arg(reg_term(CTXTc 1),1));
00101 if (args == 3) {
00102 newVar = p2p_arg(reg_term(CTXTc 1),2);
00103 newVar = p2p_new(CTXT);
00104 newVar2 = p2p_arg(reg_term(CTXTc 1),3);
00105 newVar2 = p2p_new(CTXT);
00106 }
00107 head = p2p_car(p2p_arg(reg_term(CTXTc 1),1));
00108 tail = p2p_cdr(p2p_arg(reg_term(CTXTc 1),1));
00109 if (bytes[0]<0)
00110 c2p_int(CTXTc (bytes[0]+256), head);
00111 else
00112 c2p_int(CTXTc bytes[0], head);
00113 while (i < size) {
00114 c2p_list(CTXTc tail);
00115 head = p2p_car(tail);
00116 tail = p2p_cdr(tail);
00117 if (bytes[i]<0)
00118 c2p_int(CTXTc (bytes[i]+256), head);
00119 else
00120 c2p_int(CTXTc bytes[i], head);
00121 i++;
00122 }
00123 c2p_nil(CTXTc tail);
00124
00125
00126
00127
00128 theEnv = env;
00129 theObj = obj;
00130 rc = xsb_query(CTXT);
00131
00132
00133
00134
00135 (*env)->ReleaseByteArrayElements(env, b, bytes, 0);
00136 (*env)->ReleaseStringUTFChars(env,jStr, argString);
00137
00138
00139
00140 return rc;
00141 }
00142
00143
00144 JNIEXPORT jint JNICALL
00145 Java_com_xsb_interprolog_NativeEngine_xsb_1close_1query
00146 (JNIEnv *env , jobject obj) {
00147 return xsb_close_query(CTXT);
00148 }
00149
00150
00151 JNIEXPORT jint JNICALL
00152 Java_com_xsb_interprolog_NativeEngine_xsb_1command_1string
00153 (JNIEnv *env, jobject obj, jstring jCommandString) {
00154 int rcode;
00155 char *CommandString = (char *)((*env)->GetStringUTFChars(env, jCommandString, 0));
00156 theEnv = env;
00157 theObj = obj;
00158 rcode=xsb_command_string(CTXTc CommandString);
00159 (*env)->ReleaseStringUTFChars(env,jCommandString, CommandString);
00160 return rcode;
00161 }
00162
00163 JNIEXPORT jint JNICALL
00164 Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal
00165 (JNIEnv *env, jobject obj, jstring jXSBPath) {
00166 int rcode;
00167 int myargc=2;
00168 char * myargv[2];
00169 char *XSBPath = (char *)((*env)->GetStringUTFChars(env, jXSBPath, 0));
00170
00171 #ifdef MULTI_THREAD
00172 th = mem_alloc( sizeof( th_context ),THREAD_SPACE ) ;
00173 #endif
00174
00175 if (debug==JNI_TRUE) printf("Entering Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal\n");
00176 myargv[0] = XSBPath;
00177 myargv[1]="-n";
00178
00179 rcode=xsb_init(CTXTc myargc,myargv);
00180 (*env)->ReleaseStringUTFChars(env,jXSBPath, XSBPath);
00181 if (debug==JNI_TRUE) printf("Exiting Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal\n");
00182 return rcode;
00183 }
00184
00185 JNIEXPORT jint JNICALL
00186 Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal_1arg
00187 (JNIEnv *env, jobject obj, jstring jXSBPath, jobjectArray jXSBParameters) {
00188 int rcode;
00189 int i;
00190 int myargc;
00191 char ** myargv;
00192 jstring * parameters;
00193 char *XSBPath;
00194
00195 myargc = (*env)->GetArrayLength(env, jXSBParameters) + 2;
00196 myargv = (char **) mem_alloc(myargc * sizeof(char *),INTERPROLOG_SPACE);
00197
00198 XSBPath = (char *)((*env)->GetStringUTFChars(env, jXSBPath, 0));
00199 if (debug==JNI_TRUE) printf("Entering Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal\n");
00200 myargv[0] = XSBPath;
00201 myargv[1] = "-n";
00202
00203 parameters = (jstring *) mem_alloc((myargc - 2) * sizeof(jstring *),INTERPROLOG_SPACE);
00204 for (i=0; i < myargc-2; i++) {
00205 parameters[i] = (jstring)(*env)->GetObjectArrayElement(env, jXSBParameters, i);
00206 myargv[i + 2] = (char *)((*env)->GetStringUTFChars(env, parameters[i], 0));
00207 }
00208 #ifdef MULTI_THREAD
00209 th = mem_alloc( sizeof( th_context ),THREAD_SPACE ) ;
00210 #endif
00211
00212 rcode=xsb_init(CTXTc myargc,myargv);
00213
00214 (*env)->ReleaseStringUTFChars(env,jXSBPath, XSBPath);
00215
00216 for (i=0; i < myargc-2; i++) {
00217 (*env)->ReleaseStringUTFChars(env, parameters[i], myargv[i + 2]);
00218
00219 }
00220 mem_dealloc(parameters,(myargc-2)*sizeof(jstring *),INTERPROLOG_SPACE);
00221 mem_dealloc(myargv,myargc*sizeof(char *),INTERPROLOG_SPACE);
00222
00223 if (debug==JNI_TRUE) printf("Exiting Java_com_xsb_interprolog_NativeEngine_xsb_1init_1internal\n");
00224 return rcode;
00225 }
00226
00227 JNIEXPORT void JNICALL
00228 Java_com_xsb_interprolog_NativeEngine_xsb_1interrupt (JNIEnv *env, jobject obj){
00229
00230
00231
00232 keyint_proc(SIGINT);
00233 }
00234
00235 JNIEXPORT void JNICALL Java_com_xsb_interprolog_NativeEngine_xsb_1setDebug
00236 (JNIEnv * env, jobject obj, jboolean d){
00237 debug = d;
00238 }
00239
00240
00241
00242
00243 xsbBool interprolog_callback(CTXTdecl) {
00244 JNIEnv *env = theEnv;
00245 jobject obj = theObj;
00246 jclass cls;
00247 jmethodID mid;
00248 int i = 1, size, bsize, newHead, newTail;
00249 jbyte *b;
00250 jbyteArray newBytes, bytes;
00251
00252 cls = (*env)->GetObjectClass(env, obj);
00253 if (cls == NULL) {
00254 printf("Could not find the class!\n");
00255 return 0;
00256 }
00257
00258 mid = (*env)->GetMethodID(env, cls, "callback", "([B)[B");
00259 if (mid == NULL) {
00260 printf("Could not find the method!\n");
00261 return 0;
00262 }
00263
00264
00265 bsize = p2c_int(reg_term(CTXTc 1));
00266
00267 b = (jbyte *) mem_alloc(bsize,INTERPROLOG_SPACE);
00268 newHead = p2p_car(reg_term(CTXTc 2));
00269 newTail = p2p_cdr(reg_term(CTXTc 2));
00270 b[i-1] = p2c_int(newHead);
00271 while(is_nil(newTail) == 0) {
00272 newHead = p2p_car(newTail);
00273 b[i] = p2c_int(newHead);
00274 newTail = p2p_cdr(newTail);
00275 i++;
00276 }
00277 bytes = (*env)->NewByteArray(env, bsize);
00278 (*env)->SetByteArrayRegion(env, bytes, 0, bsize, b);
00279
00280
00281 newBytes = (*env)->CallObjectMethod(env, obj, mid, bytes);
00282 size = (*env)->GetArrayLength(env, newBytes);
00283 b = (*env)->GetByteArrayElements(env, newBytes, 0);
00284 check_glstack_overflow(3, pcreg, size*8*sizeof(Cell)) ;
00285
00286 c2p_list(CTXTc reg_term(CTXTc 3));
00287 newHead = p2p_car(reg_term(CTXTc 3));
00288 newTail = p2p_cdr(reg_term(CTXTc 3));
00289 if (b[0]<0)
00290 c2p_int(CTXTc (b[0]+256), newHead);
00291 else
00292 c2p_int(CTXTc b[0], newHead);
00293 i = 1;
00294 while (i < size) {
00295 c2p_list(CTXTc newTail);
00296 newHead = p2p_car(newTail);
00297 newTail = p2p_cdr(newTail);
00298 if (b[i]<0)
00299 c2p_int(CTXTc (b[i]+256), newHead);
00300 else
00301 c2p_int(CTXTc b[i], newHead);
00302 i++;
00303 }
00304 mem_dealloc(b,bsize,INTERPROLOG_SPACE);
00305 c2p_nil(CTXTc newTail);
00306 return 1;
00307 }