if (depth[next] <= level) {
return UntypedAtomicValue.ZERO_LENGTH_UNTYPED;
} else if (nodeKind[next] == Type.TEXT && depth[next+1] <= level) {
int length = beta[next];
int start = alpha[next];
return new UntypedAtomicValue(charBuffer.subSequence(start, start+length));
} else if (nodeKind[next] == Type.WHITESPACE_TEXT && depth[next+1] <= level) {
return new UntypedAtomicValue(WhitespaceTextImpl.getStringValue(this, next));
}
// Now handle the general case
FastStringBuffer sb = null;
while (next < numberOfNodes && depth[next] > level) {
if (nodeKind[next]==Type.TEXT) {
if (sb==null) {
sb = new FastStringBuffer(1024);
}
sb.append(TinyTextImpl.getStringValue(this, next));
} else if (nodeKind[next]==Type.WHITESPACE_TEXT) {
if (sb==null) {
sb = new FastStringBuffer(1024);
}
WhitespaceTextImpl.appendStringValue(this, next, sb);
}
next++;
}
if (sb==null) {
return UntypedAtomicValue.ZERO_LENGTH_UNTYPED;
} else {
return new UntypedAtomicValue(sb.condense());
}
case Type.TEXT:
return new UntypedAtomicValue(TinyTextImpl.getStringValue(this, nodeNr));
case Type.WHITESPACE_TEXT:
return new UntypedAtomicValue(WhitespaceTextImpl.getStringValue(this, nodeNr));
case Type.COMMENT:
case Type.PROCESSING_INSTRUCTION:
int start2 = alpha[nodeNr];
int len2 = beta[nodeNr];
if (len2==0) return UntypedAtomicValue.ZERO_LENGTH_UNTYPED;