📄 natstring.cc
字号:
array = new_array; avail = new_size - outpos; } else { outpos += done; avail -= done; } } converter->done (); this->data = array; this->boffset = (char *) elements (array) - (char *) array; this->count = outpos;}jbooleanjava::lang::String::equals(jobject anObject){ if (anObject == NULL) return false; if (anObject == this) return true; if (anObject->getClass() != &StringClass) return false; jstring other = (jstring) anObject; if (count != other->count) return false; /* if both are interned, return false. */ jint i = count; jchar *xptr = JvGetStringChars (this); jchar *yptr = JvGetStringChars (other); while (--i >= 0) { if (*xptr++ != *yptr++) return false; } return true;}jcharjava::lang::String::charAt(jint i){ if (i < 0 || i >= count) throw new java::lang::StringIndexOutOfBoundsException; return JvGetStringChars(this)[i];}voidjava::lang::String::getChars(jint srcBegin, jint srcEnd, jcharArray dst, jint dstBegin){ jint dst_length = JvGetArrayLength (dst); if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count) throw new java::lang::StringIndexOutOfBoundsException; if (dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) throw new ArrayIndexOutOfBoundsException; jchar *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; while (--i >= 0) *dPtr++ = *sPtr++;}jbyteArrayjava::lang::String::getBytes (jstring enc){ jint todo = length(); jint buflen = todo; jbyteArray buffer = JvNewByteArray(todo); jint bufpos = 0; jint offset = 0; gnu::gcj::convert::UnicodeToBytes *converter = gnu::gcj::convert::UnicodeToBytes::getEncoder(enc); while (todo > 0 || converter->havePendingBytes()) { converter->setOutput(buffer, bufpos); int converted = converter->write(this, offset, todo, NULL); bufpos = converter->count; if (converted == 0 && bufpos == converter->count) { buflen *= 2; jbyteArray newbuffer = JvNewByteArray(buflen); memcpy (elements (newbuffer), elements (buffer), bufpos); buffer = newbuffer; } else bufpos = converter->count; offset += converted; todo -= converted; } converter->done (); if (bufpos == buflen) return buffer; jbyteArray result = JvNewByteArray(bufpos); memcpy (elements (result), elements (buffer), bufpos); return result;}voidjava::lang::String::getBytes(jint srcBegin, jint srcEnd, jbyteArray dst, jint dstBegin){ jint dst_length = JvGetArrayLength (dst); if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count) throw new java::lang::StringIndexOutOfBoundsException; if (dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) throw new ArrayIndexOutOfBoundsException; jbyte *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; while (--i >= 0) *dPtr++ = (jbyte) *sPtr++;}jcharArrayjava::lang::String::toCharArray(){ jcharArray array = JvNewCharArray(count); jchar *dPtr = elements (array); jchar *sPtr = JvGetStringChars (this); jint i = count; while (--i >= 0) *dPtr++ = *sPtr++; return array;}jbooleanjava::lang::String::equalsIgnoreCase (jstring anotherString){ if (anotherString == NULL || count != anotherString->count) return false; jchar *tptr = JvGetStringChars (this); jchar *optr = JvGetStringChars (anotherString); jint i = count; while (--i >= 0) { jchar tch = *tptr++; jchar och = *optr++; if (tch != och && (java::lang::Character::toLowerCase (tch) != java::lang::Character::toLowerCase (och)) && (java::lang::Character::toUpperCase (tch) != java::lang::Character::toUpperCase (och))) return false; } return true;}jbooleanjava::lang::String::regionMatches (jint toffset, jstring other, jint ooffset, jint len){ if (toffset < 0 || ooffset < 0 || toffset + len > count || ooffset + len > other->count) return false; jchar *tptr = JvGetStringChars (this) + toffset; jchar *optr = JvGetStringChars (other) + ooffset; jint i = len; while (--i >= 0) { if (*tptr++ != *optr++) return false; } return true;}jintjava::lang::String::compareTo (jstring anotherString){ jchar *tptr = JvGetStringChars (this); jchar *optr = JvGetStringChars (anotherString); jint tlen = this->count; jint olen = anotherString->count; jint i = tlen > olen ? olen : tlen; while (--i >= 0) { jchar tch = *tptr++; jchar och = *optr++; if (tch != och) return (jint) tch - (jint) och; } return tlen - olen;}jbooleanjava::lang::String::regionMatches (jboolean ignoreCase, jint toffset, jstring other, jint ooffset, jint len){ if (toffset < 0 || ooffset < 0 || toffset + len > count || ooffset + len > other->count) return false; jchar *tptr = JvGetStringChars (this) + toffset; jchar *optr = JvGetStringChars (other) + ooffset; jint i = len; if (ignoreCase) while (--i >= 0) { jchar tch = *tptr++; jchar och = *optr++; if ((java::lang::Character::toLowerCase (tch) != java::lang::Character::toLowerCase (och)) && (java::lang::Character::toUpperCase (tch) != java::lang::Character::toUpperCase (och))) return false; } else while (--i >= 0) { jchar tch = *tptr++; jchar och = *optr++; if (tch != och) return false; } return true;}jbooleanjava::lang::String::startsWith (jstring prefix, jint toffset){ jint i = prefix->count; if (toffset < 0 || toffset + i > count) return false; jchar *xptr = JvGetStringChars (this) + toffset; jchar *yptr = JvGetStringChars (prefix); while (--i >= 0) { if (*xptr++ != *yptr++) return false; } return true;}jintjava::lang::String::indexOf (jint ch, jint fromIndex){ if (fromIndex < 0) fromIndex = 0; jchar *ptr = JvGetStringChars(this); for (;; ++fromIndex) { if (fromIndex >= count) return -1; if (ptr[fromIndex] == ch) return fromIndex; }}jintjava::lang::String::indexOf (jstring s, jint fromIndex){ const jchar *const xchars = JvGetStringChars(s); const jchar *const ychars = JvGetStringChars(this) + fromIndex; const int xlength = s->length (); const int ylength = length () - fromIndex; int i = 0; int j = 0; while (i < ylength && j < xlength) { if (xchars[j] != ychars[i]) { i = i - j + 1; j = 0; } else i++, j++; } if (j >= xlength) return fromIndex + i - xlength; else return -1;} jintjava::lang::String::lastIndexOf (jint ch, jint fromIndex){ if (fromIndex >= count) fromIndex = count - 1; jchar *ptr = JvGetStringChars(this); for (;; --fromIndex) { if (fromIndex < 0) return -1; if (ptr[fromIndex] == ch) return fromIndex; }}jstringjava::lang::String::substring (jint beginIndex, jint endIndex){ if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) throw new StringIndexOutOfBoundsException; if (beginIndex == 0 && endIndex == count) return this; jint newCount = endIndex - beginIndex; if (newCount <= 8) // Optimization, mainly for GC. return JvNewString(JvGetStringChars(this) + beginIndex, newCount); jstring s = new String(); s->data = data; s->count = newCount; s->boffset = boffset + sizeof(jchar) * beginIndex; return s;}jstringjava::lang::String::concat(jstring str){ jint str_count = str->count; if (str_count == 0) return this; jstring result = JvAllocString(count + str_count); jchar *dstPtr = JvGetStringChars(result); jchar *srcPtr = JvGetStringChars(this); jint i = count; while (--i >= 0) *dstPtr++ = *srcPtr++; srcPtr = JvGetStringChars(str); i = str->count; while (--i >= 0) *dstPtr++ = *srcPtr++; return result;}jstringjava::lang::String::replace (jchar oldChar, jchar newChar){ jint i; jchar* chrs = JvGetStringChars (this); for (i = 0; ; i++) { if (i == count) return this; if (chrs[i] == oldChar) break; } jstring result = JvAllocString (count); jchar *dPtr = JvGetStringChars (result); for (int j = 0; j < i; j++) *dPtr++ = chrs[j]; for (; i < count; i++) { jchar ch = chrs[i]; if (ch == oldChar) ch = newChar; *dPtr++ = ch; } return result;}jstringjava::lang::String::toLowerCase (java::util::Locale *locale){ jint i; jchar* chrs = JvGetStringChars(this); jchar ch = 0; bool handle_tr = false; if (locale != NULL) { String *lang = locale->getLanguage (); if (lang->length () == 2 && lang->charAt (0) == 't' && lang->charAt (1) == 'r') handle_tr = true; } for (i = 0; ; i++) { if (i == count) return this; jchar origChar = chrs[i]; if (handle_tr && (origChar == CAPITAL_I || origChar == CAPITAL_I_WITH_DOT)) break; ch = java::lang::Character::toLowerCase(origChar); if (ch != origChar) break; } jstring result = JvAllocString(count); jchar *dPtr = JvGetStringChars (result); for (int j = 0; j < i; j++) *dPtr++ = chrs[j]; *dPtr++ = ch; i++; for (; i < count; i++) { if (handle_tr && chrs[i] == CAPITAL_I) *dPtr++ = SMALL_DOTLESS_I; else if (handle_tr && chrs[i] == CAPITAL_I_WITH_DOT) *dPtr++ = SMALL_I; else *dPtr++ = java::lang::Character::toLowerCase(chrs[i]); } return result;}jstringjava::lang::String::toUpperCase (java::util::Locale *locale){ jint i; jchar* chrs = JvGetStringChars(this); jchar ch; // When handling a specific locale there might be special rules. // Currently all existing rules are simply handled inline, as there // are only two and they are documented in the online 1.2 docs. bool handle_esset = locale != NULL; bool handle_tr = false; if (locale != NULL) { String *lang = locale->getLanguage (); if (lang->length () == 2 && lang->charAt (0) == 't' && lang->charAt (1) == 'r') handle_tr = true; } int new_count = count; bool new_string = false; for (i = 0; ; i++) { if (i == count) break; jchar origChar = chrs[i]; if (handle_esset && origChar == ESSET) { ++new_count; new_string = true; } else if (handle_tr && (origChar == SMALL_I || origChar == SMALL_DOTLESS_I)) new_string = true; else { ch = java::lang::Character::toUpperCase(origChar); if (ch != origChar) new_string = true; } if (new_string && ! handle_esset) break; } if (! new_string) return this; jstring result = JvAllocString(new_count); jchar *dPtr = JvGetStringChars (result); for (i = 0; i < count; i++) { if (handle_esset && chrs[i] == ESSET) { *dPtr++ = CAPITAL_S; *dPtr++ = CAPITAL_S; } else if (handle_tr && chrs[i] == SMALL_I) *dPtr++ = CAPITAL_I_WITH_DOT; else if (handle_tr && chrs[i] == SMALL_DOTLESS_I) *dPtr++ = CAPITAL_I; else *dPtr++ = java::lang::Character::toUpperCase(chrs[i]); } return result;}jstringjava::lang::String::trim (){ jchar* chrs = JvGetStringChars(this); if (count == 0 || (chrs[0] > ' ' && chrs[count-1] > ' ')) return this; jint preTrim = 0; for (;; preTrim++) { if (preTrim == count) return new String(); if (chrs[preTrim] > ' ') break; } jint endTrim = count; while (chrs[endTrim-1] <= ' ') endTrim--; return substring(preTrim, endTrim);}jstringjava::lang::String::valueOf(jcharArray data, jint offset, jint count){ jint data_length = JvGetArrayLength (data); if (offset < 0 || count < 0 || offset+count > data_length) throw new ArrayIndexOutOfBoundsException; jstring result = JvAllocString(count); jchar *sPtr = elements (data) + offset; jchar *dPtr = JvGetStringChars(result); while (--count >= 0) *dPtr++ = *sPtr++; return result;}jstringjava::lang::String::valueOf(jchar c){ jstring result = JvAllocString(1); JvGetStringChars (result)[0] = c; return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -