package com.planet_ink.coffee_mud.core.intermud.packets;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.Hashtable;
import java.util.Vector;
/**
* Copyright (c) 1996 George Reese
* 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.
*
*/
public class LPCData {
static public Object getLPCData(String str) throws I3Exception {
return getLPCData(str, false);
}
static public Object getLPCData(String str, boolean flag) throws I3Exception {
Vector data = new Vector(2);
data.addElement(null);
data.addElement("");
if( str == null ) {
if( ! flag ) {
return "";
}
return data;
}
str = str.trim();
if( str.length() < 1 ) {
if( !flag ) {
return "";
}
return data;
}
else if( str.length() == 1 ) {
try {
int x = Integer.parseInt(str);
if( !flag ) {
return new Integer(x);
}
data.setElementAt(new Integer(x), 0);
return data;
}
catch( NumberFormatException e ) {
throw new I3Exception("Invalid LPC Data in string: " + str);
}
}
if( str.charAt(0) == '(' ) {
switch(str.charAt(1)) {
case '{':
{
Vector v = new Vector();
str = str.substring(2, str.length());
while( str.charAt(0) != '}' ) {
Vector tmp = (Vector)getLPCData(str, true);
v.addElement(tmp.elementAt(0));
str = ((String)tmp.elementAt(1)).trim();
if( str.length() < 1 || (str.charAt(0) != ',' && str.charAt(0) != '}') ) {
throw new I3Exception("Invalid LPC Data in string: " + str);
}
else if( str.charAt(0) == ',' ) {
str = str.substring(1, str.length());
str = str.trim();
}
}
if( str.charAt(1) != ')' ) {
str = str.substring(2, str.length());
str = str.trim();
if( str.charAt(0) != ')' ) {
throw new I3Exception("Illegal array terminator.");
}
data.setElementAt(str.substring(1, str.length()), 1);
}
else {
data.setElementAt(str.substring(2,str.length()), 1);
}
if( !flag ) return v;
data.setElementAt(v, 0);
return data;
}
case '[':
{
Hashtable h = new Hashtable();
str = str.substring(2, str.length());
while( str.charAt(0) != ']' ) {
Vector tmp = (Vector)getLPCData(str, true);
Object key, value;
str = (String)tmp.elementAt(1);
str = str.trim();
if( str.charAt(0) != ':' ) {
throw new I3Exception("Invalid mapping format: " + str);
}
str = str.substring(1, str.length());
key = tmp.elementAt(0);
tmp = (Vector)getLPCData(str, true);
value = tmp.elementAt(0);
str = (String)tmp.elementAt(1);
h.put(key, value);
str = str.trim();
if( str.charAt(0) != ',' && str.charAt(0) != ']' ) {
throw new I3Exception("Invalid mapping format: " + str);
}
else if( str.charAt(0) != ']' ) {
str = str.substring(1, str.length());
str = str.trim();
}
}
if( str.charAt(1) != ')' ) {
str = str.substring(2, str.length()).trim();
if( str.charAt(0) != ')' ) {
throw new I3Exception("Invalid mapping format: " + str);
}
data.setElementAt(str.substring(1, str.length()).trim(), 1);
}
else data.setElementAt(str.substring(2, str.length()).trim(), 1);
if( !flag ) {
return h;
}
data.setElementAt(h, 0);
return data;
}
default:
throw new I3Exception("Invalid LPC Data in string: " + str);
}
}
else if( str.charAt(0) == '"' ) {
String tmp = "";
char prior = '\0';
char next = str.charAt(1);
while( next != '"' || (next == '"' && str.charAt(0) == '\\') ) {
if( next == '"' && str.charAt(0) == '\\' && prior == '\\') {
break;
}
if( next != '\\' || str.charAt(0) == '\\') {
tmp += next;
}
prior = str.charAt(0);
str = str.substring(1, str.length());
next = str.charAt(1);
}
if( !flag ) {
return tmp;
}
if( str.length() > 2 ) {
str = str.substring(2, str.length()).trim();
}
data.setElementAt(tmp, 0);
data.setElementAt(str, 1);
return data;
}
else if( Character.isDigit(str.charAt(0)) || str.charAt(0) == '-' ) {
String tmp;
int x;
if( str.length() > 1 && str.startsWith("0x" ) ) {
tmp = "0x";
str = str.substring(2, str.length());
}
else if( str.length() > 1 && str.startsWith("-") ) {
tmp = "-";
str = str.substring(1, str.length());
}
else {
tmp = "";
}
while( !str.equals("") && (Character.isDigit(str.charAt(0))) ) {
tmp += str.charAt(0);
// tmp += str.substring(0, 1);
if( str.length() > 1 ) {
str = str.substring(1, str.length());
}
else {
str = "";
}
}
try {
x = Integer.parseInt(tmp);
}
catch( NumberFormatException e ) {
throw new I3Exception("Invalid number format: " + tmp);
}
if( !flag ) {
return new Integer(x);
}
data.setElementAt(new Integer(x), 0);
data.setElementAt(str, 1);
return data;
}
throw new I3Exception("Gobbledygook in string.");
}
}