package org.basex.query.util.format;
import static org.basex.query.util.Err.*;
import static org.basex.util.Token.*;
import org.basex.query.QueryException;
import org.basex.util.InputInfo;
import org.basex.util.TokenBuilder;
/**
* Parser for formatting dates.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class DateParser {
/** Input information. */
private final InputInfo input;
/** Picture string. */
private final byte[] pic;
/** Position. */
private int pos;
/**
* Constructor.
* @param ii input info
* @param p picture
*/
DateParser(final InputInfo ii, final byte[] p) {
input = ii;
pic = p;
}
/**
* Returns true if more characters are found.
* @return result of check
*/
boolean more() {
return pos < pic.length;
}
/**
* Returns the next character, or {@code 0} if a marker was found.
* @return character
* @throws QueryException query exception
*/
int next() throws QueryException {
final int ch = cp(pic, pos);
pos += cl(pic, pos);
if(ch == '[' || ch == ']') {
if(!more()) PICDATE.thrw(input, pic);
if(cp(pic, pos) != ch) {
if(ch == ']') PICDATE.thrw(input, pic);
return 0;
}
pos += cl(pic, pos);
}
return ch;
}
/**
* Returns the next marker.
* @return marker or {@code null} reference
* @throws QueryException query exception
*/
byte[] marker() throws QueryException {
final TokenBuilder tb = new TokenBuilder();
while(more()) {
final int ch = cp(pic, pos);
pos += cl(pic, pos);
if(ch == ']') return tb.finish();
if(!Character.isWhitespace(ch)) tb.add(ch);
}
throw PICDATE.thrw(input, pic);
}
}