// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.debug.core.util;
/**
* Handles memento string format. The format is just a sequence of strings that are preceded
* with their lengths and decorated with parentheses to make it more human-readable.
*/
public class MementoFormat {
public static void encodeComponent(String component, StringBuilder output) {
output.append(component.length());
output.append('(').append(component).append(')');
}
/**
* A simple parser that reads char sequence as a sequence of strings.
*/
public static class Parser {
private final CharSequence charSequence;
private int pos = 0;
public Parser(CharSequence charSequence) {
this.charSequence = charSequence;
}
public String nextComponent() throws ParserException {
if (pos >= charSequence.length()) {
throw new ParserException("Unexpected end of line"); //$NON-NLS-1$
}
char ch = charSequence.charAt(pos);
pos++;
int num = Character.digit(ch, 10);
if (num == -1) {
throw new ParserException("Digit expected"); //$NON-NLS-1$
}
int len = num;
while (true) {
if (pos >= charSequence.length()) {
throw new ParserException("Unexpected end of line"); //$NON-NLS-1$
}
ch = charSequence.charAt(pos);
if (!Character.isDigit(ch)) {
break;
}
pos++;
num = Character.digit(ch, 10);
if (num == -1) {
throw new ParserException("Digit expected"); //$NON-NLS-1$
}
len = len * 10 + num;
}
pos++;
if (pos + len + 1 > charSequence.length()) {
throw new ParserException("Unexpected end of line"); //$NON-NLS-1$
}
String result = charSequence.subSequence(pos, pos + len).toString();
pos += len + 1;
return result;
}
public boolean hasMore() {
return pos < charSequence.length();
}
public boolean consumeIfFound(String string) {
if (string.length() > charSequence.length() - pos) {
return false;
}
for (int i = 0; i < string.length(); i++) {
if (charSequence.charAt(pos + i) == string.charAt(i)) {
return false;
}
}
pos += string.length();
return true;
}
public String getDebugSnippet() {
int end = Math.min(pos + 100, charSequence.length());
return charSequence.subSequence(pos, end).toString();
}
}
public static class ParserException extends Exception {
ParserException() {
}
ParserException(String message, Throwable cause) {
super(message, cause);
}
ParserException(String message) {
super(message);
}
ParserException(Throwable cause) {
super(cause);
}
}
}