private void skipDelims(final CharSequence buf, final ParserCursor cursor) { int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if (DELIMS.get(current)) { pos++; } else { break; } } cursor.updatePos(pos); }
private void copyContent(final CharSequence buf, final ParserCursor cursor, final StringBuilder dst) { int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if (DELIMS.get(current)) { break; } pos++; dst.append(current); } cursor.updatePos(pos); }
@Override String parseHeaderElement(final CharSequence buf, final ParserCursor cursor) { final String token = this.parser.parseToken(buf, cursor, COMMA); if (!cursor.atEnd()) { final int pos = cursor.getPos(); if (buf.charAt(pos) == ',') { cursor.updatePos(pos + 1); } } return !TextUtils.isBlank(token) ? token : null; }
@Override String parseHeaderElement(final CharSequence buf, final ParserCursor cursor) { final String token = this.parser.parseToken(buf, cursor, COMMA); if (!cursor.atEnd()) { final int pos = cursor.getPos(); if (buf.charAt(pos) == ',') { cursor.updatePos(pos + 1); } } return !TextUtils.isBlank(token) ? token : null; }
private void bufferHeaderValue() { this.cursor = null; this.buffer = null; while (this.headerIt.hasNext()) { final Header h = this.headerIt.next(); if (h instanceof FormattedHeader) { this.buffer = ((FormattedHeader) h).getBuffer(); this.cursor = new ParserCursor(0, this.buffer.length()); this.cursor.updatePos(((FormattedHeader) h).getValuePos()); break; } final String value = h.getValue(); if (value != null) { this.buffer = value; this.cursor = new ParserCursor(0, value.length()); break; } } }
private void bufferHeaderValue() { this.cursor = null; this.buffer = null; while (this.headerIt.hasNext()) { final Header h = this.headerIt.next(); if (h instanceof FormattedHeader) { this.buffer = ((FormattedHeader) h).getBuffer(); this.cursor = new ParserCursor(0, this.buffer.length()); this.cursor.updatePos(((FormattedHeader) h).getValuePos()); break; } final String value = h.getValue(); if (value != null) { this.buffer = value; this.cursor = new ParserCursor(0, value.length()); break; } } }
public static Set<String> parseTokens(final CharSequence src, final ParserCursor cursor) { Args.notNull(src, "Source"); Args.notNull(cursor, "Cursor"); final Set<String> tokens = new LinkedHashSet<>(); while (!cursor.atEnd()) { final int pos = cursor.getPos(); if (src.charAt(pos) == ',') { cursor.updatePos(pos + 1); } final String token = TokenParser.INSTANCE.parseToken(src, cursor, COMMA); if (!TextUtils.isBlank(token)) { tokens.add(token); } } return tokens; }
public static Set<String> parseTokens(final CharSequence src, final ParserCursor cursor) { Args.notNull(src, "Source"); Args.notNull(cursor, "Cursor"); final Set<String> tokens = new LinkedHashSet<>(); while (!cursor.atEnd()) { final int pos = cursor.getPos(); if (src.charAt(pos) == ',') { cursor.updatePos(pos + 1); } final String token = TokenParser.INSTANCE.parseToken(src, cursor, COMMA); if (!TextUtils.isBlank(token)) { tokens.add(token); } } return tokens; }
/** * Transfers content into the destination buffer until a whitespace character, a quote, * or any of the given delimiters is encountered. * * @param buf buffer with the sequence of chars to be parsed * @param cursor defines the bounds and current position of the buffer * @param delimiters set of delimiting characters. Can be {@code null} if the value * is delimited by a whitespace or a quote only. * @param dst destination buffer */ public void copyUnquotedContent(final CharSequence buf, final ParserCursor cursor, final BitSet delimiters, final StringBuilder dst) { Args.notNull(buf, "Char sequence"); Args.notNull(cursor, "Parser cursor"); Args.notNull(dst, "String builder"); int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if ((delimiters != null && delimiters.get(current)) || isWhitespace(current) || current == DQUOTE) { break; } pos++; dst.append(current); } cursor.updatePos(pos); }
/** * Transfers content into the destination buffer until a whitespace character or any of * the given delimiters is encountered. * * @param buf buffer with the sequence of chars to be parsed * @param cursor defines the bounds and current position of the buffer * @param delimiters set of delimiting characters. Can be {@code null} if the value * is delimited by a whitespace only. * @param dst destination buffer */ public void copyContent(final CharSequence buf, final ParserCursor cursor, final BitSet delimiters, final StringBuilder dst) { Args.notNull(buf, "Char sequence"); Args.notNull(cursor, "Parser cursor"); Args.notNull(dst, "String builder"); int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if ((delimiters != null && delimiters.get(current)) || isWhitespace(current)) { break; } pos++; dst.append(current); } cursor.updatePos(pos); }
/** * Skips semantically insignificant whitespace characters and moves the cursor to the closest * non-whitespace character. * * @param buf buffer with the sequence of chars to be parsed * @param cursor defines the bounds and current position of the buffer */ public void skipWhiteSpace(final CharSequence buf, final ParserCursor cursor) { Args.notNull(buf, "Char sequence"); Args.notNull(cursor, "Parser cursor"); int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if (!isWhitespace(current)) { break; } pos++; } cursor.updatePos(pos); }
/** * Skips semantically insignificant whitespace characters and moves the cursor to the closest * non-whitespace character. * * @param buf buffer with the sequence of chars to be parsed * @param cursor defines the bounds and current position of the buffer */ public void skipWhiteSpace(final CharSequence buf, final ParserCursor cursor) { Args.notNull(buf, "Char sequence"); Args.notNull(cursor, "Parser cursor"); int pos = cursor.getPos(); final int indexFrom = cursor.getPos(); final int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { final char current = buf.charAt(i); if (!isWhitespace(current)) { break; } pos++; } cursor.updatePos(pos); }
@Override public NameValuePair parseNameValuePair(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS); if (cursor.atEnd()) { return new BasicNameValuePair(name, null); } final int delim = buffer.charAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim != '=') { return new BasicNameValuePair(name, null); } final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new BasicNameValuePair(name, value); }
public static Set<String> parseTokens(final Header header) { Args.notNull(header, "Header"); if (header instanceof FormattedHeader) { final CharArrayBuffer buf = ((FormattedHeader) header).getBuffer(); final ParserCursor cursor = new ParserCursor(0, buf.length()); cursor.updatePos(((FormattedHeader) header).getValuePos()); return parseTokens(buf, cursor); } final String value = header.getValue(); final ParserCursor cursor = new ParserCursor(0, value.length()); return parseTokens(value, cursor); }
@Override public NameValuePair parseNameValuePair(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS); if (cursor.atEnd()) { return new BasicNameValuePair(name, null); } final int delim = buffer.charAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim != '=') { return new BasicNameValuePair(name, null); } final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new BasicNameValuePair(name, value); }
public static Set<String> parseTokens(final Header header) { Args.notNull(header, "Header"); if (header instanceof FormattedHeader) { final CharArrayBuffer buf = ((FormattedHeader) header).getBuffer(); final ParserCursor cursor = new ParserCursor(0, buf.length()); cursor.updatePos(((FormattedHeader) header).getValuePos()); return parseTokens(buf, cursor); } final String value = header.getValue(); final ParserCursor cursor = new ParserCursor(0, value.length()); return parseTokens(value, cursor); }
private NameValuePair parseParameter(final CharArrayBuffer buf, final ParserCursor cursor) { final String name = parseToken(buf, cursor, EQUAL_OR_COMMA_OR_PLUS); if (cursor.atEnd()) { return new BasicNameValuePair(name, null); } final int delim = buf.charAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim == ',') { return new BasicNameValuePair(name, null); } final String value = parseValue(buf, cursor, COMMA_OR_PLUS); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new BasicNameValuePair(name, value); }
NameValuePair parseTokenOrParameter(final CharSequence buffer, final ParserCursor cursor) { tokenParser.skipWhiteSpace(buffer, cursor); final String token = tokenParser.parseToken(buffer, cursor, TERMINATORS); if (!cursor.atEnd()) { if (buffer.charAt(cursor.getPos()) == BLANK) { tokenParser.skipWhiteSpace(buffer, cursor); } if (!cursor.atEnd() && buffer.charAt(cursor.getPos()) == EQUAL_CHAR) { cursor.updatePos(cursor.getPos() + 1); final String value = tokenParser.parseValue(buffer, cursor, DELIMITER); return new BasicNameValuePair(token, value); } } return new BasicNameValuePair(token, null); }
@Test public void testTokenParsingWithQuotedPairs() throws Exception { final String s = "raw: \"\\\"some\\stuff\\\\\""; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(0, cursor.getPos()); final StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, TokenParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.charAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); final StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals("\"some\\stuff\\", strbuf2.toString()); }
@Test public void testBasicTokenParsing() throws Exception { final String s = " raw: \" some stuff \""; final CharArrayBuffer raw = createBuffer(s); final ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(3, cursor.getPos()); final StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, TokenParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(6, cursor.getPos()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.charAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(8, cursor.getPos()); final StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals(" some stuff ", strbuf2.toString()); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); parser.skipWhiteSpace(raw, cursor); Assert.assertTrue(cursor.atEnd()); }