string.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 613 行 · 第 1/2 页
C
613 行
v2 = (CVMArrayOfChar *)valueObject2; FIELD_READ_OFFSET(thisStringObject, i); FIELD_READ_OFFSET(anotherStringObject, j); /* Now compare */ if (i == j) { /* This is an optimized case */ while (n-- > 0) { CVMD_arrayReadChar(v1, i, c1); CVMD_arrayReadChar(v2, i, c2); if (c1 != c2) { arguments[0].j.i = (CVMJavaInt)c1 - (CVMJavaInt)c2; return CNI_SINGLE; } i++; } } else { while (n-- > 0) { CVMD_arrayReadChar(v1, i, c1); CVMD_arrayReadChar(v2, j, c2); i++; j++; if (c1 != c2) { arguments[0].j.i = (CVMJavaInt)c1 - (CVMJavaInt)c2; return CNI_SINGLE; } } } arguments[0].j.i = len1 - len2; return CNI_SINGLE;}/* * Class: java/lang/String * Method: hashCode * Signature: ()I */CNIEXPORT CNIResultCodeCNIjava_lang_String_hashCode(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell * thisICell = &arguments[0].j.r; CVMObject *thisObject = CVMID_icellDirect(ee, thisICell); CVMObject *valueObject; CVMArrayOfChar *value; CVMJavaInt offset; CVMJavaInt count; CVMJavaChar c; CVMJavaInt h = 0; FIELD_READ_VALUE(thisObject, valueObject); FIELD_READ_OFFSET(thisObject, offset); FIELD_READ_COUNT(thisObject, count); value = (CVMArrayOfChar *)valueObject; while (count-- > 0 ) { CVMD_arrayReadChar(value, offset, c); h = 31*h + (CVMJavaInt)c; offset ++; } arguments[0].j.i = h; return CNI_SINGLE; }/* * Helper function for indexOf(I)I and indexOf(II)I. */static CVMJavaIntstringIndexOfHelper1(CVMExecEnv* ee, CVMObjectICell *thisICell, CVMJavaInt ch, CVMJavaInt fromIndex) { CVMObject *thisObj = CVMID_icellDirect(ee, thisICell); CVMObject *valueObj; CVMArrayOfChar *valueArr; CVMJavaInt offset; CVMJavaInt count; CVMJavaInt max; CVMJavaInt i; CVMJavaChar c; FIELD_READ_COUNT(thisObj, count); /* The argument fromIndex is always >=0. Guaranteed by caller.*/ if (fromIndex >= count) { return -1; } FIELD_READ_OFFSET(thisObj, offset); FIELD_READ_VALUE(thisObj, valueObj); valueArr = (CVMArrayOfChar *)valueObj; max = offset + count; i = offset + fromIndex; while (i < max) { CVMD_arrayReadChar(valueArr, i, c); if (c == ch) { return i - offset; } i++; } /* Not found. Return -1. */ return -1;}/* * Class: java/lang/String * Method: indexOf * Signature: (I)I */CNIEXPORT CNIResultCodeCNIjava_lang_String_indexOf__I(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell *thisICell = &arguments[0].j.r; CVMJavaInt ch = arguments[1].j.i; arguments[0].j.i = stringIndexOfHelper1(ee, thisICell, ch, 0); return CNI_SINGLE;}/* * Class: java/lang/String * Method: indexOf * Signature: (II)I */CNIEXPORT CNIResultCodeCNIjava_lang_String_indexOf__II(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell *thisICell = &arguments[0].j.r; CVMJavaInt ch = arguments[1].j.i; CVMJavaInt fromIndex = arguments[2].j.i; if (fromIndex < 0) { fromIndex = 0; } arguments[0].j.i = stringIndexOfHelper1(ee, thisICell, ch, fromIndex); return CNI_SINGLE;}/* * Helper function for indexOf(Ljava/lang/String;)I * and indexOf(Ljava/lang/String;I)I. */static CVMJavaIntstringIndexOfHelper2(CVMExecEnv* ee, CVMObjectICell *thisICell, CVMObjectICell *strICell, CVMJavaInt fromIndex){ CVMObject *thisObj = CVMID_icellDirect(ee, thisICell); CVMObject *strObj = CVMID_icellDirect(ee, strICell); CVMObject *vObj1; CVMObject *vObj2; CVMArrayOfChar *v1; CVMArrayOfChar *v2; CVMJavaInt offset; CVMJavaInt strOffset; CVMJavaInt count; CVMJavaInt strCount; CVMJavaInt max; CVMJavaChar first; CVMJavaChar c1; CVMJavaChar c2; CVMJavaInt i; /* Iterates v1 searching for the first char of v2 */ CVMJavaInt j; /* Iterates v1 searching for the rest of v2 */ CVMJavaInt k; /* Iterates v2 */ CVMJavaInt end; /* The caller is responsible for NULL checking for strICell. */ FIELD_READ_COUNT(thisObj, count); FIELD_READ_COUNT(strObj, strCount); if (fromIndex >= count) { if (strCount == 0) { /* * Special case: return the length of the first string * when searching for an empty String, 4276204 */ return count; } return -1; } if (fromIndex < 0) { fromIndex = 0; } if (strCount == 0) { return fromIndex; } FIELD_READ_VALUE(thisObj, vObj1); FIELD_READ_VALUE(strObj, vObj2); FIELD_READ_OFFSET(thisObj, offset); FIELD_READ_OFFSET(strObj, strOffset); v1 = (CVMArrayOfChar *)vObj1; v2 = (CVMArrayOfChar *)vObj2; CVMD_arrayReadChar(v2, strOffset, first); max = offset + (count - strCount); i = offset + fromIndex; while (i <= max) { /* Search for first character. */ CVMD_arrayReadChar(v1, i, c1); if (c1 == first) { /* Found first character, now look at the rest of v2 */ j = i + 1; end = i + strCount; k = strOffset + 1; while(j < end) { CVMD_arrayReadChar(v1, j, c1); CVMD_arrayReadChar(v2, k, c2); if (c1 != c2) { goto continueSearch; } j++; k++; } /* Found */ return i - offset; } continueSearch: i++; } /* If we are here, then we have failed to find v2 in v1.*/ return -1;}/* * Class: java/lang/String * Method: indexOf * Signature: (Ljava/lang/String;)I */CNIEXPORT CNIResultCodeCNIjava_lang_String_indexOf__Ljava_lang_String_2(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell *thisICell = &arguments[0].j.r; CVMObjectICell *strICell = &arguments[1].j.r; /* NULL check for the argument string */ if (CVMID_icellIsNull(strICell)) { CVMthrowNullPointerException(ee, NULL); return CNI_EXCEPTION; } arguments[0].j.i = stringIndexOfHelper2(ee, thisICell, strICell, 0); return CNI_SINGLE;}/* * Class: java/lang/String * Method: indexOf * Signature: (Ljava/lang/String;I)I */CNIEXPORT CNIResultCodeCNIjava_lang_String_indexOf__Ljava_lang_String_2I(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell *thisICell = &arguments[0].j.r; CVMObjectICell *strICell = &arguments[1].j.r; CVMJavaInt fromIndex = arguments[2].j.i; /* NULL check for the argument string */ if (CVMID_icellIsNull(strICell)) { CVMthrowNullPointerException(ee, NULL); return CNI_EXCEPTION; } arguments[0].j.i = stringIndexOfHelper2(ee, thisICell, strICell, fromIndex); return CNI_SINGLE;}/* * Class: java/lang/String * Method: intern * Signature: ()Ljava/lang/String; */CNIEXPORT CNIResultCodeCNIjava_lang_String_intern(CVMExecEnv* ee, CVMStackVal32 *arguments, CVMMethodBlock **p_mb){ CVMObjectICell *thisString = &arguments[0].j.r; JNIEnv* env = CVMexecEnv2JniEnv(ee); CVMObjectICell *result = NULL; CVMD_gcSafeExec(ee, { if ((*env)->PushLocalFrame(env, 4) == 0) { result = (CVMObjectICell *)JVM_InternString( env, (jobject)thisString); if (result != NULL) { CVMID_icellAssign(ee, &arguments[0].j.r, result); } (*env)->PopLocalFrame(env, NULL); } }); if (CVMexceptionOccurred(ee)) { return CNI_EXCEPTION; } return CNI_SINGLE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?