interprolog_callback.c

00001 /* 
00002 ** Author(s): Miguel Calejo, Vera Pereira
00003 ** Contact:   interprolog@declarativa.com, http://www.declarativa.com, http://www.xsb.com
00004 ** Copyright (C) XSB Inc., USA, 2001
00005 ** Use and distribution, without any warranties, under the terms of the 
00006 ** GNU Library General Public License, readable in http://www.fsf.org/copyleft/lgpl.html
00007 */
00008 
00009 /* This file provides the implementation for the native methods of NativeEngine.java, 
00010 as well as the XSB Prolog built-in used by InterProlog */
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 // for interrupts:
00018 #include "sig_xsb.h"
00019 #include <signal.h>
00020 // extern int *asynint_ptr;
00021 extern void keyint_proc(int);
00022 
00023 /* The following include is necessary to get the macros and routine
00024    headers */
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         //long T0 = clock(), T1, T2, T3, T4;
00088         jbyte *bytes; char *argString;
00089         
00090         //printf("C:Entering put_bytes - %d mS",T0);
00091         check_glstack_overflow(3, pcreg, (size+4)*2*sizeof(Cell)) ;  /* 2 was 8? dsw*/
00092         
00093         bytes = (*env)->GetByteArrayElements(env, b, 0);
00094         
00095         //T1 = clock() - T0;
00096         //printf("C:got bytes array - %d mS",T1);
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         //T2 = clock() - T0 ;
00126         //printf("C:constructed Prolog list - %d mS",T2);
00127 
00128         theEnv = env;
00129         theObj = obj;
00130         rc = xsb_query(CTXT);
00131         
00132         //T3 = clock() - T0;
00133         //printf("C:Returned from Prolog - %d mS",T3);
00134         
00135         (*env)->ReleaseByteArrayElements(env, b, bytes, 0);
00136         (*env)->ReleaseStringUTFChars(env,jStr, argString);
00137         
00138         //T4 = clock() - T0;
00139         //printf("C:leaving put_bytes - %d mS\n",T4);
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           // may be needed ?(*env)->DeleteLocalRef(env, parameters[i]);
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         /* Do XSB's "interrupt" thing, by simulating a ctrl-C: */
00230         // cf. keyint_proc(SIGINT) in subp.c; 
00231         // *asynint_ptr |= KEYINT_MARK; 
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 // the XSB Prolog built-in used in interprolog.P
00242 // arguments: +length, +byte list, -new byte list
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         //printf("Got the class\n");
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         //printf("Got the method\n");
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         // Calls the method with bytes, expecting the return in newBytes
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 }

Generated on Wed Jul 26 13:30:41 2006 for XSB by  doxygen 1.4.5