Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright John E. Lloyd, 2004. All rights reserved. Permission to use, copy, modify and redistribute is granted, provided that this copyright notice is retained and the author is given credit whenever appropriate. This software is distributed "as is", without any warranty, including any implied warranty of merchantability or fitness for a particular use. The author assumes no responsibility for, and shall not be liable for, any special, indirect, or consequential damages, or any damages whatsoever, arising out of or in connection with the use of this software.
 
 package bpiwowar.argparser;

This class is passed as an argument to parse argument strings

Author(s):
Benjamin Piwowarski <benjamin@bpiwowar.net>
 
 public class StringScanner {
 	private char[] buf;
 
 	private int idx;
 
 	private int len;
 
 	private String stringDelimiters = "";

Construct our scanner based on a string

Parameters:
s
 
 	public StringScanner(String s) {
 		 = new char[s.length() + 1];
 		s.getChars(0, s.length(), , 0);
 		 = s.length();
 		[] = 0;
 		 = 0;
 	}
 
 	public int getIndex() {
 		return ;
 	}
 
 	public void setIndex(int i) {
 		if (i < 0) {
 			 = 0;
 		} else if (i > ) {
 			 = ;
 		} else {
 			 = i;
 		}
 	}
 
 	public void setStringDelimiters(String s) {
 	}
 
 	public String getStringDelimiters() {
 		return ;
 	}
 
 	public char scanChar() throws StringScanException {
 		int idxSave = ;
 		try {
 			if ([] == '\'') {
 				return scanQuotedChar();
 			} else {
 				return scanUnquotedChar();
 			}
 		} catch (StringScanException e) {
 			 = idxSave;
 			throw e;
 		}
 	}
 
 	public char scanQuotedChar() throws StringScanException {
 		StringScanException exception = null;
 		char retval = 0;
 		int idxSave = ;
 
 		if ( == ) {
 			exception = new StringScanException("end of input");
 		} else if ([++] == '\'') {
 			try {
 				retval = scanUnquotedChar();
 			} catch (StringScanException e) {
 				exception = e;
 			}
 			if (exception == null) {
 				if ( == ) {
 					exception = new StringScanException("end of input");
 				} else if ([++] != '\'') {
 					exception = new StringScanException( - 1,
 							"unclosed quoted character");
 				}
 			}
 		} else {
			exception = new StringScanException( - 1,
					"uninitialized quoted character");
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return retval;
	}
	public char scanUnquotedChar() throws StringScanException {
		StringScanException exception = null;
		char cretval = 0;
		int idxSave = ;
		if ( == ) {
			exception = new StringScanException("end of input");
else if ((c = [++]) == '\\') {
			if ( == ) {
				exception = new StringScanException("end of input");
else {
				c = [++];
				if (c == '"') {
					retval = '"';
else if (c == '\'') {
					retval = '\'';
else if (c == '\\') {
					retval = '\\';
else if (c == 'n') {
					retval = '\n';
else if (c == 't') {
					retval = '\t';
else if (c == 'b') {
					retval = '\b';
else if (c == 'r') {
					retval = '\r';
else if (c == 'f') {
					retval = '\f';
else if ('0' <= c && c < '8') {
					int v = c - '0';
					for (int j = 0; j < 2; j++) {
						if ( == ) {
							break;
						}
						c = [];
						if ('0' <= c && c < '8' && (v * 8 + (c - '0')) <= 255) {
							v = v * 8 + (c - '0');
							++;
else {
							break;
						}
					}
					retval = (charv;
else {
					exception = new StringScanException( - 1,
							"illegal escape character '" + c + "'");
				}
			}
else {
			retval = c;
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return retval;
	}
		StringScanException exception = null;
		StringBuffer sbuf = new StringBuffer();
		char c;
		int idxSave = ;
		if ( == ) {
			exception = new StringScanException("end of input");
else if ((c = [++]) == '"') {
			while ( <  && (c = []) != '"' && c != '\n') {
				if (c == '\\') {
					try {
catch (StringScanException e) {
						exception = e;
						break;
					}
else {
					++;
				}
				sbuf.append(c);
			}
			if (exception == null &&  >= ) {
				exception = new StringScanException("end of input");
else if (exception == null && c == '\n') {
				exception = new StringScanException(,
						"unclosed quoted string");
else {
				++;
			}
else {
			exception = new StringScanException( - 1,
					"quoted string must start with \"");
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return sbuf.toString();
	}
		StringBuffer sbuf = new StringBuffer();
		int idxSave = ;
		char c;
		if ( == ) {
			StringScanException e = new StringScanException("end of input");
			 = idxSave;
			throw e;
else {
			c = [++];
			while ( <  && !Character.isWhitespace(c)
					&& .indexOf(c) == -1) {
				sbuf.append(c);
				c = [++];
			}
			if (Character.isWhitespace(c) || .indexOf(c) != -1) {
				--;
else {
				sbuf.append(c);
			}
		}
		return sbuf.toString();
	}
	public String scanString() throws StringScanException {
		int idxSave = ;
		try {
			if ([] == '"') {
else {
			}
catch (StringScanException e) {
			 = idxSave;
			throw e;
		}
	}
	public String getString() throws StringScanException {
		StringBuffer sbuf = new StringBuffer();
		while ( < ) {
			sbuf.append([++]);
		}
		return sbuf.toString();
	}
	public long scanInt() throws StringScanException {
		int idxSave = ;
		char c;
		int sign = 1;
		if ((c = []) == '-' || c == '+') {
			sign = (c == '-' ? -1 : 1);
			++;
		}
		try {
			if ( == ) {
				throw new StringScanException("end of input");
else if ((c = []) == '0') {
				if ((c = [ + 1]) == 'x' || c == 'X') {
					 += 2;
					return sign * scanInt(16, false);
else {
					return sign * scanInt(8, false);
				}
else {
				return sign * scanInt(10, false);
			}
catch (StringScanException e) {
			 = idxSave;
			throw e;
		}
	}
	public long scanInt(int radixthrows StringScanException {
		return scanInt(radix/* skipWhite= */true);
	}
	private String baseDesc(int radix) {
		switch (radix) {
		case 10: {
			return "decimal";
		}
		case 8: {
			return "octal";
		}
		case 16: {
			return "hex";
		}
		default: {
			return "base " + radix;
		}
		}
	}
	public long scanInt(int radixboolean skipWhite)
		StringScanException exception = null;
		int charvalidxSave = ;
		char c;
		long val = 0;
		boolean negate = false;
		if (skipWhite) {
		}
		if ((c = []) == '-' || c == '+') {
			negate = (c == '-');
			++;
		}
		if ( >= ) {
			exception = new StringScanException("end of input");
else if ((charval = Character.digit([++], radix)) == -1) {
			exception = new StringScanException( - 1, "malformed "
baseDesc(radix) + " integer");
else {
			val = charval;
			while ((charval = Character.digit([], radix)) != -1) {
				val = val * radix + charval;
				++;
			}
			if (Character.isLetter(c = []) || Character.isDigit(c)
					|| c == '_') {
				exception = new StringScanException("malformed "
baseDesc(radix) + " integer");
			}
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return negate ? -val : val;
	}
	public double scanDouble() throws StringScanException {
		StringScanException exception = null;
		int idxSave = ;
		char c;
		// parse [-][0-9]*[.][0-9]*[eE][-][0-9]*
		boolean hasDigits = false;
		double value = 0;
		if ( == ) {
			exception = new StringScanException("end of input");
else {
			if ((c = []) == '-' || c == '+') {
				++;
			}
			if (matchDigits()) {
				hasDigits = true;
			}
			if ([] == '.') {
				++;
			}
			if (!hasDigits && ([] < '0' || [] > '9')) {
				if ( == ) {
					exception = new StringScanException("end of input");
else {
					exception = new StringScanException(,
							"malformed floating number: no digits");
				}
else {
				if ((c = []) == 'e' || c == 'E') {
					++;
					if ((c = []) == '-' || c == '+') {
						++;
					}
					if ([] < '0' || [] > '9') {
						if ( == ) {
							exception = new StringScanException(,
									"end of input");
else {
							exception = new StringScanException(,
									"malformed floating number: no digits in exponent");
						}
else {
					}
				}
			}
		}
		if (exception == null) {
			// if (Character.isLetterOrDigit(c=buf[idx]) || c == '_')
			// { exception = new StringScanException (idx,
			// "malformed floating number");
			// }
			// else
			{
				try {
					value = Double.parseDouble(new String(idxSave
idxSave));
catch (NumberFormatException e) {
					exception = new StringScanException(,
							"malformed floating number");
				}
			}
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return value;
	}
	public boolean scanBoolean() throws StringScanException {
		StringScanException exception = null;
		int idxSave = ;
		String testStr = "false";
		boolean testval = false;
		char c;
		if ([] == 't') {
			testStr = "true";
			testval = true;
else {
			testval = false;
		}
		int i = 0;
		for (i = 0; i < testStr.length(); i++) {
			if (testStr.charAt(i) != []) {
				if ( == ) {
					exception = new StringScanException("end of input");
				}
				break;
			}
			++;
		}
		if (exception == null) {
			if (i < testStr.length() || Character.isLetterOrDigit(c = [])
					|| c == '_') {
				exception = new StringScanException("illegal boolean");
			}
		}
		if (exception != null) {
			 = idxSave;
			throw exception;
		}
		return testval;
	}
	public boolean matchString(String s) {
		int k = ;
		for (int i = 0; i < s.length(); i++) {
			if (k >=  || s.charAt(i) != [k++]) {
				return false;
			}
		}
		 = k;
		return true;
	}
	public boolean matchDigits() {
		int k = ;
		char c;
		while ((c = [k]) >= '0' && c <= '9') {
			k++;
		}
		if (k > ) {
			 = k;
			return true;
else {
			return false;
		}
	}
	public void skipWhiteSpace() {
		while (Character.isWhitespace([])) {
			++;
		}
	}
	public boolean atEnd() {
		return  == ;
	}
	public boolean atBeginning() {
		return  == 0;
	}
	public void ungetc() {
		if ( > 0) {
			--;
		}
	}
	public char getc() {
		char c = [];
		if ( < ) {
			++;
		}
		return c;
	}
	public char peekc() {
		return [];
	}
	public String substring(int i0int i1) {
		if (i0 < 0) {
			i0 = 0;
else if (i0 >= ) {
			i0 =  - 1;
		}
		if (i1 < 0) {
			i1 = 0;
else if (i1 > ) {
			i1 = ;
		}
		if (i1 <= i0) {
			return "";
		}
		return new String(i0i1 - i0);
	}
	public String substring(int i0) {
		if (i0 < 0) {
			i0 = 0;
		}
		if (i0 >= ) {
			return "";
else {
			return new String(i0 - i0);
		}
	}
New to GrepCode? Check out our FAQ X