PatchSet 4655 
Date: 2004/04/16 17:16:22
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Two new JNI 1.2 calls for JSDL.

        * kaffe/kaffevm/jni.c, include/jni.h
        (Kaffe_GetStringRegion, Kaffe_GetStringUTFRegion): New JNI 1.2 calls.

        * kaffe/kaffevm/utf8const.c, kaffe/kaffevm/utf8const.h
        (utf8ConstEncodeTo, utf8ConstEncode): Splitted utf8Encode in two
        parts to remove redundant code.

Members: 
        ChangeLog:1.2231->1.2232 
        include/jni.h:1.28->1.29 
        kaffe/kaffevm/jni.c:1.109->1.110 
        kaffe/kaffevm/utf8const.c:1.34->1.35 
        kaffe/kaffevm/utf8const.h:1.3->1.4 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2231 kaffe/ChangeLog:1.2232
--- kaffe/ChangeLog:1.2231      Fri Apr 16 17:12:05 2004
+++ kaffe/ChangeLog     Fri Apr 16 17:16:22 2004
@@ -1,5 +1,14 @@
 2004-04-16  Guilhem Lavaux <[EMAIL PROTECTED]>
 
+       * kaffe/kaffevm/jni.c, include/jni.h
+       (Kaffe_GetStringRegion, Kaffe_GetStringUTFRegion): New JNI 1.2 calls.
+
+       * kaffe/kaffevm/utf8const.c, kaffe/kaffevm/utf8const.h
+       (utf8ConstEncodeTo, utf8ConstEncode): Splitted utf8Encode in two
+       parts to remove redundant code.
+
+2004-04-16  Guilhem Lavaux <[EMAIL PROTECTED]>
+
        * kaffe/kaffevm/support.c
        (callMethodV, callMethodA): If the called method is a JNI, then
        throw the waiting exception in exceptObj.
Index: kaffe/include/jni.h
diff -u kaffe/include/jni.h:1.28 kaffe/include/jni.h:1.29
--- kaffe/include/jni.h:1.28    Mon Mar 29 20:24:29 2004
+++ kaffe/include/jni.h Fri Apr 16 17:16:24 2004
@@ -321,8 +321,8 @@
 
         /* New JNI 1.2 functions */
        
-        void* reserved12; /* GetStringRegion */
-        void* reserved13; /* GetStringUTFRegion */
+        void  (*GetStringRegion)                (JNIEnv*, jstring, jsize, jsize, 
jchar*); 
+        void  (*GetStringUTFRegion)             (JNIEnv*, jstring, jsize, jsize, 
char*); 
        void* (*GetPrimitiveArrayCritical)      (JNIEnv*, jarray, jboolean*);
        void  (*ReleasePrimitiveArrayCritical)  (JNIEnv*, jarray, void*, jint);
         void* reserved16; /* GetStringCritical */
Index: kaffe/kaffe/kaffevm/jni.c
diff -u kaffe/kaffe/kaffevm/jni.c:1.109 kaffe/kaffe/kaffevm/jni.c:1.110
--- kaffe/kaffe/kaffevm/jni.c:1.109     Mon Apr  5 17:43:38 2004
+++ kaffe/kaffe/kaffevm/jni.c   Fri Apr 16 17:16:24 2004
@@ -2806,6 +2806,53 @@
        BEGIN_EXCEPTION_HANDLING_VOID();
 
        KFREE(chars);
+       
+       END_EXCEPTION_HANDLING();
+}
+
+static void
+Kaffe_GetStringRegion(JNIEnv *env, jstring data, jsize start, jsize len, jchar *buf)
+{
+       Hjava_lang_String* const str = (Hjava_lang_String*)data;
+        jchar *str_ptr;
+       jsize str_len;
+       
+        BEGIN_EXCEPTION_HANDLING_VOID();
+
+       str_ptr = STRING_DATA(str);
+       str_len = STRING_SIZE(str);
+
+       if (start >= len || start+len >= str_len) {
+             errorInfo einfo;
+             
+             postException(&einfo, "java.lang.StringIndexOutOfBoundsException");
+             throwError(&einfo);
+       }
+       
+       memcpy(buf, &str_ptr[start], len*sizeof(jchar));
+
+        END_EXCEPTION_HANDLING();
+}
+
+static void
+Kaffe_GetStringUTFRegion(JNIEnv *env, jstring data, jsize start, jsize len, char *buf)
+{
+        Hjava_lang_String* const str = (Hjava_lang_String*)data;
+       jchar *str_ptr;
+       jsize str_len;
+
+       BEGIN_EXCEPTION_HANDLING_VOID();
+       
+       str_ptr = STRING_DATA(str);
+       str_len = STRING_SIZE(str); 
+       if (start >= len || start+len >= str_len) {
+             errorInfo einfo;
+             
+             postException(&einfo, "java.lang.StringIndexOutOfBoundsException");
+             throwError(&einfo);
+       }
+
+       utf8ConstEncodeTo(&str_ptr[start], len, buf);
 
        END_EXCEPTION_HANDLING();
 }
@@ -4430,8 +4477,8 @@
        Kaffe_MonitorEnter,
        Kaffe_MonitorExit,
        Kaffe_GetJavaVM,
-       NULL,
-       NULL,
+       Kaffe_GetStringRegion,
+       Kaffe_GetStringUTFRegion,
        Kaffe_GetPrimitiveArrayCritical,
        Kaffe_ReleasePrimitiveArrayCritical,
        NULL,
Index: kaffe/kaffe/kaffevm/utf8const.c
diff -u kaffe/kaffe/kaffevm/utf8const.c:1.34 kaffe/kaffe/kaffevm/utf8const.c:1.35
--- kaffe/kaffe/kaffevm/utf8const.c:1.34        Fri Apr  2 20:14:42 2004
+++ kaffe/kaffe/kaffevm/utf8const.c     Fri Apr 16 17:16:24 2004
@@ -337,15 +337,41 @@
  * Encode a jchar[] Array into a zero-terminated C string
  * that contains the array's utf8 encoding.
  *
+ * NB.: This function assumes the output array has a sufficient size.
+Caller must free via KFREE.
+ */
+void utf8ConstEncodeTo(const jchar *chars, int clength, char *buf)
+{
+       int i, pos = 0;
+
+       for (i = 0; i < clength; i++) {
+               jchar ch = chars[i];
+               if (ch >= 0x0001 && ch <= 0x007f) {
+                       buf[pos++] = (char) ch;
+               } else if (ch <= 0x07ff) {
+                       buf[pos++] = (char) (0xc0 | (0x3f & (ch >> 6)));
+                       buf[pos++] = (char) (0x80 | (0x3f &  ch));
+               } else {
+                       buf[pos++] = (char) (0xe0 | (0x0f & (ch >> 12)));
+                       buf[pos++] = (char) (0x80 | (0x3f & (ch >>  6)));
+                       buf[pos++] = (char) (0x80 | (0x3f &  ch));
+               }
+       }
+}
+
+/*
+ * Encode a jchar[] Array into a zero-terminated C string
+ * that contains the array's utf8 encoding.
+ *
  * NB.: Caller must free via KFREE.
  */
-char *
+char*
 utf8ConstEncode(const jchar *chars, int clength)
 {
-       int i, pos = 0;
+        char *buf;
+       int i;
        unsigned int size = 0;
-       char * buf;
-
+       
        /* Size output array */
        for (i = 0; i < clength; i++) {
                jchar ch = chars[i];
@@ -361,23 +387,12 @@
        /* Now fill it in */
        buf = KMALLOC(size + 1);
        if (buf == 0) {
-               return (0);
+               return 0;
        }
 
-       for (i = 0; i < clength; i++) {
-               jchar ch = chars[i];
-               if (ch >= 0x0001 && ch <= 0x007f) {
-                       buf[pos++] = (char) ch;
-               } else if (ch <= 0x07ff) {
-                       buf[pos++] = (char) (0xc0 | (0x3f & (ch >> 6)));
-                       buf[pos++] = (char) (0x80 | (0x3f &  ch));
-               } else {
-                       buf[pos++] = (char) (0xe0 | (0x0f & (ch >> 12)));
-                       buf[pos++] = (char) (0x80 | (0x3f & (ch >>  6)));
-                       buf[pos++] = (char) (0x80 | (0x3f &  ch));
-               }
-       }
-       return (buf);
+       utf8ConstEncodeTo(chars, clength, buf);
+       
+       return buf;
 }
 
 /*
Index: kaffe/kaffe/kaffevm/utf8const.h
diff -u kaffe/kaffe/kaffevm/utf8const.h:1.3 kaffe/kaffe/kaffevm/utf8const.h:1.4
--- kaffe/kaffe/kaffevm/utf8const.h:1.3 Thu Jan 22 19:54:23 2004
+++ kaffe/kaffe/kaffevm/utf8const.h     Fri Apr 16 17:16:24 2004
@@ -52,6 +52,13 @@
  * that contains the array's utf8 encoding.
  */
 extern char * utf8ConstEncode(const jchar *chars, int clength);
+/* 
+ * Encode a jchar[] Array into a zero-terminated C string
+ * that contains the array's utf8 encoding.
+ *
+ * WARNING: buf is assumed to have the sufficient size (clength*2 is sufficient).
+ */
+extern void utf8ConstEncodeTo(const jchar *chars, int clength, char *buf);
 
 static inline bool utf8ConstEqual(Utf8Const* a, Utf8Const* b) __UNUSED__;
 static inline bool utf8ConstEqual(Utf8Const* a, Utf8Const* b)

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to