Merged revisions 7797-7917 via svnmerge from
[cacao.git] / src / native / vm / cldc1.1 / java_lang_String.c
index 8d5e0eca55a0491b8d252da2a6193b1f81291348..ad60b48bd9e751bd058b10f03ec854c402a297bc 100644 (file)
 
 #include "native/jni.h"
 #include "native/native.h"
-#include "native/include/java_lang_String.h"
+
 #include "native/include/java_lang_Object.h"
+
+#include "native/include/java_lang_String.h"
+
 #include "vm/stringlocal.h"
 
 
+/* native methods implemented by this file ************************************/
+static JNINativeMethod methods[] = {
+       { "hashCode",    "()I",                    (void *) (ptrint) &Java_java_lang_String_hashCode        },
+       { "indexOf",     "(I)I",                   (void *) (ptrint) &Java_java_lang_String_indexOf__I      },
+       { "indexOf",     "(II)I",                  (void *) (ptrint) &Java_java_lang_String_indexOf__II     },
+       { "lastIndexOf", "(I)I",                   (void *) (ptrint) &Java_java_lang_String_lastIndexOf__I  },
+       { "lastIndexOf", "(II)I",                  (void *) (ptrint) &Java_java_lang_String_lastIndexOf__II },
+#if 0
+       { "equals",      "(Ljava/lang/Object;)Z;", (void *) (ptrint) &Java_java_lang_String_equals          },
+#endif
+       { "intern",      "()Ljava/lang/String;",   (void *) (ptrint) &Java_java_lang_String_intern          },
+};
+
+
+/* _Jv_java_lang_String_init ***************************************************
+   Register native functions.
+*******************************************************************************/
+void _Jv_java_lang_String_init(void)
+{
+       utf *u;
+       u = utf_new_char("java/lang/String");
+       native_method_register(u, methods, NATIVE_METHODS_COUNT);
+}
+
+
 /*
  * Class:     java/lang/String
  * Method:    hashCode
@@ -62,14 +96,42 @@ JNIEXPORT s4 JNICALL Java_java_lang_String_hashCode(JNIEnv *env, java_lang_Strin
 
        hash = 0;
 
-       for (i = offset; i < (offset + count); i++) {
-               hash = (31 * hash) + value->data[i];
+       for (i = 0; i < count; i++) {
+               hash = (31 * hash) + value->data[offset + i];
        }
 
        return hash;
 }
 
 
+/*
+ * Class:     java/lang/String
+ * Method:    indexOf
+ * Signature: (I)I
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_String_indexOf__I(JNIEnv *env, java_lang_String *this, s4 ch)
+{
+       java_chararray *value;
+       s4              offset;
+       s4              count;
+       s4              i;
+
+       /* get values from Java object */
+
+       offset = this->offset;
+       count  = this->count;
+       value  = this->value;
+
+       for (i = 0; i < count; i++) {
+               if (value->data[offset + i] == ch) {
+                       return i;
+               }
+       }
+
+       return -1;
+}
+
+
 /*
  * Class:     java/lang/String
  * Method:    indexOf
@@ -96,9 +158,9 @@ JNIEXPORT s4 JNICALL Java_java_lang_String_indexOf__II(JNIEnv *env, java_lang_St
                return -1;
        }
 
-       for (i = offset + fromIndex ; i < (offset + count) ; i++) {
-               if (value->data[i] == ch) {
-                       return i - offset;
+       for (i = fromIndex ; i < count ; i++) {
+               if (value->data[offset + i] == ch) {
+                       return i;
                }
        }
 
@@ -106,6 +168,17 @@ JNIEXPORT s4 JNICALL Java_java_lang_String_indexOf__II(JNIEnv *env, java_lang_St
 }
 
 
+/*
+ * Class:     java/lang/String
+ * Method:    lastIndexOf
+ * Signature: (I)I
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_String_lastIndexOf__I(JNIEnv *env, java_lang_String *this, s4 ch)
+{
+       return Java_java_lang_String_lastIndexOf__II(env, this, ch, this->count - 1);
+}
+
+
 /*
  * Class:     java/lang/String
  * Method:    lastIndexOf
@@ -127,9 +200,9 @@ JNIEXPORT s4 JNICALL Java_java_lang_String_lastIndexOf__II(JNIEnv *env, java_lan
 
        start = ((fromIndex >= count) ? count - 1 : fromIndex);
 
-       for (i = offset + start; i >= offset; i--) {
-               if (value->data[i] == ch) {
-                       return i - offset;
+       for (i = start; i >= 0; i--) {
+               if (value->data[offset + i] == ch) {
+                       return i;
                }
        }