private Node expandCaseFoldString(final Node node) { final StringNode sn = (StringNode)node; if (sn.isAmbig() || sn.length() <= 0) { return node; } final char[] chars1 = sn.chars; int pt = sn.p; final int end = sn.end; int altNum = 1; ConsAltNode topRoot = null, r = null; @SuppressWarnings("unused") final ObjPtr<Node> prevNode = new ObjPtr<Node>(); StringNode stringNode = null; while (pt < end) { final char[] items = EncodingHelper.caseFoldCodesByString(regex.caseFoldFlag, chars1[pt]); if (items.length == 0) { if (stringNode == null) { if (r == null && prevNode.p != null) { topRoot = r = ConsAltNode.listAdd(null, prevNode.p); } prevNode.p = stringNode = new StringNode(); // onig_node_new_str(NULL, NULL); if (r != null) { ConsAltNode.listAdd(r, stringNode); } } stringNode.cat(chars1, pt, pt + 1); } else { altNum *= (items.length + 1); if (altNum > THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION) { break; } if (r == null && prevNode.p != null) { topRoot = r = ConsAltNode.listAdd(null, prevNode.p); } expandCaseFoldStringAlt(items.length, items, chars1, pt, 1, end, prevNode); if (r != null) { ConsAltNode.listAdd(r, prevNode.p); } stringNode = null; } pt++; } if (pt < end) { final Node srem = expandCaseFoldMakeRemString(chars1, pt, end); if (prevNode.p != null && r == null) { topRoot = r = ConsAltNode.listAdd(null, prevNode.p); } if (r == null) { prevNode.p = srem; } else { ConsAltNode.listAdd(r, srem); } } /* ending */ final Node xnode = topRoot != null ? topRoot : prevNode.p; swap(node, xnode); return xnode; }
private Node expandCaseFoldString(Node node) { StringNode sn = (StringNode)node; if (sn.isAmbig() || sn.length() <= 0) return node; char[] chars = sn.chars; int p = sn.p; int end = sn.end; int altNum = 1; ConsAltNode topRoot = null, root = null; ObjPtr<Node> prevNode = new ObjPtr<Node>(); StringNode stringNode = null; while (p < end) { char[] items = EncodingHelper.caseFoldCodesByString(regex.caseFoldFlag, chars[p]); if (items.length == 0) { if (stringNode == null) { if (root == null && prevNode.p != null) { topRoot = root = ConsAltNode.listAdd(null, prevNode.p); } prevNode.p = stringNode = new StringNode(); // onig_node_new_str(NULL, NULL); if (root != null) ConsAltNode.listAdd(root, stringNode); } stringNode.cat(chars, p, p + 1); } else { altNum *= (items.length + 1); if (altNum > THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION) break; if (root == null && prevNode.p != null) { topRoot = root = ConsAltNode.listAdd(null, prevNode.p); } expandCaseFoldStringAlt(items.length, items, chars, p, 1, end, prevNode); if (root != null) ConsAltNode.listAdd(root, prevNode.p); stringNode = null; } p++; } if (p < end) { Node srem = expandCaseFoldMakeRemString(chars, p, end); if (prevNode.p != null && root == null) { topRoot = root = ConsAltNode.listAdd(null, prevNode.p); } if (root == null) { prevNode.p = srem; } else { ConsAltNode.listAdd(root, srem); } } /* ending */ Node xnode = topRoot != null ? topRoot : prevNode.p; swap(node, xnode); return xnode; }