/*
* © Copyright IBM Corp. 2012
*
* 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.ibm.commons.xml.util;
/**
* String parser utility using to parse XMI date.
*/
public class DateStringParser {
public DateStringParser(String s) {
this.string = s;
this.count = s.length();
}
public boolean isEOF() {
return pointer>=count;
}
public int getCurrentPosition() {
return pointer;
}
public boolean startsWith( char c ) {
if(pointer<count) {
return string.charAt(pointer)==c;
}
return false;
}
public boolean match( char c ) {
if( startsWith(c) ) {
pointer++;
return true;
}
return false;
}
public int matchInteger(int len) {
if(pointer+len>count) {
return Integer.MIN_VALUE;
}
int ptr = pointer;
// Extract the integer
int v = 0;
while( ptr<pointer+len ) {
char c = string.charAt(ptr);
if( Character.isDigit(c) ) {
v = v*10 + (c-'0');
ptr++;
} else {
return Integer.MIN_VALUE;
}
}
pointer = ptr;
return v;
}
public int getNextInteger() {
int ptr = pointer;
// Check if it is a negative number
boolean negate=false;
if( ptr<count && string.charAt(ptr)=='-' ) {
negate = true;
ptr++;
}
// Extract the integer
int v = 0;
while( ptr<count ) {
char c = string.charAt(ptr);
if( Character.isDigit(c) ) {
v = v*10 + (c-'0');
ptr++;
} else {
break;
}
}
// Return the integer if exists, else the min integer valeu
if( ptr>(pointer+(negate?1:0)) ) {
pointer = ptr;
return negate ? -v : v;
} else {
return Integer.MIN_VALUE;
}
}
private String string;
private int count;
private int pointer;
}