package Scanner import BigString /* * Seuqentially returns substrings of an input string based on delimiters. * (Regex not supported) */ public enum ReturnMode TOKEN_ONLY TOKEN_PLUS_DELIM TOKEN_AND_DELIM public class Delimiter string token int length Delimiter prev = null construct(string token) this.token = token length = token.length() public class Scanner BigString bigInput = null Delimiter lastDelimiter = null int tokenLength = 0 ReturnMode returnMode = ReturnMode.TOKEN_ONLY function setActiveDelimiter(Delimiter delim) delim.prev = null lastDelimiter = delim function setInput(BigString bigString) bigInput = bigString tokenLength = 0 function addDelimiter(string delim) addDelimiter(new Delimiter(delim)) function addDelimiter(Delimiter delim) delim.prev = lastDelimiter lastDelimiter = delim function hasNext() returns boolean if bigInput.getLength() > 0 if returnMode == ReturnMode.TOKEN_ONLY var delim = lastDelimiter while delim != null if bigInput.getLength() == delim.length and bigInput.getString(0, delim.length) == delim.token return false delim = delim.prev return true return false function next() returns string string token = "" tokenLength = 0 while tokenLength <= bigInput.getLength() // Length doesn't exceed input string, check all delimiters var delim = lastDelimiter while delim != null if bigInput.getLength() >= tokenLength+delim.length and bigInput.getString(tokenLength, delim.length) == delim.token // Found delimiter if tokenLength == 0 // Token is only delimiter, return depending on mode switch returnMode case TOKEN_ONLY token = "" tokenLength-- bigInput.startoffset += delim.length case TOKEN_PLUS_DELIM case TOKEN_AND_DELIM token = bigInput.getString(0, delim.length) bigInput.startoffset += delim.length else switch returnMode case TOKEN_ONLY token = bigInput.getString(0, tokenLength) bigInput.startoffset += token.length()+delim.length case TOKEN_PLUS_DELIM token = bigInput.getString(0, tokenLength+delim.length) bigInput.startoffset += token.length()+delim.length case TOKEN_AND_DELIM token = bigInput.getString(0, tokenLength) bigInput.startoffset += token.length() break delim = delim.prev if token.length() > 0 break tokenLength ++ if token.length() < 1 token = bigInput.getString(0) bigInput.startoffset += token.length() return token function close() destroy this function iterator() returns Scanner return this