package net.sourceforge.phpdt.internal.debug.core.model; /* * Created on 17.04.2004 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ /** * @author Chris Admin * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ import java.util.Vector; import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugException; public class PHPDBGEvalString { String workStr; private PHPStackFrame fStackFrame; public PHPDBGEvalString(PHPStackFrame stack,String dataStr) { fStackFrame=stack; workStr=dataStr; } String ExtractSubStr(char chstart, char chend,int startIdx) throws DebugException { int idx=startIdx; String rslt; if (idx >= (workStr.length() - 1) || workStr.charAt(idx) != chstart) { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"worng startIdx!",null); throw new DebugException(status); } int i = ++idx; i = workStr.indexOf(chend, i); if (i==-1){ Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"endchar not found!",null); throw new DebugException(status); } rslt=workStr.substring(idx,i); workStr=workStr.substring(i+1); return rslt; } String ExtractQuotedSubStr(int slen,int startIdx) throws DebugException { int idx=startIdx; String rslt; if (idx+slen+1 >= workStr.length() || workStr.charAt(idx)!= '"' || workStr.charAt(idx+slen+1) != '"') { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no quoted substring found!",null); throw new DebugException(status); } rslt=workStr.substring(idx+1, idx+1+slen); workStr=workStr.substring(idx+2+slen); return rslt; } int ExtractInt(char chstart, char chend,int startIdx) throws DebugException { String subs; int rslt; subs=ExtractSubStr(chstart, chend,startIdx); return (Integer.parseInt(subs)); } PHPVariable ParseEvalArray(String name, PHPVariable parent,Vector list, Vector var_list, String classname, int atype) throws DebugException{ long arritems; String itemname; PHPVariable item; Vector subitems=null; arritems= ExtractInt(':', ':',0); if ((workStr.length()>0)&&(workStr.charAt(0)!='{')) { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no array startcharecter!",null); throw new DebugException(status); } workStr=workStr.substring(1); item= new PHPVariable(fStackFrame,name,parent,classname,atype,null); list.add(item); if (var_list!=null) var_list.add(item); if (arritems > 0) { subitems = new Vector(); } else if (workStr.charAt(0)!='}') { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no array endcharecter!",null); throw new DebugException(status); } while ((workStr.length()>0) && (workStr.charAt(0)!='}')) { Vector tmplst=new Vector(); // name parse("",null, tmplst, null, false,0); if(tmplst.size()!=1){ Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no name found!",null); throw new DebugException(status); } // value parse(((PHPVariable)tmplst.elementAt(0)).getValue().getValueString(),item, subitems, var_list, true,0); } ((PHPValue)item.getValue()).addVariable(subitems); workStr=workStr.substring(1); return item; } void ParseEvalNULL(String name,PHPVariable parent,Vector list, Vector var_list, int startIdx) throws DebugException { int idx=startIdx; if (idx >= workStr.length() || workStr.charAt(idx) != ';') { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"NULL not found!",null); throw new DebugException(status); } workStr=workStr.substring(1); PHPVariable item= new PHPVariable(fStackFrame, name,parent,"NULL",PHPValue.PEVT_UNKNOWN,null); list.add(item); if (var_list!=null) var_list.add(item); } boolean ParseEvalInt( String name, PHPVariable parent, Vector list, Vector var_list, int startIdx) throws DebugException { String subs=null; PHPVariable item; subs = ExtractSubStr(':',';',startIdx); item= new PHPVariable(fStackFrame, name,parent,subs,PHPValue.PEVT_LONG,null); list.add(item); if (var_list!=null) var_list.add(item); return true; } boolean ParseEvalDouble(String name,PHPVariable parent, Vector list, Vector var_list, int startIdx) throws DebugException { String subs=null; PHPVariable item; subs = ExtractSubStr(':',';',startIdx); item= new PHPVariable(fStackFrame, name,parent,subs,PHPValue.PEVT_DOUBLE,null); list.add(item); if (var_list!=null) var_list.add(item); return true; } boolean ParseEvalString(String name,PHPVariable parent, Vector list, Vector var_list, boolean MakePhpStr, int startIdx) throws DebugException{ int slen; slen= ExtractInt( ':', ':',startIdx); if ((workStr.length()<=slen)||(workStr.charAt(0)!='"')) { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no String startcharecter!",null); throw new DebugException(status); } workStr=workStr.substring(1); String subs = workStr.substring(0,slen); // replace \\ with \ subs=subs.replaceAll("\\\\\\\\","\\\\"); if (workStr.charAt(slen)!='"') { Status status= new Status(Status.ERROR,PHPDebugCorePlugin.getUniqueIdentifier(),Status.OK,"no String endcharecter!",null); throw new DebugException(status); } workStr=workStr.substring(slen+2); /* if (MakePhpStr) { ConvertToPhpString(subs, &subs); } */ PHPVariable item= new PHPVariable(fStackFrame, name,parent,subs,PHPValue.PEVT_STRING,null); list.add(item); if (var_list!=null) var_list.add(item); return true; } boolean ParseEvalBool(String name,PHPVariable parent, Vector list, Vector var_list, int startIdx) throws DebugException{ long v; v=ExtractInt(':', ';',startIdx); PHPVariable item= new PHPVariable(fStackFrame, name,parent,(v==0)?("FALSE"):("TRUE"),PHPValue.PEVT_BOOLEAN,null); list.add(item); if (var_list!=null) list.add(item); return true; } boolean ParseEvalObject(String name,PHPVariable parent, Vector list, Vector var_list, int startIdx) throws DebugException{ int slen; String classname; slen=ExtractInt(':', ':',startIdx); classname= ExtractQuotedSubStr(slen, startIdx); if ((int)classname.length()!=slen) return false; ParseEvalArray(name,parent, list, var_list, classname,PHPValue.PEVT_OBJECT); return true; } boolean ParseEvalResource(String name,PHPVariable parent, Vector list, Vector var_list, int startIdx) throws DebugException{ int v, slen; String restype, val; slen=ExtractInt(':', ':',startIdx); restype=ExtractQuotedSubStr(slen, startIdx); v=ExtractInt(':', ';',startIdx); // std_sprintf(val, "%ld", v); // list->Add(var_list, name, val, ptResource, restype); return true; } boolean ParseEvalRef(String name,PHPVariable parent, Vector list, Vector var_list, boolean isSoftRef, int startIdx) throws DebugException{ int v; v=ExtractInt(':', ';',startIdx); PHPVariable item= new PHPVariable(fStackFrame, name,parent,"",(isSoftRef)? (PHPValue.PEVT_SOFTREF): (PHPValue.PEVT_REF),null); v--; // ref ID is 1-based, EvalList is 0-based if ((var_list==null) || (v<0) || (v >= var_list.size())) { // item.ref = item; // self-resolving return true; } else { PHPVariable var_item=(PHPVariable)var_list.get(v); try { item.setValue(var_item.getValue()); item.setReferenceType(var_item.getReferenceType()); ((PHPValue)item.getValue()).setParent(item); } catch (DebugException e) { // TODO Auto-generated catch block e.printStackTrace(); } list.add(item); } return true; } /** * * @return The array of PHPVariables */ public PHPVariable[] getVars () { Vector list = new Vector (); Vector var_list = new Vector (); parse ("", null, list, var_list, false, 0); return (PHPVariable[]) list.toArray (new PHPVariable[list.size ()]); // Convert the list to an array and return the array } /** * * @return The array of PHPVariables */ public Vector getVariables () { Vector list = new Vector (); Vector var_list = new Vector (); parse ("", null, list, var_list, false, 0); return list; // return the PHPVariable list } /** * * @param name * @param parent * @param list * @param var_list * @param MakePhpStr * @param startIdx */ boolean parse (String name, PHPVariable parent, Vector list, Vector var_list, boolean MakePhpStr, int startIdx) { boolean ret_val = false; char ch; if (startIdx >= workStr.length ()) { return false; } ch = workStr.charAt (startIdx); workStr = workStr.substring (1); try { switch (ch) { case 'N': ParseEvalNULL (name, parent, list, var_list, startIdx); break; case 'i': ParseEvalInt (name, parent, list, var_list, startIdx); break; case 'd': ParseEvalDouble (name, parent, list, var_list, startIdx); break; case 's': ParseEvalString (name, parent, list, var_list, MakePhpStr, startIdx); break; case 'a': ParseEvalArray (name, parent, list, var_list, "", PHPValue.PEVT_ARRAY); break; case 'O': ParseEvalObject (name, parent, list, var_list, startIdx); break; case 'b': ParseEvalBool (name, parent, list, var_list, startIdx); break; case 'z': ParseEvalResource (name, parent, list, var_list, startIdx); break; case 'R': ParseEvalRef (name, parent, list, var_list, false, startIdx); break; case 'r': ParseEvalRef (name, parent, list, var_list, true, startIdx); break; } } catch (DebugException e) { // TODO Auto-generated catch block e.printStackTrace(); } /* if (!ret_val) { // try to recover unsigned int i=*startIdx; while (i