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