stringmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 2,731 行 · 第 1/5 页
JAVA
2,731 行
{ if (isAssign) { if (argIndex != args.length) env.warning(L.l("{0} vars passed in but saw only {1} '%' args", args.length, argIndex)); return LongValue.create(argIndex); } else { return array; } } /** * Scans a string with a given length. */ private static int sscanfString(StringValue string, int sIndex, int maxLen, Value obj, boolean isAssignment) { int strlen = string.length(); if (maxLen < 0) maxLen = Integer.MAX_VALUE; StringValue sb = string.createStringBuilder(); for (; sIndex < strlen && maxLen-- > 0; sIndex++) { char ch = string.charAt(sIndex); if (! isWhitespace(ch)) sb.append(ch); else break; } sscanfPut(obj, sb, isAssignment); return sIndex; } private static void sscanfPut(Value obj, Value val, boolean isAssignment) { if (isAssignment) obj.set(val); else obj.put(val); } /** * Scans a integer with a given length. */ private static int sscanfInteger(StringValue string, int sIndex, int maxLen, Value obj, boolean isAssign, int base, boolean isUnsigned) { int strlen = string.length(); if (maxLen < 0) maxLen = Integer.MAX_VALUE; int val = 0; int sign = 1; boolean isNotMatched = true; if (sIndex < strlen) { char ch = string.charAt(sIndex); if (ch == '+') { sIndex++; maxLen--; } else if (ch == '-') { sign = -1; sIndex++; maxLen--; } } int topRange = base + '0'; for (; sIndex < strlen && maxLen-- > 0; sIndex++) { char ch = string.charAt(sIndex); if ('0' <= ch && ch < topRange) { val = val * base + ch - '0'; isNotMatched = false; } else if (isNotMatched) { sscanfPut(obj, NullValue.NULL, isAssign); return sIndex; } else break; } if (isUnsigned) { if (sign == -1 && val != 0) sscanfPut(obj, StringValue.create(0xFFFFFFFFL - val + 1), isAssign); else sscanfPut(obj, LongValue.create(val), isAssign); } else sscanfPut(obj, LongValue.create(val * sign), isAssign); return sIndex; } /** * Scans a integer with a given length. */ private static int sscanfHex(StringValue string, int sIndex, int maxLen, Value obj, boolean isAssign) { int strlen = string.length(); if (maxLen < 0) maxLen = Integer.MAX_VALUE; int val = 0; int sign = 1; boolean isMatched = false; if (sIndex < strlen) { char ch = string.charAt(sIndex); if (ch == '+') { sIndex++; maxLen--; } else if (ch == '-') { sign = -1; sIndex++; maxLen--; } } for (; sIndex < strlen && maxLen-- > 0; sIndex++) { char ch = string.charAt(sIndex); if ('0' <= ch && ch <= '9') { val = val * 16 + ch - '0'; isMatched = true; } else if ('a' <= ch && ch <= 'f') { val = val * 16 + ch - 'a' + 10; isMatched = true; } else if ('A' <= ch && ch <= 'F') { val = val * 16 + ch - 'A' + 10; isMatched = true; } else if (! isMatched) { sscanfPut(obj, NullValue.NULL, isAssign); return sIndex; } else break; } sscanfPut(obj, LongValue.create(val * sign), isAssign); return sIndex; } /** * Scans a integer with a given length. */ private static int sscanfScientific(StringValue s, int i, int maxLen, Value obj, boolean isAssign) { if (maxLen < 0) maxLen = Integer.MAX_VALUE; int start = i; int len = s.length(); int ch = 0; if (i < len && maxLen > 0 && ((ch = s.charAt(i)) == '+' || ch == '-')) { i++; maxLen--; } for (; i < len && maxLen > 0 && '0' <= (ch = s.charAt(i)) && ch <= '9'; i++) { maxLen--; } if (ch == '.') { maxLen--; for (i++; i < len && maxLen > 0 && '0' <= (ch = s.charAt(i)) && ch <= '9'; i++) { maxLen--; } } if (ch == 'e' || ch == 'E') { maxLen--; int e = i++; if (start == e) { sscanfPut(obj, NullValue.NULL, isAssign); return start; } if (i < len && maxLen > 0 && (ch = s.charAt(i)) == '+' || ch == '-') { i++; maxLen--; } for (; i < len && maxLen > 0 && '0' <= (ch = s.charAt(i)) && ch <= '9'; i++) { maxLen--; } if (i == e + 1) i = e; } double val; if (i == 0) val = 0; else val = Double.parseDouble(s.substring(start, i).toString()); sscanfPut(obj, DoubleValue.create(val), isAssign); return i; } // XXX: str_getcsv /** * replaces substrings. * * @param search search string * @param replace replacement string * @param subject replacement * @param count return value */ public static Value str_ireplace(Env env, Value search, Value replace, Value subject, @Reference @Optional Value count) { return strReplace(env, search, replace, subject, count, true); } /** * Pads strings * * @param string string * @param length length * @param pad padding string * @param type padding type */ public static StringValue str_pad(StringValue string, int length, @Optional("' '") String pad, @Optional("STR_PAD_RIGHT") int type) { int strLen = string.length(); int padLen = length - strLen; if (padLen <= 0) return string; if (pad == null || pad.length() == 0) pad = " "; int leftPad = 0; int rightPad = 0; switch (type) { case STR_PAD_LEFT: leftPad = padLen; break; case STR_PAD_RIGHT: default: rightPad = padLen; break; case STR_PAD_BOTH: leftPad = padLen / 2; rightPad = padLen - leftPad; break; } int padStringLen = pad.length(); StringValue sb = string.createStringBuilder(string.length() + padLen); for (int i = 0; i < leftPad; i++) sb.append(pad.charAt(i % padStringLen)); sb = sb.append(string); for (int i = 0; i < rightPad; i++) sb.append(pad.charAt(i % padStringLen)); return sb; } /** * repeats a string * * @param string string to repeat * @param count number of times to repeat */ public static Value str_repeat(StringValue string, int count) { StringValue sb = string.createStringBuilder(count * string.length()); for (int i = 0; i < count; i++) sb = sb.append(string); return sb; } /** * replaces substrings. * * @param search search string * @param replace replacement string * @param subject replacement * @param count return value */ public static Value str_replace(Env env, Value search, Value replace, Value subject, @Reference @Optional Value count) { return strReplace(env, search, replace, subject, count, false); } /** * replaces substrings. * * @param search search string * @param replace replacement string * @param subject replacement * @param count return value */ private static Value strReplace(Env env, Value search, Value replace, Value subject, @Reference @Optional Value count, boolean isInsensitive) { count.set(LongValue.ZERO); if (subject.isNull()) return env.getEmptyString(); if (search.isNull()) return subject; if (subject instanceof ArrayValue) { ArrayValue subjectArray = (ArrayValue) subject; ArrayValue resultArray = new ArrayValueImpl(); for (Map.Entry<Value, Value> entry : subjectArray.entrySet()) { Value result = strReplaceImpl(env, search, replace, entry.getValue().toStringValue(), count, isInsensitive); resultArray.append(entry.getKey(), result); } return resultArray; } else { StringValue subjectString = subject.toStringValue(); if (subjectString.length() == 0) return env.getEmptyString(); return strReplaceImpl(env, search, replace, subjectString, count, isInsensitive); } } /** * replaces substrings. * * @param search search string * @param replace replacement string * @param subject replacement * @param count return value */ private static Value strReplaceImpl(Env env, Value search, Value replace, StringValue subject, Value count, boolean isInsensitive) { if (! search.isArray()) { StringValue searchString = search.toStringValue(); if (searchString.length() == 0) return subject; if (replace instanceof ArrayValue) { env.warning(L.l("Array to string conversion")); } subject = strReplaceImpl(env, searchString, replace.toStringValue(), subject, count, isInsensitive); } else if (replace instanceof ArrayValue) { ArrayValue searchArray = (ArrayValue) search; ArrayValue replaceArray = (ArrayValue) replace; Iterator<Value> searchIter = searchArray.values().iterator(); Iterator<Value> replaceIter = replaceArray.values().iterator(); while (searchIter.hasNext()) { Value searchItem = searchIter.next(); Value replaceItem = replaceIter.next(); if (replaceItem == null) replaceItem = NullValue.NULL; subject = strReplaceImpl(env, searchItem.toStringValue(), replaceItem.toStringValue(), subject, count, isInsensitive); } } else { ArrayValue searchArray = (ArrayValue) search; Iterator<Value> searchIter = searchArray.values().iterator(); while (searchIter.hasNext()) { Value searchItem = searchIter.next(); subject = strReplaceImpl(env, searchItem.toStringValue(), replace.toStringValue(), subject, count, isInsensitive); } } return subject; } /** * replaces substrings. * * @param search search string * @param replace replacement string * @param subject replacement * @param countV return value */ private static StringValue strReplaceImpl(Env env, StringValue search, StringValue replace, StringValue subject, Value countV, boolean isInsensitive) { long count = countV.toLong(); int head = 0; int next; int searchLen = search.length(); StringValue result = null; while ((next = indexOf(subject, search, head, isInsensitive)) >= head) { if (result == null) result = subject.createStringBuilder(); result = result.append(subject, head, next); result = result.append(replace); if (head < next + searchLen) head = next + searchLen; else head += 1; count++; } if (count != 0) { countV.set(LongValue.create(count)); if (head > 0 && head < subject.length()) result = result.append(subject, head, subject.length()); return result; } else return subject; } /** * Returns the next index. */ private static int indexOf(StringValue subject, StringValue match, int head, boolean isInsensitive) { if (! isInsensit
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?