| /* Copyright (c) 2001-2010, The HSQL Development Group |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * Neither the name of the HSQL Development Group nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| |
| package org.hsqldb.cmdline.sqltool; |
| |
| /* @(#)$Id: Token.java 3481 2010-02-26 18:05:06Z fredt $ */ |
| |
| public class Token { |
| public static final int SQL_TYPE = 0; |
| public static final int SPECIAL_TYPE = 1; |
| public static final int PL_TYPE = 2; |
| public static final int EDIT_TYPE = 3; |
| public static final int RAW_TYPE = 4; |
| public static final int RAWEXEC_TYPE = 5; |
| public static final int SYNTAX_ERR_TYPE = 6; |
| public static final int UNTERM_TYPE = 7; |
| public static final int BUFFER_TYPE = 8; |
| public static final int MACRO_TYPE = 9; |
| public int line; |
| public TokenList nestedBlock = null; |
| |
| public String[] typeString = { |
| "SQL", "SPECIAL", "PL", "EDIT", "RAW", "RAWEXEC", "SYNTAX", |
| "UNTERM", "BUFFER", "MACRO" |
| }; |
| public char[] typeChar = { |
| 'S', '\\', '*', 'E', 'R', 'X', '!', '<', '>', '/' |
| }; |
| |
| public String getTypeString() { |
| return typeString[type]; |
| } |
| public char getTypeChar() { |
| return typeChar[type]; |
| } |
| |
| public String val; |
| public int type; |
| public Token(int inType, String inVal, int inLine) { |
| val = inVal; type = inType; line = inLine + 1; |
| switch (inType) { |
| case SPECIAL_TYPE: |
| case EDIT_TYPE: |
| case PL_TYPE: |
| case MACRO_TYPE: |
| // These types must be not null. May be just whitespace. |
| // Will be trimmed. |
| if (val == null) throw new IllegalArgumentException( |
| "Null String value for scanner token"); |
| val = val.trim(); // Worry about efficiency later |
| break; |
| |
| case SYNTAX_ERR_TYPE: |
| case BUFFER_TYPE: |
| case RAW_TYPE: |
| case RAWEXEC_TYPE: |
| case UNTERM_TYPE: |
| // These types must be not null. May be just whitespace. |
| // Will NOT be trimmed. |
| if (val == null) throw new IllegalArgumentException( |
| "Null String value for scanner token"); |
| break; |
| |
| case SQL_TYPE: |
| // These types may be anything (null, whitespace, etc.). |
| // Will NOT be trimmed |
| break; |
| |
| default: throw new IllegalArgumentException( |
| "Internal error. Unexpected scanner token type: " + inType); |
| } |
| } |
| |
| public Token(int inType, StringBuffer inBuf, int inLine) { |
| this(inType, inBuf.toString(), inLine); |
| } |
| |
| public Token(int inType, int inLine) { |
| this(inType, (String) null, inLine); |
| } |
| |
| public String toString() { return "@" + line |
| + " TYPE=" + getTypeString() + ", VALUE=(" + val + ')'; |
| } |
| |
| /** |
| * Equality ignores the line number |
| */ |
| public boolean equals(Token otherToken) { |
| if (type != otherToken.type) return false; |
| if (val == null && otherToken.val != null) return false; |
| if (val != null && otherToken.val == null) return false; |
| if (val != null && !val.equals(otherToken.val)) return false; |
| return true; |
| } |
| |
| /* |
| * Convenience wrapper for brevity. |
| */ |
| public String reconstitute() { |
| return reconstitute(false); |
| } |
| |
| /* |
| * A command string generated from val and type which can hopefully be |
| * re-executed. |
| */ |
| public String reconstitute(boolean semify) { |
| if (val == null) return ""; |
| switch (type) { |
| case Token.SPECIAL_TYPE: |
| case Token.PL_TYPE: |
| return Character.toString(getTypeChar()) + val; |
| case Token.SQL_TYPE: |
| return val + (semify ? ";" : ""); |
| } |
| return "? " + val; |
| } |
| } |