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 + -
显示快捷键?