private final boolean endBuf(int start, int range, int minSemiEnd, int maxSemiEnd) { if ((maxSemiEnd - str) < regex.anchorDmin) return true; // mismatch_no_msa; if (range > start) { if ((minSemiEnd - start) > regex.anchorDmax) { start = minSemiEnd - regex.anchorDmax; if (start < end) { start = enc.rightAdjustCharHead(bytes, str, start, end); } else { /* match with empty at end */ start = enc.prevCharHead(bytes, str, end, end); } } if ((maxSemiEnd - (range - 1)) < regex.anchorDmin) { range = maxSemiEnd - regex.anchorDmin + 1; } if (start >= range) return true; // mismatch_no_msa; } else { if ((minSemiEnd - range) > regex.anchorDmax) { range = minSemiEnd - regex.anchorDmax; } if ((maxSemiEnd - start) < regex.anchorDmin) { start = maxSemiEnd - regex.anchorDmin; start = enc.leftAdjustCharHead(bytes, str, start, end); } if (range > start) return true; // mismatch_no_msa; } return false; }
private final boolean endBuf(int start, int range, int minSemiEnd, int maxSemiEnd) { if ((maxSemiEnd - str) < regex.anchorDmin) return true; // mismatch_no_msa; if (range > start) { if ((minSemiEnd - start) > regex.anchorDmax) { start = minSemiEnd - regex.anchorDmax; if (start < end) { start = enc.rightAdjustCharHead(bytes, str, start, end); } else { /* match with empty at end */ start = enc.prevCharHead(bytes, str, end, end); } } if ((maxSemiEnd - (range - 1)) < regex.anchorDmin) { range = maxSemiEnd - regex.anchorDmin + 1; } if (start >= range) return true; // mismatch_no_msa; } else { if ((minSemiEnd - range) > regex.anchorDmax) { range = minSemiEnd - regex.anchorDmax; } if ((maxSemiEnd - start) < regex.anchorDmin) { start = maxSemiEnd - regex.anchorDmin; start = enc.leftAdjustCharHead(bytes, str, start, end); } if (range > start) return true; // mismatch_no_msa; } return false; }
private static int adjustStartPosInternal(RubyString str, Encoding enc, int pos, boolean reverse) { ByteList value = str.getByteList(); int len = value.getRealSize(); if (pos > 0 && enc.maxLength() != 1 && pos < len) { int start = value.getBegin(); if ((reverse ? -pos : len - pos) > 0) { return enc.rightAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } else { return enc.leftAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } } return pos; }
private static int adjustStartPosInternal(RubyString str, Encoding enc, int pos, boolean reverse) { ByteList value = str.getByteList(); int len = value.getRealSize(); if (pos > 0 && enc.maxLength() != 1 && pos < len) { int start = value.getBegin(); if ((reverse ? -pos : len - pos) > 0) { return enc.rightAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } else { return enc.leftAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } } return pos; }
private final int adjustStartPosInternal(RubyString str, Encoding enc, int pos, boolean reverse) { check(); ByteList value = str.getByteList(); int len = value.getRealSize(); if (pos > 0 && enc.maxLength() != 1 && pos < len) { int start = value.getBegin(); if ((reverse ? -pos : len - pos) > 0) { return enc.rightAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } else { return enc.leftAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } } return pos; }
low = p - regex.dMax; high = p - regex.dMin; high = enc.rightAdjustCharHead(bytes, adjrange, high, end);
low = p - regex.dMax; high = p - regex.dMin; high = enc.rightAdjustCharHead(bytes, adjrange, high, end);
private final int adjustStartPosInternal(RubyString str, Encoding enc, int pos, boolean reverse) { check(); ByteList value = str.getByteList(); int len = value.getRealSize(); if (pos > 0 && enc.maxLength() != 1 && pos < len) { int start = value.getBegin(); if ((reverse ? -pos : len - pos) > 0) { return enc.rightAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } else { return enc.leftAdjustCharHead(value.getUnsafeBytes(), start, start + pos, start + len) - start; } } return pos; }
int t = enc.rightAdjustCharHead(bytes, currentOffset + begin, patternIndex + begin, end) - begin; if (t != patternIndex) { currentOffset = t;
int t = enc.rightAdjustCharHead(bytes, currentOffset + begin, patternIndex + begin, end) - begin; if (t != patternIndex) { currentOffset = t;
private int strIndex19(RubyString sub, int offset) { Encoding enc = checkEncoding(sub); if (sub.scanForCodeRange() == CR_BROKEN) return -1; int len = strLength(enc); int slen = sub.strLength(enc); if (offset < 0) { offset += len; if (offset < 0) return -1; } if (len - offset < slen) return -1; byte[]bytes = value.getUnsafeBytes(); int p = value.getBegin(); int end = p + value.getRealSize(); if (offset != 0) { offset = singleByteOptimizable() ? offset : StringSupport.offset(enc, bytes, p, end, offset); p += offset; } if (slen == 0) return offset; while (true) { int pos = value.indexOf(sub.value, p - value.getBegin()); if (pos < 0) return pos; pos -= (p - value.getBegin()); int t = enc.rightAdjustCharHead(bytes, p, p + pos, end); if (t == p + pos) return pos + offset; if ((len -= t - p) <= 0) return -1; offset += t - p; p = t; } }
private int strIndex19(RubyString sub, int offset) { Encoding enc = checkEncoding(sub); if (sub.scanForCodeRange() == CR_BROKEN) return -1; int len = strLength(enc); int slen = sub.strLength(enc); if (offset < 0) { offset += len; if (offset < 0) return -1; } if (len - offset < slen) return -1; byte[]bytes = value.getUnsafeBytes(); int p = value.getBegin(); int end = p + value.getRealSize(); if (offset != 0) { offset = singleByteOptimizable() ? offset : StringSupport.offset(enc, bytes, p, end, offset); p += offset; } if (slen == 0) return offset; while (true) { int pos = value.indexOf(sub.value, p - value.getBegin()); if (pos < 0) return pos; pos -= (p - value.getBegin()); int t = enc.rightAdjustCharHead(bytes, p, p + pos, end); if (t == p + pos) return pos + offset; if ((len -= t - p) <= 0) return -1; offset += t - p; p = t; } }
public static int index(CodeRangeable sourceString, CodeRangeable otherString, int offset, Encoding enc) { if (otherString.scanForCodeRange() == CR_BROKEN) return -1; int sourceLen = strLengthFromRubyString(sourceString); int otherLen = strLengthFromRubyString(otherString); if (offset < 0) { offset += sourceLen; if (offset < 0) return -1; } final ByteList source = sourceString.getByteList(); final ByteList other = otherString.getByteList(); if (sourceLen - offset < otherLen) return -1; byte[] bytes = source.getUnsafeBytes(); int p = source.getBegin(); int end = p + source.getRealSize(); if (offset != 0) { offset = isSingleByteOptimizable(sourceString, enc) ? offset : offset(enc, bytes, p, end, offset); p += offset; } if (otherLen == 0) return offset; while (true) { int pos = source.indexOf(other, p - source.getBegin()); if (pos < 0) return pos; pos -= (p - source.getBegin()); int t = enc.rightAdjustCharHead(bytes, p, p + pos, end); if (t == p + pos) return pos + offset; if ((sourceLen -= t - p) <= 0) return -1; offset += t - p; p = t; } }
public static int index(CodeRangeable sourceString, CodeRangeable otherString, int offset, Encoding enc) { if (otherString.scanForCodeRange() == CR_BROKEN) return -1; int sourceLen = strLengthFromRubyString(sourceString); int otherLen = strLengthFromRubyString(otherString); if (offset < 0) { offset += sourceLen; if (offset < 0) return -1; } final ByteList source = sourceString.getByteList(); final ByteList other = otherString.getByteList(); if (sourceLen - offset < otherLen) return -1; byte[] bytes = source.getUnsafeBytes(); int p = source.getBegin(); int end = p + source.getRealSize(); if (offset != 0) { offset = isSingleByteOptimizable(sourceString, enc) ? offset : offset(enc, bytes, p, end, offset); p += offset; } if (otherLen == 0) return offset; while (true) { int pos = source.indexOf(other, p - source.getBegin()); if (pos < 0) return pos; pos -= (p - source.getBegin()); int t = enc.rightAdjustCharHead(bytes, p, p + pos, end); if (t == p + pos) return pos + offset; if ((sourceLen -= t - p) <= 0) return -1; offset += t - p; p = t; } }
pos = memsearch(sptrBytes, sptr, slen, sBytes, s, len, enc); if (pos < 0) return pos; t = enc.rightAdjustCharHead(sBytes, s, s+pos, e); if (t == s + pos) break; len -= t - s;
private RubyArray stringSplit(ThreadContext context, RubyString spat, boolean limit, int lim, int i) { Ruby runtime = context.runtime; mustnotBroken(context); RubyArray result = runtime.newArray(); Encoding enc = checkEncoding(spat); ByteList pattern = spat.value; byte[] patternBytes = pattern.getUnsafeBytes(); int patternBegin = pattern.getBegin(); int patternRealSize = pattern.getRealSize(); byte[] bytes = value.getUnsafeBytes(); int begin = value.getBegin(); int realSize = value.getRealSize(); int e, p = 0; while (p < realSize && (e = indexOf(bytes, begin, realSize, patternBytes, patternBegin, patternRealSize, p)) >= 0) { int t = enc.rightAdjustCharHead(bytes, p + begin, e + begin, begin + realSize) - begin; if (t != e) { p = t; continue; } result.append(makeShared(runtime, p, e - p)); p = e + pattern.getRealSize(); if (limit && lim <= ++i) break; } if (value.getRealSize() > 0 && (limit || value.getRealSize() > p || lim < 0)) { result.append(makeShared(runtime, p, value.getRealSize() - p)); } return result; }
pos = memsearch(sptrBytes, sptr, slen, sBytes, s, len, enc); if (pos < 0) return pos; t = enc.rightAdjustCharHead(sBytes, s, s+pos, e); if (t == s + pos) break; len -= t - s;
private RubyArray stringSplit(ThreadContext context, RubyString spat, boolean limit, int lim, int i) { Ruby runtime = context.runtime; mustnotBroken(context); RubyArray result = runtime.newArray(); Encoding enc = checkEncoding(spat); ByteList pattern = spat.value; byte[] patternBytes = pattern.getUnsafeBytes(); int patternBegin = pattern.getBegin(); int patternRealSize = pattern.getRealSize(); byte[] bytes = value.getUnsafeBytes(); int begin = value.getBegin(); int realSize = value.getRealSize(); int e, p = 0; while (p < realSize && (e = indexOf(bytes, begin, realSize, patternBytes, patternBegin, patternRealSize, p)) >= 0) { int t = enc.rightAdjustCharHead(bytes, p + begin, e + begin, begin + realSize) - begin; if (t != e) { p = t; continue; } result.append(makeShared(runtime, p, e - p)); p = e + pattern.getRealSize(); if (limit && lim <= ++i) break; } if (value.getRealSize() > 0 && (limit || value.getRealSize() > p || lim < 0)) { result.append(makeShared(runtime, p, value.getRealSize() - p)); } return result; }
private RubyArray stringSplit19(ThreadContext context, RubyString spat, boolean limit, int lim, int i) { Ruby runtime = context.runtime; if (scanForCodeRange() == CR_BROKEN) throw runtime.newArgumentError("invalid byte sequence in " + value.getEncoding()); if (spat.scanForCodeRange() == CR_BROKEN) throw runtime.newArgumentError("invalid byte sequence in " + spat.value.getEncoding()); RubyArray result = runtime.newArray(); Encoding enc = checkEncoding(spat); ByteList pattern = spat.value; byte[] patternBytes = pattern.getUnsafeBytes(); int patternBegin = pattern.getBegin(); int patternRealSize = pattern.getRealSize(); byte[] bytes = value.getUnsafeBytes(); int begin = value.getBegin(); int realSize = value.getRealSize(); int e, p = 0; while (p < realSize && (e = indexOf(bytes, begin, realSize, patternBytes, patternBegin, patternRealSize, p)) >= 0) { int t = enc.rightAdjustCharHead(bytes, p + begin, e + begin, begin + realSize) - begin; if (t != e) { p = t; continue; } result.append(makeShared19(runtime, p, e - p)); p = e + pattern.getRealSize(); if (limit && lim <= ++i) break; } if (value.getRealSize() > 0 && (limit || value.getRealSize() > p || lim < 0)) { result.append(makeShared19(runtime, p, value.getRealSize() - p)); } return result; }
private RubyArray stringSplit19(ThreadContext context, RubyString spat, boolean limit, int lim, int i) { Ruby runtime = context.runtime; if (scanForCodeRange() == CR_BROKEN) throw runtime.newArgumentError("invalid byte sequence in " + value.getEncoding()); if (spat.scanForCodeRange() == CR_BROKEN) throw runtime.newArgumentError("invalid byte sequence in " + spat.value.getEncoding()); RubyArray result = runtime.newArray(); Encoding enc = checkEncoding(spat); ByteList pattern = spat.value; byte[] patternBytes = pattern.getUnsafeBytes(); int patternBegin = pattern.getBegin(); int patternRealSize = pattern.getRealSize(); byte[] bytes = value.getUnsafeBytes(); int begin = value.getBegin(); int realSize = value.getRealSize(); int e, p = 0; while (p < realSize && (e = indexOf(bytes, begin, realSize, patternBytes, patternBegin, patternRealSize, p)) >= 0) { int t = enc.rightAdjustCharHead(bytes, p + begin, e + begin, begin + realSize) - begin; if (t != e) { p = t; continue; } result.append(makeShared19(runtime, p, e - p)); p = e + pattern.getRealSize(); if (limit && lim <= ++i) break; } if (value.getRealSize() > 0 && (limit || value.getRealSize() > p || lim < 0)) { result.append(makeShared19(runtime, p, value.getRealSize() - p)); } return result; }