blob: 1d4d7c7155ec1965bccd4b1efbe14399c5669c4d [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
/**
* {@hide}
*/
public class ATResponseParser
{
/*************************** Instance Variables **************************/
private String mLine;
private int mNext = 0;
private int mTokStart, mTokEnd;
/***************************** Class Methods *****************************/
public
ATResponseParser (String line)
{
mLine = line;
}
public boolean
nextBoolean()
{
// "\s*(\d)(,|$)"
// \d is '0' or '1'
nextTok();
if (mTokEnd - mTokStart > 1) {
throw new ATParseEx();
}
char c = mLine.charAt(mTokStart);
if (c == '0') return false;
if (c == '1') return true;
throw new ATParseEx();
}
/** positive int only */
public int
nextInt()
{
// "\s*(\d+)(,|$)"
int ret = 0;
nextTok();
for (int i = mTokStart ; i < mTokEnd ; i++) {
char c = mLine.charAt(i);
// Yes, ASCII decimal digits only
if (c < '0' || c > '9') {
throw new ATParseEx();
}
ret *= 10;
ret += c - '0';
}
return ret;
}
public String
nextString()
{
nextTok();
return mLine.substring(mTokStart, mTokEnd);
}
public boolean
hasMore()
{
return mNext < mLine.length();
}
private void
nextTok()
{
int len = mLine.length();
if (mNext == 0) {
skipPrefix();
}
if (mNext >= len) {
throw new ATParseEx();
}
try {
// \s*("([^"]*)"|(.*)\s*)(,|$)
char c = mLine.charAt(mNext++);
boolean hasQuote = false;
c = skipWhiteSpace(c);
if (c == '"') {
if (mNext >= len) {
throw new ATParseEx();
}
c = mLine.charAt(mNext++);
mTokStart = mNext - 1;
while (c != '"' && mNext < len) {
c = mLine.charAt(mNext++);
}
if (c != '"') {
throw new ATParseEx();
}
mTokEnd = mNext - 1;
if (mNext < len && mLine.charAt(mNext++) != ',') {
throw new ATParseEx();
}
} else {
mTokStart = mNext - 1;
mTokEnd = mTokStart;
while (c != ',') {
if (!Character.isWhitespace(c)) {
mTokEnd = mNext;
}
if (mNext == len) {
break;
}
c = mLine.charAt(mNext++);
}
}
} catch (StringIndexOutOfBoundsException ex) {
throw new ATParseEx();
}
}
/** Throws ATParseEx if whitespace extends to the end of string */
private char
skipWhiteSpace (char c)
{
int len;
len = mLine.length();
while (mNext < len && Character.isWhitespace(c)) {
c = mLine.charAt(mNext++);
}
if (Character.isWhitespace(c)) {
throw new ATParseEx();
}
return c;
}
private void
skipPrefix()
{
// consume "^[^:]:"
mNext = 0;
int s = mLine.length();
while (mNext < s){
char c = mLine.charAt(mNext++);
if (c == ':') {
return;
}
}
throw new ATParseEx("missing prefix");
}
}