package org.joni.ast;
import org.joni.Config;
import org.joni.Option;
import org.joni.constants.internal.EncloseType;
public final class EncloseNode extends StateNode implements EncloseType {
public final int type;
public int regNum;
public int option;
public Node target;
public int callAddr;
public int minLength;
public int maxLength;
public int charLength;
public int optCount;
public Node containingAnchor;
public EncloseNode(int type) {
super(ENCLOSE);
this.type = type;
callAddr = -1;
}
public static EncloseNode newMemory(int option, boolean isNamed) {
EncloseNode en = new EncloseNode(MEMORY);
if (Config.USE_SUBEXP_CALL) en.option = option;
if (isNamed) en.setNamedGroup();
return en;
}
public static EncloseNode newOption(int option) {
EncloseNode en = new EncloseNode(OPTION);
en.option = option;
return en;
}
@Override
protected void setChild(Node child) {
target = child;
}
@Override
protected Node getChild() {
return target;
}
public void setTarget(Node tgt) {
target = tgt;
tgt.parent = this;
}
@Override
public String getName() {
return "Enclose";
}
@Override
public String toString(int level) {
StringBuilder value = new StringBuilder(super.toString(level));
value.append("\n type: " + typeToString());
value.append("\n regNum: " + regNum);
value.append(", option: " + Option.toString(option));
value.append(", callAddr: " + callAddr);
value.append(", minLength: " + minLength);
value.append(", maxLength: " + maxLength);
value.append(", charLength: " + charLength);
value.append(", optCount: " + optCount);
value.append("\n target: " + pad(target, level + 1));
return value.toString();
}
public String typeToString() {
StringBuilder types = new StringBuilder();
if (isStopBacktrack()) types.append("STOP_BACKTRACK ");
if (isMemory()) types.append("MEMORY ");
if (isOption()) types.append("OPTION ");
if (isCondition()) types.append("CONDITION ");
if (isAbsent()) types.append("ABSENT ");
return types.toString();
}
public void setEncloseStatus(int flag) {
state |= flag;
}
public void clearEncloseStatus(int flag) {
state &= ~flag;
}
public boolean isMemory() {
return (type & MEMORY) != 0;
}
public boolean isOption() {
return (type & OPTION) != 0;
}
public boolean isCondition() {
return (type & CONDITION) != 0;
}
public boolean isStopBacktrack() {
return (type & STOP_BACKTRACK) != 0;
}
public boolean isAbsent() {
return (type & ABSENT) != 0;
}
}