From: <ha...@us...> - 2009-08-31 04:25:29
|
Revision: 11411 http://jmol.svn.sourceforge.net/jmol/?rev=11411&view=rev Author: hansonr Date: 2009-08-31 04:25:22 +0000 (Mon, 31 Aug 2009) Log Message: ----------- version=11.9.2_dev # code: refactoring org.jmol.viewer.Script... into org.jmol.script # with the result that far more viewer methods are more publicly accessible Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptFlowContext.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2009-08-31 04:21:46 UTC (rev 11410) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2009-08-31 04:25:22 UTC (rev 11411) @@ -32,7 +32,7 @@ import javax.vecmath.Point3f; -abstract public class ScriptCompilationTokenParser { +abstract class ScriptCompilationTokenParser { /* * An abstract class taking care of the second phase of Modified: trunk/Jmol/src/org/jmol/script/ScriptFlowContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptFlowContext.java 2009-08-31 04:21:46 UTC (rev 11410) +++ trunk/Jmol/src/org/jmol/script/ScriptFlowContext.java 2009-08-31 04:25:22 UTC (rev 11411) @@ -25,7 +25,7 @@ package org.jmol.script; -public class ScriptFlowContext { +class ScriptFlowContext { /* * Flow Contexts in Jmol 11.3.23+ -- Bob Hanson * @@ -187,7 +187,7 @@ return pt0; } - public void setLine() { + void setLine() { ptLine = this.compiler.lineCurrent; ptCommand = this.compiler.iCommand + 1; } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-08-31 04:21:46 UTC (rev 11410) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-08-31 04:25:22 UTC (rev 11411) @@ -49,7 +49,7 @@ import org.jmol.viewer.PropertyManager; import org.jmol.viewer.Viewer; -public class ScriptMathProcessor { +class ScriptMathProcessor { /** * Reverse Polish Notation Engine for IF, SET, and %{...} -- Bob Hanson * 2/16/2007 Just a (not so simple?) RPN processor that can handle boolean, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-08-31 04:43:24
|
Revision: 11413 http://jmol.svn.sourceforge.net/jmol/?rev=11413&view=rev Author: hansonr Date: 2009-08-31 04:43:18 +0000 (Mon, 31 Aug 2009) Log Message: ----------- version=11.9.2_dev # code: refactoring org.jmol.viewer.Script... into org.jmol.script # with the result that far more viewer methods are more publicly accessible Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-08-31 04:28:07 UTC (rev 11412) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-08-31 04:43:18 UTC (rev 11413) @@ -4854,7 +4854,8 @@ if (!(expressionResult instanceof BitSet)) error(ERROR_invalidArgument); bsCenter = (BitSet) expressionResult; - q = (isSyntaxCheck ? new Quaternion() : getAtomQuaternion(viewer, bsCenter)); + q = (isSyntaxCheck ? new Quaternion() + : viewer.getAtomQuaternion(BitSetUtil.firstSetBit(bsCenter))); } else { q = new Quaternion(getPoint4f(i)); } @@ -12889,13 +12890,4 @@ } return true; } - - static Quaternion getAtomQuaternion(Viewer viewer, BitSet bs) { - int i = BitSetUtil.firstSetBit(bs); - if (i < 0) - return null; - return (i < 0 ? null : viewer.getModelSet().getAtomAt(i).getQuaternion( - viewer.getQuaternionFrame())); - } - } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-08-31 04:28:07 UTC (rev 11412) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-08-31 04:43:18 UTC (rev 11413) @@ -1307,7 +1307,7 @@ if (args[0].tok == Token.point4f) { p4 = (Point4f) args[0].value; } else if (args[0].tok == Token.bitset && tok == Token.quaternion) { - q = ScriptEvaluator.getAtomQuaternion(viewer, (BitSet) args[0].value); + q = viewer.getAtomQuaternion(BitSetUtil.firstSetBit((BitSet) args[0].value)); if (q == null) return addX((int) 0); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-11-11 04:50:28
|
Revision: 11719 http://jmol.svn.sourceforge.net/jmol/?rev=11719&view=rev Author: hansonr Date: 2009-11-11 04:50:22 +0000 (Wed, 11 Nov 2009) Log Message: ----------- 11.9.8 VERSION version=11.9.8 # new feature: labels HIDE and labels DISPLAY do exactly that # new feature: application console completes commands and quoted filenames with <TAB> # # new feature: load "xxxx.xxx" [-vibration number] # loads only the specific vibration model. # # new feature: (embedded application; org.jmol.api.JmolViewer.java method): # abstract public String loadInline(Vector arrayData, boolean isAppend); # @param arrayData a Vector of models, where each model is either a String # or a String[] or a Vector<String> # @param isAppend TRUE to append models (no ZAP) # @return null or error message # #### NOTE: THIS METHOD DOES NOT PRESERVE THE STATE # #### BECAUSE IT DOES NOT SAVE THE READ DATA IN A SCRIPT COMMAND # #### FOR THAT FUNCTIONALITY USE loadInline(String[] modelData, boolean isAppend); # # bug fix: strand count assignment error in cif/pdb readers causes failure to load 3ovo.cif # bug fix: labels offset using set picking select label not saved in state properly; # added "set labelOffsetExact" # bug fix: set picking select label shifting label causes jump and not saved in state reproducibly # bug fix: set toggleLabel inappropriately resets label to default setting # bug fix: moveto QUATERNION not distinguishing between orientation quaternions # and molecular quaternions -- MOLECULAR keyword added # bug fix: setting perspective model stops animation in state script # bug fix: GAMESS reader not reading all vibrational frequencies # Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2009-11-11 01:57:30 UTC (rev 11718) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2009-11-11 04:50:22 UTC (rev 11719) @@ -890,7 +890,11 @@ && !(tokCommand == Token.script && iHaveQuotedString) && lookingAtImpliedString()) { String str = script.substring(ichToken, ichToken + cchToken); - addTokenToPrefix(new Token(Token.string, str)); + if (tokCommand == Token.label + && Parser.isOneOf(str.toLowerCase(), "on;off;hide;display")) + addTokenToPrefix(Token.getTokenFromName(str)); + else + addTokenToPrefix(new Token(Token.string, str)); return CONTINUE; } float value; Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-11-11 01:57:30 UTC (rev 11718) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-11-11 04:50:22 UTC (rev 11719) @@ -6451,19 +6451,22 @@ private void label(int index) throws ScriptException { if (isSyntaxCheck) return; - String strLabel = parameterAsString(index++); - if (strLabel.equalsIgnoreCase("on")) { + viewer.loadShape(JmolConstants.SHAPE_LABELS); + String strLabel = null; + switch (getToken(index).tok) { + case Token.on: strLabel = viewer.getStandardLabelFormat(); - } else if (strLabel.equalsIgnoreCase("off")) { - strLabel = null; - } else if (strLabel.equalsIgnoreCase("display")) { - setShapeProperty(JmolConstants.SHAPE_LABELS, "display", Boolean.TRUE); - return; - } else if (strLabel.equalsIgnoreCase("hide")) { - setShapeProperty(JmolConstants.SHAPE_LABELS, "display", Boolean.FALSE); + break; + case Token.off: + break; + case Token.hide: + case Token.display: + setShapeProperty(JmolConstants.SHAPE_LABELS, "display", + theTok == Token.display ? Boolean.TRUE : Boolean.FALSE); return; + default: + strLabel = parameterAsString(index); } - viewer.loadShape(JmolConstants.SHAPE_LABELS); viewer.setLabel(strLabel); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-04-10 17:50:41
|
Revision: 12818 http://jmol.svn.sourceforge.net/jmol/?rev=12818&view=rev Author: hansonr Date: 2010-04-10 17:50:16 +0000 (Sat, 10 Apr 2010) Log Message: ----------- version=12.0.RC5_dev # new feature: show within(nResidues, GROUP, {atoms}) Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2010-04-10 17:24:02 UTC (rev 12817) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2010-04-10 17:50:16 UTC (rev 12818) @@ -575,6 +575,7 @@ addNextToken(); break; case Token.group: + getToken(); addTokenToPostfix(Token.string, "group"); break; case Token.leftbrace: Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-04-10 17:24:02 UTC (rev 12817) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-04-10 17:50:16 UTC (rev 12818) @@ -1880,6 +1880,7 @@ case Token.string: isWithinGroup = (ScriptVariable.sValue(args[1]) .equalsIgnoreCase("group")); + tok = Token.group; break; } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-04-16 07:37:40
|
Revision: 12867 http://jmol.svn.sourceforge.net/jmol/?rev=12867&view=rev Author: hansonr Date: 2010-04-16 07:37:33 +0000 (Fri, 16 Apr 2010) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ParallelProcessor.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java Modified: trunk/Jmol/src/org/jmol/script/ParallelProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ParallelProcessor.java 2010-04-16 07:07:19 UTC (rev 12866) +++ trunk/Jmol/src/org/jmol/script/ParallelProcessor.java 2010-04-16 07:37:33 UTC (rev 12867) @@ -38,11 +38,7 @@ } Vector processes = new Vector(); - void addProcess(String name, Vector vProcess, ScriptContext context) { - Token[][] statements = new Token[vProcess.size()][]; - for (int i = vProcess.size(); --i >= 0; ) - statements[i] = (Token[]) vProcess.get(i); - context.aatoken = statements; + void addProcess(String name, ScriptContext context) { processes.add(new Process(name, context)); } @@ -73,7 +69,7 @@ Lock lock = getLock(process.processName); synchronized (lock) { try { - System.out.println("Running process " + process.processName); + System.out.println("Running process " + process.processName + " " + process.context.pc + " - " + (process.context.pcEnd - 1)); viewer.eval(process.context); // / run the process; // finalize the process; Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-04-16 07:07:19 UTC (rev 12866) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-04-16 07:37:33 UTC (rev 12867) @@ -5266,8 +5266,15 @@ return; if (pc > 0) { vProcess = new Vector(); - parallelProcessor.addProcess("p" + (++iProcess), vProcess, getScriptContext()); } else { + Token[][] statements = new Token[pt][]; + for (int i = 0; i < vProcess.size(); i++) + statements[i - pc] = (Token[]) vProcess.get(i); + ScriptContext context = getScriptContext(); + context.aatoken = statements; + context.pc = -pc; + context.pcEnd = pt - 1; + parallelProcessor.addProcess("p" + (++iProcess), context); vProcess = null; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-06-30 02:57:25
|
Revision: 13482 http://jmol.svn.sourceforge.net/jmol/?rev=13482&view=rev Author: hansonr Date: 2010-06-30 02:57:18 +0000 (Wed, 30 Jun 2010) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-06-30 00:08:29 UTC (rev 13481) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-06-30 02:57:18 UTC (rev 13482) @@ -480,7 +480,7 @@ } } else if (expr instanceof Token[]) { e.contextVariables = viewer.getContextVariables(); - return e.expression((Token[]) expr, 0, 0, true, false, true, false); + return e.atomExpression((Token[]) expr, 0, 0, true, false, true, false); } } catch (Exception ex) { Logger.error("Error evaluating: " + expr + "\n" + ex); @@ -523,7 +523,7 @@ scr = TextFormat.simpleReplace(scr, "()", "(none)"); if (e.compileScript(null, scr, false)) { e.statement = e.aatoken[0]; - bs = e.expression(e.statement, 1, 0, false, false, true, true); + bs = e.atomExpression(e.statement, 1, 0, false, false, true, true); } e.popContext(false); } catch (Exception ex) { @@ -557,7 +557,7 @@ /** * This is the primary driver of the RPN (reverse Polish notation) expression * processor. It handles all math outside of a "traditional" Jmol - * SELECT/RESTRICT context. [Object expression() takes care of that, and also + * SELECT/RESTRICT context. [Object atomExpression() takes care of that, and also * uses the RPN class.] * * @param pt @@ -815,7 +815,7 @@ if (tok == Token.all) v = viewer.getModelUndeletedAtomsBitSet(-1); else - v = expression(statement, i, 0, true, true, true, true); + v = atomExpression(statement, i, 0, true, true, true, true); i = iToken; if (nParen == 0 && isOneExpressionOnly) { iToken++; @@ -1921,7 +1921,7 @@ return (BitSet) value; if (value instanceof Token[]) { pushContext(null); - BitSet bs = expression((Token[]) value, -2, 0, true, false, true, true); + BitSet bs = atomExpression((Token[]) value, -2, 0, true, false, true, true); popContext(false); if (!isDynamic) definedAtomSets.put(setName, bs); @@ -3000,15 +3000,15 @@ private boolean isBondSet; private Object expressionResult; - private BitSet expression(int index) throws ScriptException { + private BitSet atomExpression(int index) throws ScriptException { if (!checkToken(index)) error(ERROR_badArgumentCount, index); - return expression(statement, index, 0, true, false, true, true); + return atomExpression(statement, index, 0, true, false, true, true); } - private BitSet expression(Token[] code, int pcStart, int pcStop, - boolean allowRefresh, boolean allowUnderflow, - boolean mustBeBitSet, boolean andNotDeleted) + private BitSet atomExpression(Token[] code, int pcStart, int pcStop, + boolean allowRefresh, boolean allowUnderflow, + boolean mustBeBitSet, boolean andNotDeleted) throws ScriptException { // note that this is general -- NOT just statement[] // errors reported would improperly access statement/line context @@ -3021,7 +3021,8 @@ tempStatement = statement; statement = code; } - ScriptMathProcessor rpn = new ScriptMathProcessor(this, false, false, mustBeBitSet); + ScriptMathProcessor rpn = new ScriptMathProcessor(this, false, false, + mustBeBitSet); Object val; int comparisonValue = Integer.MAX_VALUE; boolean refreshed = false; @@ -3098,14 +3099,13 @@ break; case Token.string: String s = (String) value; -/* if (s.indexOf("~") == 0) { - rpn.addOp(new Token(Token.search, "search")); - rpn.addOp(Token.tokenLeftParen); - rpn.addX(new ScriptVariable(instruction)); - rpn.addOp(Token.tokenRightParen); - break; + if (s.indexOf("({") == 0) { + BitSet bs = Escape.unescapeBitset(s); + if (bs != null) { + rpn.addX(bs); + break; + } } -*/ rpn.addX(new ScriptVariable(instruction)); // note that the compiler has changed all within() types to strings. if (s.equals("hkl")) { @@ -3113,10 +3113,10 @@ pc = iToken; } break; - case Token.within: case Token.smiles: case Token.search: case Token.substructure: + case Token.within: case Token.connected: case Token.comma: rpn.addOp(instruction); @@ -3237,9 +3237,8 @@ (int) (pt.y * 1000), (int) (pt.z * 1000) })); break; case Token.thismodel: - rpn - .addX(viewer - .getModelUndeletedAtomsBitSet(viewer.getCurrentModelIndex())); + rpn.addX(viewer.getModelUndeletedAtomsBitSet(viewer + .getCurrentModelIndex())); break; case Token.hydrogen: case Token.amino: @@ -3386,21 +3385,17 @@ rpn.addOp(instruction); break; } -// if (instruction.tok == Token.identifier) { - val = getParameter((String) value, false); - if (val instanceof String) - val = getStringObjectAsVariable((String) val, null); - if (val instanceof String[]) { - BitSet bs = Escape.unEscapeBitSetArray((String[]) val, true); - if (bs != null) - val = bs; - } - else if (val instanceof String || val instanceof String[]) - val = lookupIdentifierValue((String) value); - rpn.addX(val); - break; -// } - // error(ERROR_unrecognizedExpression); + val = getParameter((String) value, false); + if (val instanceof String) + val = getStringObjectAsVariable((String) val, null); + if (val instanceof String[]) { + BitSet bs = Escape.unEscapeBitSetArray((String[]) val, true); + if (bs != null) + val = bs; + } else if (val instanceof String || val instanceof String[]) + val = lookupIdentifierValue((String) value); + rpn.addX(val); + break; } } expressionResult = rpn.getResult(allowUnderflow, null); @@ -4093,7 +4088,7 @@ switch (getToken(i).tok) { case Token.bitset: case Token.expressionBegin: - BitSet bs = expression(statement, i, 0, true, false, false, true); + BitSet bs = atomExpression(statement, i, 0, true, false, false, true); if (bs != null) return viewer.getAtomSetCenter(bs); if (expressionResult instanceof Point3f) @@ -5419,7 +5414,7 @@ break; case Token.in: nSkip -= 2; - bsIn = expression(++i); + bsIn = atomExpression(++i); i = iToken; break; case Token.select: @@ -5881,7 +5876,7 @@ case Token.trace: Point3f[][] pathGuide; Vector vp = new Vector(); - BitSet bs = expression(++i); + BitSet bs = atomExpression(++i); i = iToken; if (isSyntaxCheck) return; @@ -6089,8 +6084,8 @@ BitSet bsAtoms1 = null, bsAtoms2 = null; Vector vAtomSets = null; Vector vQuatSets = null; - BitSet bsFrom = expression(1); - BitSet bsTo = expression(++iToken); + BitSet bsFrom = atomExpression(1); + BitSet bsTo = atomExpression(++iToken); BitSet bsSubset = null; boolean isSmiles = false; String strSmiles = null; @@ -6111,16 +6106,16 @@ case Token.comma: break; case Token.subset: - bsSubset = expression(++i); + bsSubset = atomExpression(++i); i = iToken; break; case Token.bitset: case Token.expressionBegin: if (vQuatSets != null) error(ERROR_invalidArgument); - bsAtoms1 = expression(iToken); + bsAtoms1 = atomExpression(iToken); int tok = tokAt(iToken + 1); - bsAtoms2 = (tok == Token.bitset || tok == Token.expressionBegin ? expression(++iToken) + bsAtoms2 = (tok == Token.bitset || tok == Token.expressionBegin ? atomExpression(++iToken) : BitSetUtil.copy(bsAtoms1)); bsAtoms1.and(bsFrom); bsAtoms2.and(bsTo); @@ -6472,7 +6467,7 @@ error(ERROR_badArgumentCount); if (haveType || isColorOrRadius) error(ERROR_invalidParameterOrder); - atomSets[nAtomSets++] = expression(i); + atomSets[nAtomSets++] = atomExpression(i); isBonds = isBondSet; if (nAtomSets == 2) { int pt = iToken; @@ -6630,7 +6625,7 @@ .nextSetBit(atom1 + 1)) { bs.set(atom1); result = viewer.makeConnections(distances[0], distances[1], bondOrder, - operation, bs, expression(expression2), bsBonds, isBonds, 0); + operation, bs, atomExpression(expression2), bsBonds, isBonds, 0); nNew += Math.abs(result[0]); nModified += result[1]; bs.clear(atom1); @@ -6686,7 +6681,7 @@ int propertyID = PropertyManager.getPropertyNumber(name); String param = optParameterAsString(2); int tok = tokAt(2); - BitSet bs = (tok == Token.expressionBegin || tok == Token.bitset ? expression(2) + BitSet bs = (tok == Token.expressionBegin || tok == Token.bitset ? atomExpression(2) : null); if (property.length() > 0 && propertyID < 0) { // no such property @@ -6975,7 +6970,7 @@ int typeMask = 0; float translucentLevel = Float.MAX_VALUE; if (index < 0) { - bs = expression(-index); + bs = atomExpression(-index); index = iToken + 1; if (isBondSet) shapeType = JmolConstants.SHAPE_STICKS; @@ -7409,7 +7404,7 @@ if (!isSite) viewer.addStateScript(thisCommand, false, true); } else { - BitSet bs = expression(2); + BitSet bs = atomExpression(2); definedAtomSets.put(setName, bs); setStringProperty("@" + setName, Escape.escape(bs)); } @@ -8449,7 +8444,7 @@ case Token.dollarsign: if (tok == Token.bitset || tok == Token.expressionBegin) { if (translation != null || q != null || nPoints == 2) { - bsAtoms = expression(i); + bsAtoms = atomExpression(i); ptsB = null; isSelected = true; break; @@ -8542,8 +8537,8 @@ break; case Token.branch: haveRotation = true; - int iAtom1 = expression(++i).nextSetBit(0); - int iAtom2 = expression(++iToken).nextSetBit(0); + int iAtom1 = atomExpression(++i).nextSetBit(0); + int iAtom2 = atomExpression(++iToken).nextSetBit(0); if (iAtom1 < 0 || iAtom2 < 0) return; bsAtoms = viewer.getBranchBitSet(iAtom2, iAtom1); @@ -8599,7 +8594,7 @@ case Token.matrix3f: haveRotation = true; if (tok == Token.compare) { - bsCompare = expression(++i); + bsCompare = atomExpression(++i); ptsA = viewer.getAtomPointVector(bsCompare); if (ptsA == null) error(ERROR_invalidArgument, i); @@ -8745,7 +8740,7 @@ if (value instanceof String[]) return Escape.unescapePointVector((String[]) value); if (i > 0) - return viewer.getAtomPointVector(expression(i)); + return viewer.getAtomPointVector(atomExpression(i)); return null; } @@ -8987,7 +8982,7 @@ setObjectProperty(); return; } - BitSet bs = (statementLength == 1 ? null : expression(1)); + BitSet bs = (statementLength == 1 ? null : atomExpression(1)); if (isSyntaxCheck) return; if (isDisplay) @@ -9005,7 +9000,7 @@ setObjectProperty(); return; } - BitSet bs = expression(statement, 1, 0, true, false, true, false); + BitSet bs = atomExpression(statement, 1, 0, true, false, true, false); if (isSyntaxCheck) return; int nDeleted = viewer.deleteAtoms(bs, false); @@ -9050,7 +9045,7 @@ checkLength(2); } else { while (n < 4 && !isFloatParameter(i)) { - aList[++n] = expression(i).nextSetBit(0); + aList[++n] = atomExpression(i).nextSetBit(0); i = iToken + 1; } aList[0] = n; @@ -9071,7 +9066,7 @@ case Token.fixed: if (i != 1) error(ERROR_invalidArgument); - bsFixed = expression(++i); + bsFixed = atomExpression(++i); if (bsFixed.nextSetBit(0) < 0) bsFixed = null; i = iToken; @@ -9081,7 +9076,7 @@ return; continue; case Token.select: - bsSelected = expression(++i); + bsSelected = atomExpression(++i); i = iToken; continue; case Token.silent: @@ -9136,7 +9131,7 @@ checkLast(iToken); bs = (BitSet) v; } else { - bs = expression(i); + bs = atomExpression(i); } if (isSyntaxCheck) return; @@ -9153,7 +9148,7 @@ } private void subset() throws ScriptException { - BitSet bs = (statementLength == 1 ? null : expression(-1)); + BitSet bs = (statementLength == 1 ? null : atomExpression(-1)); if (isSyntaxCheck) return; // There might have been a reason to have bsSubset being set BEFORE @@ -9184,9 +9179,9 @@ viewer.invertAtomCoord(pt, bs); return; case Token.stereo: - iAtom = expression(2).nextSetBit(0); + iAtom = atomExpression(2).nextSetBit(0); // and only these: - bs = expression(iToken + 1); + bs = atomExpression(iToken + 1); break; case Token.point: pt = centerParameter(2); @@ -9222,7 +9217,7 @@ } if (isPoint3f(i)) { Point3f pt = getPoint3f(i, true); - bs = (!isSelected && iToken + 1 < statementLength ? expression(++iToken) + bs = (!isSelected && iToken + 1 < statementLength ? atomExpression(++iToken) : null); checkLast(iToken); if (!isSyntaxCheck) @@ -9247,7 +9242,7 @@ } iToken = (type == '\0' ? 2 : 3); bs = (isSelected ? viewer.getSelectionSet() - : iToken + 1 < statementLength ? expression(++iToken) : null); + : iToken + 1 < statementLength ? atomExpression(++iToken) : null); checkLast(iToken); if (!isSyntaxCheck) viewer.translate(parameterAsString(1).charAt(0), amount, type, bs); @@ -9259,7 +9254,7 @@ refresh(); return; } - BitSet bs = expression(1); + BitSet bs = atomExpression(1); if (isSyntaxCheck) return; int nDeleted = viewer.deleteAtoms(bs, true); @@ -9340,7 +9335,7 @@ if (!viewer.isWindowCentered()) { // do a smooth zoom only if not windowCentered if (center != null) { - BitSet bs = expression(ptCenter); + BitSet bs = atomExpression(ptCenter); if (!isSyntaxCheck) viewer.setCenterBitSet(bs, false); } @@ -9792,7 +9787,7 @@ switch (tokAt(2)) { case Token.bitset: case Token.expressionBegin: - bs = expression(2); + bs = atomExpression(2); checkLast(iToken); break; default: @@ -9960,7 +9955,7 @@ case Token.expressionBegin: if (propertyName == null) propertyName = (iHaveAtoms || iHaveCoord ? "endSet" : "startSet"); - propertyValue = expression(i); + propertyValue = atomExpression(i); i = iToken; iHaveAtoms = true; break; @@ -10137,7 +10132,7 @@ } return; case Token.hydrogen: - bs = (statementLength == 2 ? null : expression(2)); + bs = (statementLength == 2 ? null : atomExpression(2)); checkLast(iToken); if (!isSyntaxCheck) viewer.addHydrogens(bs, false, false); @@ -10171,7 +10166,7 @@ default: isFrom = true; } - bs = (iToken + 1 < statementLength ? expression(++iToken) : viewer + bs = (iToken + 1 < statementLength ? atomExpression(++iToken) : viewer .getSelectionSet()); checkLength(++iToken); if (isSyntaxCheck) @@ -10179,8 +10174,8 @@ viewer.calculateSurface(bs, (isFrom ? Float.MAX_VALUE : -1)); return; case Token.struts: - bs = (iToken + 1 < statementLength ? expression(++iToken) : null); - bs2 = (iToken + 1 < statementLength ? expression(++iToken) : null); + bs = (iToken + 1 < statementLength ? atomExpression(++iToken) : null); + bs2 = (iToken + 1 < statementLength ? atomExpression(++iToken) : null); checkLength(++iToken); if (isSyntaxCheck) return; @@ -10215,15 +10210,15 @@ } return; } - BitSet bs1 = expression(2); - bs2 = expression(iToken + 1); + BitSet bs1 = atomExpression(2); + bs2 = atomExpression(iToken + 1); if (!isSyntaxCheck) { n = viewer.autoHbond(bs1, bs2); break; } return; case Token.structure: - bs = (statementLength == 2 ? null : expression(2)); + bs = (statementLength == 2 ? null : atomExpression(2)); if (isSyntaxCheck) return; if (bs == null) @@ -10384,13 +10379,13 @@ private void assign() throws ScriptException { int atomsOrBonds = tokAt(1); - int index = expression(2).nextSetBit(0); + int index = atomExpression(2).nextSetBit(0); int index2 = -1; String type = null; if (index < 0) error(ERROR_invalidArgument); if (atomsOrBonds == Token.connect) { - index2 = expression(++iToken).nextSetBit(0); + index2 = atomExpression(++iToken).nextSetBit(0); } else { type = parameterAsString(++iToken); } @@ -10430,7 +10425,7 @@ } private void fixed() throws ScriptException { - BitSet bs = (statementLength == 1 ? null : expression(1)); + BitSet bs = (statementLength == 1 ? null : atomExpression(1)); if (isSyntaxCheck) return; viewer.setMotionFixedAtoms(bs); @@ -10457,7 +10452,7 @@ return; case Token.align: BitSet bs = (statementLength == 2 || tokAt(2) == Token.none ? null - : expression(2)); + : atomExpression(2)); if (!isSyntaxCheck) viewer.setFrameOffsets(bs); return; @@ -10784,7 +10779,7 @@ return; case Token.highlight: loadShape(JmolConstants.SHAPE_HALOS); - setShapeProperty(JmolConstants.SHAPE_HALOS, "highlight", (tokAt(2) == Token.off ? null : expression(2))); + setShapeProperty(JmolConstants.SHAPE_HALOS, "highlight", (tokAt(2) == Token.off ? null : atomExpression(2))); return; case Token.display:// deprecated case Token.selectionhalos: @@ -11436,7 +11431,7 @@ } if (str.equals("toggle")) { iToken = 1; - BitSet bs = (statementLength == 2 ? null : expression(2)); + BitSet bs = (statementLength == 2 ? null : atomExpression(2)); checkLast(iToken); if (!isSyntaxCheck) viewer.togglePickingLabel(bs); @@ -11461,7 +11456,7 @@ } return false; } - BitSet bs = (iToken + 1 < statementLength ? expression(++iToken) : null); + BitSet bs = (iToken + 1 < statementLength ? atomExpression(++iToken) : null); checkLast(iToken); if (isSyntaxCheck) return true; @@ -11735,7 +11730,7 @@ ScriptVariable t = (settingData ? null : getContextVariableAsVariable(key)); boolean isUserVariable = (t != null); if (pt > 0 && tokAt(pt - 1) == Token.expressionBegin) { - bs = expression(pt - 1); + bs = atomExpression(pt - 1); pt = iToken + 1; isExpression = true; } @@ -12309,7 +12304,7 @@ BitSet bsAtoms; if (pt + 1 < argCount && args[++pt].tok == Token.expressionBegin || args[pt].tok == Token.bitset) { - bsAtoms = expression(args, pt, 0, true, false, true, true); + bsAtoms = atomExpression(args, pt, 0, true, false, true, true); pt = iToken + 1; } else { bsAtoms = viewer.getModelUndeletedAtomsBitSet(-1); @@ -13182,7 +13177,7 @@ // draw ID xxx symop [n or "x,-y,-z"] [optional {center}] // so we also check here for the atom set to get the right model bsAtoms = (tokAt(i) == Token.bitset - || tokAt(i) == Token.expressionBegin ? expression(i) : null); + || tokAt(i) == Token.expressionBegin ? atomExpression(i) : null); i = iToken + 1; } checkLast(iToken); @@ -13254,7 +13249,7 @@ case Token.bitset: case Token.expressionBegin: propertyName = "atomSet"; - propertyValue = expression(i); + propertyValue = atomExpression(i); if (isFrame) center = centerParameter(i); i = iToken; @@ -13560,7 +13555,7 @@ needsGenerating = true; propertyName = setPropertyName; setPropertyName = "to"; - propertyValue = expression(i); + propertyValue = atomExpression(i); i = iToken; break; case Token.to: @@ -13711,7 +13706,7 @@ case Token.bitset: case Token.expressionBegin: propertyName = "select"; - propertyValue = expression(i); + propertyValue = atomExpression(i); i = iToken; break; case Token.color: @@ -13744,7 +13739,7 @@ if (tokAt(i + 1) == Token.bitset || tokAt(i + 1) == Token.expressionBegin) { propertyName = "select"; - propertyValue = expression(i + 1); + propertyValue = atomExpression(i + 1); i = iToken; } else { propertyName = "selectType"; @@ -14207,8 +14202,12 @@ ptc = centerParameter(i + 4); havePt = true; iToken = iToken + 2; + } else if (isPoint3f(i + 5)) { + ptc = centerParameter(i + 5); + havePt = true; + iToken = iToken + 2; } else { - bs = expression(statement, i + 5, statementLength, true, false, false, true); + bs = atomExpression(statement, i + 5, statementLength, true, false, false, true); if (bs == null) error(ERROR_invalidArgument); ptc = viewer.getAtomSetCenter(bs); @@ -14289,7 +14288,7 @@ propertyValue = new Integer(modelIndex); break; case Token.select: - bsSelect = expression(++i); + bsSelect = atomExpression(++i); propertyName = "select"; propertyValue = bsSelect; i = iToken; @@ -14454,7 +14453,7 @@ break; } catch (ScriptException e) { } - bs = expression(i); + bs = atomExpression(i); sbCommand.append(" ellipsoid ").append(Escape.escape(bs)); int iAtom = bs.nextSetBit(0); Atom[] atoms = viewer.getModelSet().atoms; @@ -14485,7 +14484,7 @@ case Token.bitset: case Token.expressionBegin: propertyName = "lcaoCartoon"; - bs = expression(i); + bs = atomExpression(i); sbCommand.append(" ").append(Escape.escape(bs)); i = iToken; int atomIndex = bs.nextSetBit(0); @@ -14859,7 +14858,7 @@ break; case Token.ignore: propertyName = "ignore"; - propertyValue = bsIgnore = expression(++i); + propertyValue = bsIgnore = atomExpression(++i); sbCommand.append(" ignore ").append( Escape.escape((BitSet) propertyValue)); i = iToken; Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-06-30 00:08:29 UTC (rev 13481) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-06-30 02:57:18 UTC (rev 13482) @@ -2187,9 +2187,9 @@ private boolean evaluateSubstructure(ScriptVariable[] args, int tok) throws ScriptException { - // select substucture(....) legacy - was same as SMILES, now SMARTS + // select substucture(....) legacy - was same as smiles(), now search() // select smiles(...) - // select smarts(...) now same as substructure + // select search(...) now same as substructure if (args.length == 0) return false; BitSet bs = new BitSet(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-07-20 20:42:13
|
Revision: 13623 http://jmol.svn.sourceforge.net/jmol/?rev=13623&view=rev Author: hansonr Date: 2010-07-20 20:42:06 +0000 (Tue, 20 Jul 2010) Log Message: ----------- version=12.0.RC27 # new feature: SWITCH/CASE # -- more like JavaScript than Java # -- like JavaScript, doesn't need constants # -- like JavaScript, evaluations can be made in the cases # -- really just a simpler form of IF/ELSEIF/ELSE # -- expressions are evaluated only as necessary from the top down # -- DEFAULT may appear anywhere. # # switch(x) { # case 0: # case 1: # spacefill only # break; # default: # case 2: # wireframe only # break; # case 3: # wireframe only;wireframe reset;spacefill reset # break; # } Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptFunction.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-07-20 19:02:40 UTC (rev 13622) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-07-20 20:42:06 UTC (rev 13623) @@ -631,15 +631,16 @@ if (logMessages) { Logger.debug("-------------------------------------"); } + boolean doEval = true; switch (tokCommand) { - case Token.parallel: - case Token.function: - case Token.end: - case Token.var: - doEval = (doEval || atokenInfix.length > 0 && atokenInfix[0].intValue <= 0); + case Token.parallel: + case Token.function: // formerly "noeval" + case Token.end: + // end switch may have - or + intValue, depending upon default or not + // end function and the function call itself has intValue 0, + // but the FUNCTION declaration itself will have MAX_VALUE intValue + doEval = (atokenInfix.length > 0 && atokenInfix[0].intValue != Integer.MAX_VALUE); break; - default: - doEval = true; } if (doEval) { if (iCommand == lnLength) { @@ -807,7 +808,7 @@ private String getPrefixToken() { String ident = script.substring(ichToken, ichToken + cchToken); - System.out.println(ident); + //System.out.println(ident); // hack to support case sensitive alternate locations and chains // if an identifier is a single character long, then // allocate a new Token with the original character preserved @@ -1251,8 +1252,6 @@ return OK; } - private boolean doEval; - private int parseCommandParameter(String ident) { // PART II: // @@ -1263,7 +1262,6 @@ switch (tokCommand) { case Token.nada: // first token in command - doEval = true; lastToken = Token.tokenOff; ichCurrentCommand = ichEnd = ichToken; setCommand(theToken); @@ -1421,7 +1419,6 @@ if (!checkFlowEnd(theTok, ident, ichCurrentCommand)) return ERROR; if (theTok == Token.function || theTok == Token.parallel) { - doEval = false; return CONTINUE; } break; @@ -1820,8 +1817,7 @@ } thisFunction = null; tokenCommand.intValue = 0; - flowContext = flowContext.getParent(); - return true; + break; default: return error(ERROR_unrecognizedToken, "end " + ident); } Modified: trunk/Jmol/src/org/jmol/script/ScriptFunction.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptFunction.java 2010-07-20 19:02:40 UTC (rev 13622) +++ trunk/Jmol/src/org/jmol/script/ScriptFunction.java 2010-07-20 20:42:06 UTC (rev 13623) @@ -121,6 +121,9 @@ function.lineIndices[i] = new int[] {lineIndices[cmdpt0 + i][0] - chpt0, lineIndices[cmdpt0 + i][1] - chpt0 }; //System.out.println("Line " + i + ": " + function.script.substring(function.lineIndices[i][0], function.lineIndices[i][1])); aatoken[i] = (Token[]) lltoken.get(cmdpt0 + i); + // adjust intValues, which are pointers into the command stack, + // by the 0-point offset of the command pointer + // negative less negative;positive less positive if (aatoken[i].length > 0) { Token tokenCommand = aatoken[i][0]; if (Token.tokAttr(tokenCommand.tok, Token.flowCommand)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-07-22 21:14:06
|
Revision: 13649 http://jmol.svn.sourceforge.net/jmol/?rev=13649&view=rev Author: hansonr Date: 2010-07-22 21:13:59 +0000 (Thu, 22 Jul 2010) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptContext.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java Modified: trunk/Jmol/src/org/jmol/script/ScriptContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptContext.java 2010-07-22 20:10:40 UTC (rev 13648) +++ trunk/Jmol/src/org/jmol/script/ScriptContext.java 2010-07-22 21:13:59 UTC (rev 13649) @@ -64,13 +64,13 @@ ScriptContext() { } - StringBuffer getContextTrace(StringBuffer sb) { + StringBuffer getContextTrace(StringBuffer sb, boolean isTop) { if (sb == null) sb = new StringBuffer(); sb.append(ScriptEvaluator.setErrorLineMessage(functionName, filename, - lineNumbers[pc], pc, ScriptEvaluator.statementAsString(statement, iToken, false))); + lineNumbers[pc], pc, ScriptEvaluator.statementAsString(statement, (isTop ? iToken : 9999), false))); if (parentContext != null) - parentContext.getContextTrace(sb); + parentContext.getContextTrace(sb, false); return sb; } } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-22 20:10:40 UTC (rev 13648) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-22 21:13:59 UTC (rev 13649) @@ -2695,7 +2695,7 @@ String err = "\n----"; if (filename != null || functionName != null) err += "line " + lineCurrent + " command " + (pcCurrent + 1) + " of " - + (functionName == null ? filename : "function " + functionName) + + (functionName == null ? filename : functionName.equals("try") ? "try" : "function " + functionName) + ":"; err += "\n " + lineInfo; return err; @@ -2714,7 +2714,7 @@ message = ""; return; } - String s = getScriptContext().getContextTrace(null).toString(); + String s = getScriptContext().getContextTrace(null, true).toString(); while (scriptLevel > 0) popContext(false, false); message += s; @@ -2916,6 +2916,11 @@ } else if (token.intValue != Integer.MAX_VALUE) sb.append(Token.nameOf(token.intValue)).append(" "); break; + case Token.trycmd: + continue; + case Token.end: + sb.append("try"); + continue; default: if (Token.tokAttr(token.tok, Token.identifier) || !doLogMessages) break; @@ -2923,10 +2928,9 @@ continue; } if (token.value != null) - // value SHOULD NEVER BE NULL, BUT JUST IN CASE... sb.append(token.value.toString()); } - if (iTok >= len - 1) + if (iTok >= len - 1 && iTok != 9999) sb.append(" <<"); return sb.toString(); } @@ -8793,7 +8797,7 @@ String msg = null; if (statementLength == 1) { if (!isSyntaxCheck) - msg = getScriptContext().getContextTrace(null).toString(); + msg = getScriptContext().getContextTrace(null, true).toString(); } else { msg = optParameterAsString(1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-07-23 17:15:36
|
Revision: 13661 http://jmol.svn.sourceforge.net/jmol/?rev=13661&view=rev Author: hansonr Date: 2010-07-23 17:15:22 +0000 (Fri, 23 Jul 2010) Log Message: ----------- version=12.0.RC27_dev fixing bug with context popping Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/script/Token.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-23 15:18:59 UTC (rev 13660) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-23 17:15:22 UTC (rev 13661) @@ -5413,39 +5413,7 @@ switch (tok) { case Token.gotocmd: String strTo = parameterAsString(checkLast(1)); - int pcTo = -1; - for (int i = 0; i < aatoken.length; i++) { - Token[] tokens = aatoken[i]; - if (tokens[0].tok == Token.message || tokens[0].tok == Token.nada) - if (tokens[tokens.length - 1].value.toString() - .equalsIgnoreCase(strTo)) { - pcTo = i; - break; - } - } - if (pcTo < 0) - error(ERROR_invalidArgument); - int di = (pcTo < pc ? 1 : -1); - int nPush = 0; - for (int i = pcTo; i != pc; i += di) { - switch (aatoken[i][0].tok) { - case Token.push: - case Token.process: - case Token.forcmd: - case Token.catchcmd: - case Token.whilecmd: - nPush++; - break; - case Token.pop: - case Token.end: - nPush--; - break; - } - } - if (nPush != 0) - error(ERROR_invalidArgument); - if (!isSyntaxCheck) - pc = pcTo - 1; // ... resetting the program counter + gotoCmd(strTo); return isForCheck; case Token.loop: // back to the beginning of this script @@ -5665,6 +5633,49 @@ return isForCheck; } + private void gotoCmd(String strTo) throws ScriptException { + int pcTo = (strTo == null ? aatoken.length - 1 : -1); + for (int i = pcTo + 1; i < aatoken.length; i++) { + Token[] tokens = aatoken[i]; + if (tokens[0].tok == Token.message || tokens[0].tok == Token.nada) + if (tokens[tokens.length - 1].value.toString() + .equalsIgnoreCase(strTo)) { + pcTo = i; + break; + } + } + if (pcTo < 0) + error(ERROR_invalidArgument); + if (strTo == null) + pcTo = 0; + int di = (pcTo < pc ? 1 : -1); + int nPush = 0; + for (int i = pcTo; i != pc; i += di) { + switch (aatoken[i][0].tok) { + case Token.push: + case Token.process: + case Token.forcmd: + case Token.catchcmd: + case Token.whilecmd: + nPush++; + break; + case Token.pop: + case Token.end: + nPush--; + break; + } + } + if (strTo == null) { + pcTo = Integer.MAX_VALUE; + for (; nPush > 0; --nPush) + popContext(false, false); + } + if (nPush != 0) + error(ERROR_invalidArgument); + if (!isSyntaxCheck) + pc = pcTo - 1; // ... resetting the program counter + } + private void breakCmd(int pt) { // pt is a backward reference if (pt < 0) { @@ -5745,7 +5756,7 @@ ScriptVariable t = getContextVariableAsVariable("_retval"); if (t == null) { if (!isSyntaxCheck) - pcEnd = pc; + gotoCmd(null); return; } Vector v = (tv != null || statementLength == 1 ? null : (Vector) parameterExpression(1, @@ -5758,7 +5769,7 @@ t.value = tv.value; t.intValue = tv.intValue; t.tok = tv.tok; - pcEnd = pc; + gotoCmd(null); } private void help() throws ScriptException { Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-07-23 15:18:59 UTC (rev 13660) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-07-23 17:15:22 UTC (rev 13661) @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.BitSet; import java.util.Date; +import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import java.util.regex.Matcher; @@ -2310,6 +2311,17 @@ return addX(ScriptVariable.sizeOf(x2)); case Token.type: return addX(ScriptVariable.typeOf(x2)); + case Token.keys: + if (x2.tok != Token.hash) + return addX(""); + Enumeration e = ((Hashtable)x2.value).keys(); + Vector v = new Vector(); + while (e.hasMoreElements()) + v.add(e.nextElement()); + String[] keys = new String[v.size()]; + for (int i = 0; i < keys.length; i++) + keys[i] = (String) v.get(i); + return addX(keys); case Token.lines: switch (x2.tok) { case Token.matrix3f: Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2010-07-23 15:18:59 UTC (rev 13660) +++ trunk/Jmol/src/org/jmol/script/Token.java 2010-07-23 17:15:22 UTC (rev 13661) @@ -524,6 +524,7 @@ public final static int unitxyz =13 | mathproperty | atomproperty; public final static int vibxyz =14 | mathproperty | atomproperty | settable; final static int w =15 | mathproperty;// new + final static int keys =16 | mathproperty; // new // occupancy, radius, and structure are odd, because they takes different meanings when compared @@ -1725,6 +1726,7 @@ "isAromatic", new Token(isaromatic), "Jmol", new Token(jmol), "join", new Token(join), + "keys", new Token(keys), "last", new Token(last), "left", new Token(left), "length", new Token(length), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-07-24 20:31:02
|
Revision: 13682 http://jmol.svn.sourceforge.net/jmol/?rev=13682&view=rev Author: hansonr Date: 2010-07-24 20:30:55 +0000 (Sat, 24 Jul 2010) Log Message: ----------- oops -- PROMPT should not require @{...} Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/Token.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-24 19:47:21 UTC (rev 13681) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-07-24 20:30:55 UTC (rev 13682) @@ -8851,7 +8851,7 @@ if (!isSyntaxCheck) msg = getScriptContext().getContextTrace(null, true).toString(); } else { - msg = optParameterAsString(1); + msg = (String) parameterExpression(1, 0, "", false); } if (!isSyntaxCheck) viewer.prompt(msg, "OK", null, true); Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2010-07-24 19:47:21 UTC (rev 13681) +++ trunk/Jmol/src/org/jmol/script/Token.java 2010-07-24 20:30:55 UTC (rev 13682) @@ -256,7 +256,8 @@ final static int set = 3 | mathExpressionCommand | expression; final static int var = 4 | mathExpressionCommand; final static int log = 5 | mathExpressionCommand; - + //final static int prompt see mathfunc + public final static int echo = 1 | implicitStringCommand | shapeCommand | setparam; final static int help = 2 | implicitStringCommand; public final static int hover = 3 | implicitStringCommand | defaultON; @@ -724,7 +725,7 @@ // xxx(a,b,c) final static int hkl = 1 | 3 << 9 | mathfunc; - final static int prompt = 2 | 3 << 9 | mathfunc | scriptCommand; + final static int prompt = 2 | 3 << 9 | mathfunc | mathExpressionCommand; final static int select = 3 | 3 << 9 | mathfunc | atomExpressionCommand; // ___.xxx(a,b,c) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-05 12:52:09
|
Revision: 13834 http://jmol.svn.sourceforge.net/jmol/?rev=13834&view=rev Author: hansonr Date: 2010-08-05 12:52:02 +0000 (Thu, 05 Aug 2010) Log Message: ----------- contextVariable generics Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptFunction.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-05 05:33:23 UTC (rev 13833) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-05 12:52:02 UTC (rev 13834) @@ -1649,9 +1649,9 @@ private Token[][] aatoken; private short[] lineNumbers; private int[][] lineIndices; - private Hashtable contextVariables; + private Hashtable<String, ScriptVariable> contextVariables; - public Hashtable getContextVariables() { + public Hashtable<String, ScriptVariable> getContextVariables() { return contextVariables; } @@ -1826,7 +1826,7 @@ private ParallelProcessor parallelProcessor; - ScriptVariable runFunction(ScriptFunction function, String name, List params, Token tokenAtom, + ScriptVariable runFunction(ScriptFunction function, String name, List params, ScriptVariable tokenAtom, boolean getReturn) throws ScriptException { pushContext(null); //System.out.println(contextPath); @@ -1876,14 +1876,14 @@ } private void runFunction(ScriptFunction function, List params, - Token tokenAtom) throws ScriptException { + ScriptVariable tokenAtom) throws ScriptException { aatoken = function.aatoken; lineNumbers = function.lineNumbers; lineIndices = function.lineIndices; script = function.script; pc = 0; if (function.names != null) { - contextVariables = new Hashtable(); + contextVariables = new Hashtable<String, ScriptVariable>(); function.setVariables(contextVariables, params); } if (tokenAtom != null) Modified: trunk/Jmol/src/org/jmol/script/ScriptFunction.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptFunction.java 2010-08-05 05:33:23 UTC (rev 13833) +++ trunk/Jmol/src/org/jmol/script/ScriptFunction.java 2010-08-05 12:52:02 UTC (rev 13834) @@ -71,7 +71,7 @@ typeName = Token.nameOf(tok); } - void setVariables(Hashtable<String, Object> contextVariables, List<ScriptVariable> params) { + void setVariables(Hashtable<String, ScriptVariable> contextVariables, List<ScriptVariable> params) { int nParams = (params == null ? 0 : params.size()); for (int i = names.size(); --i >= 0;) { String name = names.get(i).toLowerCase(); @@ -84,7 +84,7 @@ contextVariables.put("_retval", ScriptVariable.intVariable(tok == Token.trycmd ? Integer.MAX_VALUE : 0)); } - public void unsetVariables(Hashtable<String, Object> contextVariables, List<ScriptVariable> params) { + public void unsetVariables(Hashtable<String, ScriptVariable> contextVariables, List<ScriptVariable> params) { // set list values in case they have changed. int nParams = (params == null ? 0 : params.size()); int nNames = names.size(); @@ -94,7 +94,7 @@ ScriptVariable global = params.get(i); if (global.tok != Token.list) continue; - ScriptVariable local = (ScriptVariable) contextVariables.get(names.get(i).toLowerCase()); + ScriptVariable local = contextVariables.get(names.get(i).toLowerCase()); if (local.tok != Token.list) continue; global.value = local.value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-06 13:36:06
|
Revision: 13846 http://jmol.svn.sourceforge.net/jmol/?rev=13846&view=rev Author: hansonr Date: 2010-08-06 13:35:59 +0000 (Fri, 06 Aug 2010) Log Message: ----------- script generics and clean-up Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-06 13:01:52 UTC (rev 13845) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-06 13:35:59 UTC (rev 13846) @@ -3294,7 +3294,7 @@ case Token.spec_atom: int atomID = instruction.intValue; if (atomID > 0) - rpn.addX(compareInt(Token.atomid, null, Token.opEQ, atomID)); + rpn.addX(compareInt(Token.atomid, Token.opEQ, atomID)); else rpn.addX(getAtomBits(instruction.tok, value)); break; @@ -3502,8 +3502,7 @@ } float[] data = (tokWhat == Token.property ? viewer .getDataFloat(property) : null); - rpn.addX(isIntProperty ? compareInt(tokWhat, data, tokOperator, - comparisonValue) : isStringProperty ? compareString(tokWhat, + rpn.addX(isIntProperty ? compareInt(tokWhat, tokOperator, comparisonValue) : isStringProperty ? compareString(tokWhat, tokOperator, (String) val) : compareFloat(tokWhat, data, tokOperator, comparisonFloat)); break; @@ -3615,8 +3614,7 @@ return bs; } - protected BitSet compareInt(int tokWhat, float[] data, int tokOperator, - int comparisonValue) { + protected BitSet compareInt(int tokWhat, int tokOperator, int comparisonValue) { int propertyValue = Integer.MAX_VALUE; BitSet propertyBitSet = null; int bitsetComparator = tokOperator; @@ -3766,8 +3764,28 @@ if (!match || propertyValue == Integer.MAX_VALUE) tokOperator = Token.none; } - if (tokOperator != Token.none) - match = compareInt(tokOperator, propertyValue, comparisonValue); + switch (tokOperator) { + case Token.none: + break; + case Token.opLT: + match = (propertyValue < comparisonValue); + break; + case Token.opLE: + match = (propertyValue <= comparisonValue); + break; + case Token.opGE: + match = (propertyValue >= comparisonValue); + break; + case Token.opGT: + match = (propertyValue > comparisonValue); + break; + case Token.opEQ: + match = (propertyValue == comparisonValue); + break; + case Token.opNE: + match = (propertyValue != comparisonValue); + break; + } if (match) bs.set(i); } @@ -3786,25 +3804,6 @@ return false; } - private static boolean compareInt(int tokOperator, int propertyValue, - int comparisonValue) { - switch (tokOperator) { - case Token.opLT: - return propertyValue < comparisonValue; - case Token.opLE: - return propertyValue <= comparisonValue; - case Token.opGE: - return propertyValue >= comparisonValue; - case Token.opGT: - return propertyValue > comparisonValue; - case Token.opEQ: - return propertyValue == comparisonValue; - case Token.opNE: - return propertyValue != comparisonValue; - } - return false; - } - private static boolean compareFloat(int tokOperator, float propertyFloat, float comparisonFloat) { switch (tokOperator) { @@ -4670,8 +4669,11 @@ multiplier = 1; break; case Token.divide: - getToken(++i); case Token.spec_model: // after a slash + if (!allowFractional) + error(ERROR_invalidArgument); + if (theTok == Token.divide) + getToken(++i); n--; if (n < 0 || integerOnly) error(ERROR_invalidArgument); @@ -5104,7 +5106,7 @@ display(false); break; case Token.hbond: - hbond(true); + hbond(); break; case Token.history: history(1); @@ -5769,12 +5771,11 @@ } } - @SuppressWarnings("unchecked") private int switchCmd(ContextToken c, int tok) throws ScriptException { if (tok == Token.switchcmd) c.addName("_var"); - ScriptVariable var = (ScriptVariable) c.contextVariables.get("_var"); + ScriptVariable var = c.contextVariables.get("_var"); if (var == null) return 1; // OK, case found -- no more testing if (tok == 0) { @@ -7024,14 +7025,13 @@ String file = parameterAsString(checkLast(++i)); if (isSyntaxCheck) return; - Hashtable htParams = new Hashtable(); - Object image = null; + String[] retFileName = new String[1]; + Image image = null; if (!file.equalsIgnoreCase("none") && file.length() > 0) - image = viewer.getFileAsImage(file, htParams); - if (image instanceof String) - evalError((String) image, null); - viewer.setBackgroundImage((String) htParams.get("fullPathName"), - (Image) image); + image = viewer.getFileAsImage(file, retFileName); + if (image == null) + evalError(retFileName[0], null); + viewer.setBackgroundImage(retFileName[0], image); return; } if (isColorParam(i) || theTok == Token.none) { @@ -7818,13 +7818,12 @@ String text = optParameterAsString(index); if (viewer.getEchoStateActive()) { if (isImage) { - Hashtable htParams = new Hashtable(); - Object image = viewer.getFileAsImage(text, htParams); - if (image instanceof String) { - text = (String) image; + String[] retFileName = new String[1]; + Image image = viewer.getFileAsImage(text, retFileName); + if (image == null) { + text = retFileName[0]; } else { - setShapeProperty(JmolConstants.SHAPE_ECHO, "text", htParams - .get("fullPathName")); + setShapeProperty(JmolConstants.SHAPE_ECHO, "text", retFileName[0]); setShapeProperty(JmolConstants.SHAPE_ECHO, "image", image); text = null; } @@ -10508,7 +10507,7 @@ setShapeProperty(JmolConstants.SHAPE_STICKS, "type", Integer.valueOf(JmolEdge.BOND_COVALENT_MASK)); } - private void hbond(boolean isCommand) throws ScriptException { + private void hbond() throws ScriptException { if (statementLength == 2 && getToken(1).tok == Token.calculate) { if (isSyntaxCheck) return; @@ -11053,7 +11052,7 @@ setIntProperty("animationFps", intParameter(checkLast(2))); break; default: - frameControl(1, true); + frameControl(1); } } @@ -11200,7 +11199,7 @@ isRange = true; break; default: - frameControl(offset, false); + frameControl(offset); return; } } @@ -11304,7 +11303,7 @@ return bs; } - private void frameControl(int i, boolean isSubCmd) throws ScriptException { + private void frameControl(int i) throws ScriptException { switch (getToken(checkLast(i)).tok) { case Token.playrev: case Token.play: Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-06 13:01:52 UTC (rev 13845) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-06 13:35:59 UTC (rev 13846) @@ -901,7 +901,7 @@ } } else { BitSet bs = (args[0].value instanceof BitSet ? (BitSet) args[0].value - : eval.compareInt(Token.resno, null, Token.opEQ, ScriptVariable + : eval.compareInt(Token.resno, Token.opEQ, ScriptVariable .iValue(args[0]))); switch (tok) { case Token.point: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-09-19 13:31:12
|
Revision: 14339 http://jmol.svn.sourceforge.net/jmol/?rev=14339&view=rev Author: hansonr Date: 2010-09-19 13:31:06 +0000 (Sun, 19 Sep 2010) Log Message: ----------- minor tweaks Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-09-18 22:22:11 UTC (rev 14338) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-09-19 13:31:06 UTC (rev 14339) @@ -15551,20 +15551,21 @@ } break; case Token.cutoff: + sbCommand.append(" cutoff "); if (tokAt(++i) == Token.plus) { propertyName = "cutoffPositive"; propertyValue = new Float(cutoff = floatParameter(++i)); - sbCommand.append(" cutoff +").append(propertyValue); + sbCommand.append("+").append(propertyValue); } else if (isFloatParameter(i)){ propertyName = "cutoff"; propertyValue = new Float(cutoff = floatParameter(i)); - sbCommand.append(" cutoff ").append(propertyValue); + sbCommand.append(propertyValue); } else { propertyName = "cutoffRange"; propertyValue = floatParameterSet(i, 2, 2); addShapeProperty(propertyList, "cutoff", Float.valueOf(0)); - addShapeProperty(propertyList, "colorDensity", null); - sbCommand.append(" cutoff ").append(Escape.escape((float[]) propertyValue, true)); + //addShapeProperty(propertyList, "colorDensity", null); + sbCommand.append(Escape.escape((float[]) propertyValue, true)); i = iToken; } break; Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-09-18 22:22:11 UTC (rev 14338) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-09-19 13:31:06 UTC (rev 14339) @@ -2200,6 +2200,12 @@ } private boolean evaluateColor(ScriptVariable[] args) { + // color("rwb") # "" for most recently used scheme for coloring by property + // color("rwb", min, max) # min/max default to most recent property mapping + // color("rwb", min, max, value) # returns color + // color("$isosurfaceId") # info for a given isosurface + // color("$isosurfaceId", value) # color for a given mapped isosurface value + String colorScheme = (args.length > 0 ? ScriptVariable.sValue(args[0]) : ""); boolean isIsosurface = colorScheme.startsWith("$"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-10-21 13:19:51
|
Revision: 14524 http://jmol.svn.sourceforge.net/jmol/?rev=14524&view=rev Author: hansonr Date: 2010-10-21 13:19:44 +0000 (Thu, 21 Oct 2010) Log Message: ----------- version=12.1.16_dev # bug fix: naming functions or variables after Jmol token names fails or acts unexpectedly # (fixing this bug required script compiler changes, and that lead to the # two new features below) # # bug fix: User variables and functions removed from state because they are # no longer necessary and also indeterminant in terms of the "state". # Originally these were needed because ECHO and DEFINE can be dynamic # -- which is still true -- and because certain commands such as ISOSURFACE # were being saved in the state just as their strings instead of their # intepreted code. But that was changed for 12.0, and this fix also changes # ECHO to be saved in its current state, not its dynamic state. While # dynamic DEFINE types may include variables, they aren't really # part of the "state" per se and aren't needed to recreate the state. So # they are dropped from the state with this fix as well. # # new feature: function calls can look like Jmol commands (also added to 12.0): # function myfunc(a, b, c, d){....} # myfunc a b c d # -- these are MATHEMATICAL commands # -- use just a b, not @a @b # # new feature: custom overloading of Jmol commands (also added to 12.0) # function measure(a, b) { print "measuring " + a + " " + b; measure @a @b } # measure {atomno=2} {atomno=3} # -- within function X, command X is standard Jmol; # -- outside the function, it is a reference to that function # -- overloaded functions are not saved in the state # # bug fix: naming functions or variables after Jmol token names fails or acts unexpectedly # (fixing this bug required script compiler changes, and that lead to the the # two new features above) # # bug fix: array variable elements cannot be changed # Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2010-10-21 13:19:28 UTC (rev 14523) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2010-10-21 13:19:44 UTC (rev 14524) @@ -49,9 +49,11 @@ * */ - protected String script; protected Viewer viewer; + protected String script; + protected boolean isStateScript; + protected short lineCurrent; protected int iCommand; @@ -215,7 +217,7 @@ protected Map<String, Boolean> htUserFunctions; protected boolean isUserFunction(String name) { - return viewer.isFunction(name) || htUserFunctions.containsKey(name); + return (!isStateScript && (viewer.isFunction(name) || htUserFunctions.containsKey(name))); } private boolean isExpressionNext() { Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-10-21 13:19:28 UTC (rev 14523) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-10-21 13:19:44 UTC (rev 14524) @@ -261,6 +261,7 @@ htUserFunctions = new Hashtable<String, Boolean>(); script = script.replace('\u201C', '"').replace('\u201D', '"'); script = cleanScriptComments(script); + isStateScript = (script.indexOf(Viewer.STATE_VERSION_STAMP) >= 0); cchScript = this.script.length(); // these four will be returned: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-01-27 12:49:58
|
Revision: 15054 http://jmol.svn.sourceforge.net/jmol/?rev=15054&view=rev Author: hansonr Date: 2011-01-27 12:49:51 +0000 (Thu, 27 Jan 2011) Log Message: ----------- version=12.0.30_dev # bug fix: scriptLevelMax 20 too small -- changed to 100 # bug fix: for/while local variables improperly localized in iterative functions # bug fix: 12.0.29 should not have changed <string> + <array> to be <array> Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptContext.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptContext.java 2011-01-26 23:32:31 UTC (rev 15053) +++ trunk/Jmol/src/org/jmol/script/ScriptContext.java 2011-01-27 12:49:51 UTC (rev 15054) @@ -47,6 +47,7 @@ public int iToken; public StringBuffer outputBuffer; public Map<String, ScriptVariable> contextVariables; + public boolean isFunction; public boolean isStateScript; public String errorMessage; public String errorMessageUntranslated; Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2011-01-26 23:32:31 UTC (rev 15053) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2011-01-27 12:49:51 UTC (rev 15054) @@ -1699,7 +1699,7 @@ // ///////////////////// general fields ////////////////////// - private final static int scriptLevelMax = 20; + private final static int scriptLevelMax = 100; private Thread currentThread; protected Viewer viewer; @@ -1888,6 +1888,8 @@ return contextVariables.get(var); ScriptContext context = thisContext; while (context != null) { + if (context.isFunction == true) + return null; if (context.contextVariables != null && context.contextVariables.containsKey(var)) return context.contextVariables.get(var); @@ -1912,6 +1914,7 @@ ScriptVariable tokenAtom, boolean getReturn) throws ScriptException { pushContext(null); + thisContext.isFunction = true; //System.out.println(contextPath); if (function == null) { function = viewer.getFunction(name); @@ -2329,11 +2332,14 @@ thisContext = getScriptContext(); thisContext.token = token; if (token != null) { - contextVariables = token.contextVariables; + contextVariables = new Hashtable<String, ScriptVariable>(); + for (String key: token.contextVariables.keySet()) + ScriptCompiler.addContextVariable(contextVariables, key); } if (Logger.debugging || isCmdLine_c_or_C_Option) Logger.info("-->>-------------".substring(0, scriptLevel + 5) + scriptLevel + " " + filename + " " + token + " " + thisContext); + //System.out.println("scriptEval " + token + " " + scriptLevel + ": " + contextVariables); } public ScriptContext getScriptContext() { @@ -12869,6 +12875,7 @@ } if (isUserVariable) { + System.out.println("setvar " + key + " " + t); t.set(tv, false); return; } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-01-26 23:32:31 UTC (rev 15053) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-01-27 12:49:51 UTC (rev 15054) @@ -2632,11 +2632,11 @@ || Math.abs(f1 - f2) >= 0.000001); } case Token.plus: - if (x1.tok == Token.varray || x2.tok == Token.varray) - return addX(ScriptVariable.concatList(x1, x2, true)); switch (x1.tok) { default: return addX(ScriptVariable.fValue(x1) + ScriptVariable.fValue(x2)); + case Token.varray: + return addX(ScriptVariable.concatList(x1, x2, true)); case Token.integer: switch (x2.tok) { case Token.string: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-12-21 14:27:12
|
Revision: 16615 http://jmol.svn.sourceforge.net/jmol/?rev=16615&view=rev Author: hansonr Date: 2011-12-21 14:27:01 +0000 (Wed, 21 Dec 2011) Log Message: ----------- version=12.3.10 # new feature: _animTimeSec # new feature: Application -- press and hold animation next/prev button to continuously run animation # new feature: write PDB adds CONECT records # -- for all multiple bonding and all HETATM bonds # -- uses CONECT i j j to indicate multiple bonding # new feature: compare {from} {to} FRAME # -- aligns frames automatically # -- particularly nice for IRC calculation animations # -- for example: compare {file=2} {1.1} FRAME # -- can be followed by quaternion, atom, or SMILES options # -- for example: compare {file=2} {1.1} FRAME ATOMS @1 @5 @2 @8 @3 @9 # (all of file 2 atoms moved) file 2 atoms 1,2,3 aligned # with file 1.1 atoms 5,8,9) # -- if {to} is a subset of {from}, then FRAME is unnecessary, # and if ATOMS is included, then just the list of alignment # atoms is necessary. For example: # compare {*} {1.1} # compare {*} {1.1} atoms @1 @2 @3 # -- see http://chemapps.stolaf.edu/jmol/docs/examples-12/mp for more examples # bug fix: script @{x} fails # bug fix: Molecular Playground should allow for set allowGestures OFF to disallow swipe # bug fix: lcaoCartoon dual color p orbitals giving white for one lobe # new feature: set echo myecho SCALE 0.3 -- for image scaling # bug fix: after "ZAP; LOAD append" show orientation will have incorrect zyz script # bug fix: function call with @x or @1 in parameters fails # bug fix: PNGJ reading remote fails # bug fix: H5T should not be used as a lead atom ever, because of set showHydrogens FALSE # bug fix: adding H atoms to mol2 file faulty # bug fix: load xxx.png;write PNGJ xxx.png (to same file as loaded) fails Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/Token.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2011-12-21 14:08:57 UTC (rev 16614) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2011-12-21 14:27:01 UTC (rev 16615) @@ -1036,6 +1036,10 @@ break; case Token.script: case Token.getproperty: + if (script.charAt(ichToken) == '@') { + iHaveQuotedString = true; + return OK; + } if (!iHaveQuotedString && lookingAtImpliedString(false, false)) { String str = script.substring(ichToken, ichToken + cchToken); if (tokCommand == Token.script && str.startsWith("javascript:")) { Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2011-12-21 14:08:57 UTC (rev 16614) +++ trunk/Jmol/src/org/jmol/script/Token.java 2011-12-21 14:27:01 UTC (rev 16615) @@ -269,13 +269,13 @@ final static int log = 5 | mathExpressionCommand; //final static int prompt see mathfunc - public final static int echo = 1 | implicitStringCommand | shapeCommand | setparam; + public final static int echo = 1 /* must be odd */ | implicitStringCommand | shapeCommand | setparam; final static int help = 2 /* must be even */ | implicitStringCommand; - public final static int hover = 3 | implicitStringCommand | defaultON; + public final static int hover = 3 /* must be odd */ | implicitStringCommand | defaultON; //final static int javascript see mathfunc //final static int label see mathfunc - final static int message = 5 | implicitStringCommand; - public final static int pause = 7 | implicitStringCommand; + final static int message = 5 /* must be odd */ | implicitStringCommand; + public final static int pause = 7 /* must be odd */ | implicitStringCommand; //these commands control flow //sorry about GOTO! @@ -301,7 +301,7 @@ final static int bind = scriptCommand | 4; final static int bondorder = scriptCommand | 5; final static int calculate = scriptCommand | 6; - final static int cd = scriptCommand | 8 | implicitStringCommand | expression; // must be even + final static int cd = scriptCommand | 8 /* must be even */| implicitStringCommand | expression; // must be even final static int centerAt = scriptCommand | 9; //final static int color see intproperty //final static int configuration see intproperty This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2012-11-01 02:11:16
|
Revision: 17701 http://jmol.svn.sourceforge.net/jmol/?rev=17701&view=rev Author: hansonr Date: 2012-11-01 02:11:08 +0000 (Thu, 01 Nov 2012) Log Message: ----------- preliminary ScriptInterruption.java Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Added Paths: ----------- trunk/Jmol/src/org/jmol/script/ScriptException.java trunk/Jmol/src/org/jmol/script/ScriptInterruption.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2012-11-01 01:44:24 UTC (rev 17700) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2012-11-01 02:11:08 UTC (rev 17701) @@ -2497,9 +2497,9 @@ this.tQuiet = tQuiet; } - protected ScriptContext thisContext = null; + ScriptContext thisContext = null; - private void pushContext(ContextToken token) throws ScriptException { + void pushContext(ContextToken token) throws ScriptException { if (scriptLevel == scriptLevelMax) error(ERROR_tooManyScriptLevels); thisContext = getScriptContext(); @@ -2552,6 +2552,14 @@ return context; } + void resume(ScriptContext sc) throws ScriptException { + thisContext = sc; + if (thisContext.scriptLevel > 0) + scriptLevel = thisContext.scriptLevel - 1; + restoreScriptContext(thisContext, true, false, false); + instructionDispatchLoop(false); + } + void popContext(boolean isFlowCommand, boolean statementOnly) { if (thisContext == null) return; @@ -2561,7 +2569,8 @@ // business when doing push/pop for commands like FOR and WHILE ScriptContext scTemp = (isFlowCommand ? getScriptContext() : null); restoreScriptContext(thisContext, true, isFlowCommand, statementOnly); - restoreScriptContext(scTemp, true, false, true); + if (scTemp != null) + restoreScriptContext(scTemp, true, false, true); if (debugScript || isCmdLine_c_or_C_Option) Logger.info("--<<-------------".substring(0, Math .max(17, scriptLevel + 5)) @@ -2753,7 +2762,7 @@ viewer.setBooleanProperty("refreshing", true); viewer.setStringProperty("_errormessage", strUntranslated); } - throw new ScriptException(message, strUntranslated); + throw new ScriptException(this, message, strUntranslated, true); } final static int ERROR_axisExpected = 0; @@ -3042,42 +3051,6 @@ return err; } - class ScriptException extends Exception { - - private String message; - private String untranslated; - - ScriptException(String msg, String untranslated) { - errorType = message = msg; - iCommandError = pc; - this.untranslated = (untranslated == null ? msg : untranslated); - if (message == null) { - message = ""; - return; - } - String s = getScriptContext().getContextTrace(null, true).toString(); - while (thisContext != null && !thisContext.isTryCatch) - popContext(false, false); - message += s; - this.untranslated += s; - if (thisContext != null || isSyntaxCheck - || msg.indexOf("file recognized as a script file:") >= 0) - return; - Logger.error("eval ERROR: " + toString()); - if (viewer.autoExit) - viewer.exitJmol(); - } - - protected String getErrorMessageUntranslated() { - return untranslated; - } - - @Override - public String toString() { - return message; - } - } - @Override public String toString() { StringXBuilder str = new StringXBuilder(); @@ -3648,10 +3621,10 @@ } int chainID = (pc + 3 < code.length && code[pc + 2].tok == Token.opAND && code[pc + 3].tok == Token.spec_chain ? code[pc + 3].intValue - : '\t'); + : 9); rpn.addXBs(getAtomBits(Token.spec_seqcode_range, new int[] { getSeqCode(instruction), getSeqCode(code[++pc]), chainID })); - if (chainID != '\t') + if (chainID != 9) pc += 2; break; case Token.cell: @@ -5219,7 +5192,7 @@ * of its subsidiary methods. * * - * @param doList + * @param doList debugging flag * @throws ScriptException */ private void instructionDispatchLoop(boolean doList) throws ScriptException { @@ -9834,7 +9807,7 @@ // msg); // return; } - if (viewer.autoExit || !viewer.haveDisplay) + if (viewer.autoExit || !viewer.haveDisplay && !viewer.isJS3D) return false; if (scriptLevel == 0 && pc == aatoken.length - 1) { viewer.scriptStatus("nothing to pause: " + msg); Added: trunk/Jmol/src/org/jmol/script/ScriptException.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptException.java (rev 0) +++ trunk/Jmol/src/org/jmol/script/ScriptException.java 2012-11-01 02:11:08 UTC (rev 17701) @@ -0,0 +1,68 @@ +/* $RCSfile$ + * $Author$ + * $Date$ + * $Revision$ + * + * Copyright (C) 2011 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.jmol.script; + +import org.jmol.util.Logger; + +class ScriptException extends Exception { + + protected final ScriptEvaluator eval; + private String message; + private String untranslated; + + ScriptException(ScriptEvaluator scriptEvaluator, String msg, String untranslated, boolean isError) { + eval = scriptEvaluator; + if (!isError) + return; + eval.errorType = message = msg; + eval.iCommandError = eval.pc; + this.untranslated = (untranslated == null ? msg : untranslated); + if (message == null) { + message = ""; + return; + } + String s = eval.getScriptContext().getContextTrace(null, true).toString(); + while (eval.thisContext != null && !eval.thisContext.isTryCatch) + eval.popContext(false, false); + message += s; + this.untranslated += s; + if (eval.thisContext != null || eval.isSyntaxCheck + || msg.indexOf("file recognized as a script file:") >= 0) + return; + Logger.error("eval ERROR: " + toString()); + if (eval.viewer.autoExit) + eval.viewer.exitJmol(); + } + + protected String getErrorMessageUntranslated() { + return untranslated; + } + + @Override + public String toString() { + return message; + } +} \ No newline at end of file Added: trunk/Jmol/src/org/jmol/script/ScriptInterruption.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptInterruption.java (rev 0) +++ trunk/Jmol/src/org/jmol/script/ScriptInterruption.java 2012-11-01 02:11:08 UTC (rev 17701) @@ -0,0 +1,51 @@ +/* $RCSfile$ + * $Author$ + * $Date$ + * $Revision$ + * + * Copyright (C) 2011 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.jmol.script; + +class ScriptInterruption extends ScriptException { + public int delayMs; + public long targetTime; + private ScriptContext sc; + + ScriptInterruption(ScriptEvaluator eval, int delayMs) { + super(eval, (eval.viewer.autoExit ? "Interruption Error" : null), null, eval.viewer.autoExit); + if (eval.viewer.autoExit) + return; + this.delayMs = delayMs; + this.targetTime = System.currentTimeMillis() + delayMs; + try { + eval.scriptLevel--; + eval.pushContext(null); + sc = eval.thisContext; + } catch (ScriptException e) { + // unattainable + } + } + + public void resumeExecution() throws ScriptException { + eval.resume(sc); + } +} \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2012-11-01 01:44:24 UTC (rev 17700) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2012-11-01 02:11:08 UTC (rev 17701) @@ -40,7 +40,6 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.MeasurementData; import org.jmol.modelset.Bond.BondSet; -import org.jmol.script.ScriptEvaluator.ScriptException; import org.jmol.util.ArrayUtil; import org.jmol.util.AxisAngle4f; import org.jmol.util.BitSet; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-20 19:41:08
|
Revision: 19366 http://sourceforge.net/p/jmol/code/19366 Author: hansonr Date: 2014-02-20 19:41:01 +0000 (Thu, 20 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.11_2014.02.21" new feature: catchable THROW -- as in Java or JavaScript, allows a way of jumping out of a process. -- outside of try/catch gives the expected error report: $ print "testing" $ throw "testing here" $ print "we will never see this" testing script ERROR: testing here ---- throw >> "testing here" << -- passes a string as the variable thrown_value $ print thrown_value testing here -- can be trapped with try/catch: try{ print "testing" throw "testing here" print "continuing" } catch(e) { print "thown_value=" + thrown_value; } results in: testing thrown_value=testing here new feature: asynchronous resumable processes -- THROW CONTEXT contextName -- throws a catchable error, but in the process of doing so, creates a script context that allows RESUMING at the point of the throw, unlike anything in JavaScript or Java (or perhaps like a debug mode). -- if within a try/catch phrase, is handled by user. -- if not within a try/catch phrase just reports to resume, enter: &contextName -- essentially provides a callback into the running script, so you could, for example, put a running script on hold while you load a file, check variables, etc., then continue. -- can be resumed using RESUME CONTEXT or just & followed by the name of the context: &test resume context &test -- replaces PAUSE/RESUME, now deprecated. -- The current context returns to the highest level, however the variables in the context that was thrown are accessible as though the context variable was an associative array. So, for example, if we have function f(a, b, c) { var x = 5 throw context testing print "x=" + x } f(1,2,3) print "done" The context will be saved as the variable "testing", and we can then test all the variables in that saved context, (and change them before continuing): print testing["x"] 5 testing["x"]++ print testing _path : [script] >> function f _retval : 0 a : 2 b : 2 c : 3 x : 6 -- contexts can be restored using &contextName In the above case, we would get the report: x=6 done new feature: SAVE CONTEXT contextName -- similar to THROW, but does not stop processing. So in the above example, if we change THROW to SAVE, the processing continues, but after it has completed, we can change context variables and run it again. new feature: show SAVED -- same as show SAVE new feature: delete $SAVED savedName delete $SAVED Context_xxxx -- $ is important; case is not. -- allows selective deletion of saved objects -- Contexts always start with "Context_" but the subname "xxxx" in this case will work as well. new feature: RESUME with arguments is synonymous with RESTORE feature change: Better idea for THROW: throw "this is an error" throw x -- that is, throw is like PRINT, not LABEL Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptContext.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptInterruption.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/script/T.java Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -615,6 +615,7 @@ return (i < 1 || i > sv.size() ? "" : sValue(sv.get(i - 1))); //$FALL-THROUGH$ case hash: + case context: sb = new SB(); map = new Hashtable<Object, Boolean>(); sValueArray(sb, (SV) x, map, 0, false); @@ -641,44 +642,22 @@ } } - @SuppressWarnings("unchecked") private static void sValueArray(SB sb, SV vx, Map<Object, Boolean> map, int level, boolean isEscaped) { switch (vx.tok) { case hash: + case context: if (map.containsKey(vx)) { sb.append(isEscaped ? "{}" : vx.myName == null ? "<circular reference>" : "<" + vx.myName + ">"); break; } map.put(vx, Boolean.TRUE); - Map<String, SV> ht = (Map<String, SV>) vx.value; - Set<String> keyset = ht.keySet(); - String[] keys = ht.keySet().toArray(new String[keyset.size()]); - Arrays.sort(keys); - - if (isEscaped) { - sb.append("{ "); - String sep = ""; - for (int i = 0; i < keys.length; i++) { - String key = keys[i]; - sb.append(sep).append(PT.esc(key)).appendC(':'); - sValueArray(sb, ht.get(key), map, level + 1, true); - sep = ", "; - } - sb.append(" }"); - break; - } - for (int i = 0; i < keys.length; i++) { - sb.append(keys[i]).append("\t:"); - SV v = ht.get(keys[i]); - SB sb2 = new SB(); - sValueArray(sb2, v, map, level + 1, isEscaped); - String value = sb2.toString(); - sb.append(value.indexOf("\n") >= 0 ? "\n" : "\t"); - sb.append(value).append("\n"); - } + Map<String, SV> ht = (vx.tok == context ? + ((ScriptContext) vx.value).getFullMap() + : vx.getMap()); + addKeys(sb, map, ht, level, isEscaped); break; case varray: if (map.containsKey(vx)) { @@ -709,6 +688,33 @@ } } + private static void addKeys(SB sb, Map<Object, Boolean> map, Map<String, SV> ht, int level, boolean isEscaped) { + Set<String> keyset = ht.keySet(); + String[] keys = ht.keySet().toArray(new String[keyset.size()]); + Arrays.sort(keys); + if (isEscaped) { + sb.append("{ "); + String sep = ""; + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + sb.append(sep).append(PT.esc(key)).appendC(':'); + sValueArray(sb, ht.get(key), map, level + 1, true); + sep = ", "; + } + sb.append(" }"); + return; + } + for (int i = 0; i < keys.length; i++) { + sb.append(keys[i]).append("\t:"); + SV v = ht.get(keys[i]); + SB sb2 = new SB(); + sValueArray(sb2, v, map, level + 1, isEscaped); + String value = sb2.toString(); + sb.append(value.indexOf("\n") >= 0 ? "\n" : "\t"); + sb.append(value).append("\n"); + } + } + public static P3 ptValue(SV x) { switch (x.tok) { case point3f: @@ -1378,7 +1384,13 @@ @SuppressWarnings("unchecked") SV mapValue(String key) { - return (tok == hash ? ((Map<String, SV>) value).get(key) : null); + switch (tok) { + case hash: + return ((Map<String, SV>) value).get(key); + case context: + return ((ScriptContext) value).getVariable(key); + } + return null; } @SuppressWarnings("unchecked") @@ -1405,9 +1417,26 @@ case integer: case decimal: return sValue(this); + case context: + return PT.toJSON(null, ((ScriptContext) value).getFullMap()); default: return PT.toJSON(null, value); } } + public void mapPut(String key, SV v) { + getMap().put(key, v); + } + + @SuppressWarnings("unchecked") + private Map<String, SV> getMap() { + switch (tok) { + case hash: + return (Map<String, SV>) value; + case context: + return ((ScriptContext) value).vars; + } + return null; + } + } Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -241,7 +241,7 @@ addTokenToPostfixToken(T.tokenExpressionEnd); } if (moreTokens()) { - if (tokCommand != T.select && !isEmbeddedExpression) + if (tokCommand != T.select && tokCommand != T.delete && !isEmbeddedExpression) return error(ERROR_endOfExpressionExpected); if (tokCommand == T.select) { // advanced select, with two expressions, the first Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -168,7 +168,7 @@ sc.errorMessage = sc.errorMessageUntranslated; sc.lineIndices = lineIndices; sc.lineNumbers = lineNumbers; - sc.contextVariables = contextVariables; + sc.vars = contextVariables; return sc; } @@ -1508,6 +1508,13 @@ if (theTok != T.leftbrace) lastFlowCommand = null; + if (theTok == T.opAnd) { + //& introduces a resume context + setCommand(theToken = T.o(T.resume, "resume")); + addTokenToPrefix(theToken); + theToken = T.o(T.context, "context"); + return OK; + } if (T.tokAttr(tokCommand, T.scriptCommand)) break; Modified: trunk/Jmol/src/org/jmol/script/ScriptContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptContext.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptContext.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -25,6 +25,7 @@ package org.jmol.script; +import java.util.Hashtable; import java.util.Map; import org.jmol.api.JmolParallelProcessor; @@ -39,7 +40,7 @@ public boolean allowJSThreads; boolean chk; public String contextPath = " >> "; - public Map<String, SV> contextVariables; + public Map<String, SV> vars; boolean displayLoadErrorsSave; public String errorMessage; String errorMessageUntranslated; @@ -63,6 +64,7 @@ JmolParallelProcessor parallelProcessor; public ScriptContext parentContext; public int pc; + public int pc0; public int pcEnd = Integer.MAX_VALUE; public String script; String scriptExtensions; @@ -80,4 +82,43 @@ id = ++contextCount; } + public void setMustResume() { + ScriptContext sc = this; + while (sc != null) { + sc.mustResumeEval = true; + sc.pc = sc.pc0; + sc = sc.parentContext; + } + } + + public SV getVariable(String var) { + ScriptContext context = this; + while (context != null) { + if (context.isFunction == true) + return null; + if (context.vars != null + && context.vars.containsKey(var)) + return context.vars.get(var); + context = context.parentContext; + } + return null; + } + + public Map<String, SV> getFullMap() { + Map<String, SV> ht = new Hashtable<String, SV>(); + ScriptContext context = this; + if (contextPath != null) + ht.put("_path", SV.newS(contextPath)); + while (context != null && !context.isFunction) { + if (context.vars != null) + for (String key : context.vars.keySet()) + if (!ht.containsKey(key)) + ht.put(key, context.vars.get(key)); + context = context.parentContext; + } + return ht; + } + + + } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -286,7 +286,7 @@ viewer.handleError(er, false); setErrorMessage("" + er + " " + viewer.getShapeErrorState()); errorMessageUntranslated = "" + er; - scriptStatusOrBuffer(errorMessage); + report(errorMessage); haveError = true; } catch (ScriptException e) { if (e instanceof ScriptInterruption) { @@ -304,7 +304,7 @@ } setErrorMessage(e.toString()); errorMessageUntranslated = e.getErrorMessageUntranslated(); - scriptStatusOrBuffer(errorMessage); + report(errorMessage); viewer .notifyError( (errorMessage != null @@ -381,9 +381,7 @@ setErrorMessage(null); if (executionStopped || sc == null || !sc.mustResumeEval) { - viewer.setTainted(true); - viewer.popHoldRepaint("resumeEval"); - viewer.queueOnHold = false; + resumeViewer("resumeEval"); return; } if (!executionPaused) @@ -395,6 +393,12 @@ executeCommands(sc.isTryCatch); } + private void resumeViewer(String why) { + viewer.setTainted(true); + viewer.popHoldRepaint(why); + viewer.queueOnHold = false; + } + @Override public void runScript(String script) throws ScriptException { if (!viewer.isPreviewOnly()) @@ -2030,20 +2034,10 @@ if (var.equals("expressionBegin")) return null; var = var.toLowerCase(); - if (contextVariables != null && contextVariables.containsKey(var)) - return contextVariables.get(var); - ScriptContext context = thisContext; - while (context != null) { - if (context.isFunction == true) - return null; - if (context.contextVariables != null - && context.contextVariables.containsKey(var)) - return context.contextVariables.get(var); - context = context.parentContext; - } - return null; + return (contextVariables != null && contextVariables.containsKey(var) ? contextVariables + .get(var) : thisContext == null ? null : thisContext.getVariable(var)); } - + private Object getStringObjectAsVariable(String s, String key) { if (s == null || s.length() == 0) return s; @@ -2612,14 +2606,14 @@ context.statement = st; context.statementLength = slen; - context.pc = pc; + context.pc = context.pc0 = pc; context.lineEnd = lineEnd; context.pcEnd = pcEnd; context.iToken = iToken; context.theToken = theToken; context.theTok = theTok; context.outputBuffer = outputBuffer; - context.contextVariables = contextVariables; + context.vars = contextVariables; context.isStateScript = isStateScript; context.errorMessage = errorMessage; @@ -2686,7 +2680,7 @@ lineNumbers = context.lineNumbers; lineIndices = context.lineIndices; aatoken = context.aatoken; - contextVariables = context.contextVariables; + contextVariables = context.vars; scriptExtensions = context.scriptExtensions; if (isPopContext) { @@ -2722,6 +2716,7 @@ public void setException(ScriptException sx, String msg, String untranslated) { // from ScriptException, while initializing sx.untranslated = (untranslated == null ? msg : untranslated); + boolean isThrown = "!".equals(untranslated); errorType = msg; iCommandError = pc; if (sx.message == null) { @@ -2734,7 +2729,9 @@ popContext(false, false); sx.message += s; sx.untranslated += s; - if (thisContext != null || chk || msg.indexOf(JC.NOTE_SCRIPT_FILE) >= 0) + if (isThrown) + resumeViewer("throw context"); + if (isThrown || thisContext != null || chk || msg.indexOf(JC.NOTE_SCRIPT_FILE) >= 0) return; Logger.error("eval ERROR: " + toString()); if (viewer.autoExit) @@ -3428,7 +3425,7 @@ viewer.showString(str, isPrint); } - public void scriptStatusOrBuffer(String s) { + public void report(String s) { if (chk) return; if (outputBuffer != null) { @@ -5172,7 +5169,7 @@ setErrorMessage("" + er); } if (error) { - scriptStatusOrBuffer(errorMessage); + report(errorMessage); setErrorMessage(null); } restoreScriptContext(scSave, true, false, false); @@ -5243,7 +5240,7 @@ // specifically for ProteinExplorer viewer.scriptStatus("script <exiting>"); } - if (!isJS || !allowJSThreads || fromFunc) + if (!mustResumeEval && (!isJS || !allowJSThreads || fromFunc)) return true; if (mustResumeEval || thisContext == null) { boolean done = (thisContext == null); @@ -5351,7 +5348,7 @@ break; if (outputBuffer == null) viewer.showMessage(s); - scriptStatusOrBuffer(s); + report(s); break; case T.push: pushContext((ContextToken) theToken, "PUSH"); @@ -5518,15 +5515,18 @@ case T.reset: reset(); break; - case T.restore: - restore(); - break; case T.restrict: restrict(); break; case T.resume: - if (!chk) - resumePausedExecution(); + if (slen == 0) { + if (!chk) + resumePausedExecution(); + break; + } + //$FALL-THROUGH$ + case T.restore: + restore(); break; case T.returncmd: returnCmd(null); @@ -5853,9 +5853,25 @@ private boolean flowControl(int tok, boolean isForCheck, List<T[]> vProcess) throws ScriptException { ContextToken ct; + int pt; switch (tok) { case T.throwcmd: - evalError(optParameterAsString(1), null); + if (chk) + return false; + pt = (tokAt(1) == T.context ? 2 : 1); + SV v = setVariable(pt, slen, "thrown_value", false); + String info = v.asString(); + if (info.length() == 0) + info = optParameterAsString(2); + if (pt == 1) { + evalError(info, null); + } else { + info = optParameterAsString(2); + viewer.saveContext(info); + if (doReport()) + report(GT.o(GT._("to resume, enter: &{0}"), info)); + throw new ScriptInterruption(this, info, Integer.MIN_VALUE); + } return false; case T.gotocmd: gotoCmd(parameterAsString(checkLast(1))); @@ -5868,7 +5884,7 @@ // JavaScript will not get here return isForCheck; } - int pt = st[0].intValue; + pt = st[0].intValue; boolean isDone = (pt < 0 && !chk); boolean isOK = true; int ptNext = 0; @@ -6040,7 +6056,8 @@ else ((BS) v.value).clear(j); } else { - v.setv(SV.getVariable(bsOrList instanceof BS ? BSUtil.copy((BS)bsOrList): bsOrList)); + v.setv(SV.getVariable(bsOrList instanceof BS ? BSUtil + .copy((BS) bsOrList) : bsOrList)); v.intValue = 1; t.setModified(false); } @@ -6049,7 +6066,7 @@ } else { if (isMinusMinus) j -= 2; - setVariable(++j, slen - 1, key, 0); + setVariable(++j, slen - 1, key, false); } } if (tok != T.in) @@ -7280,7 +7297,7 @@ if (outputBuffer == null) viewer.showMessage(s); if (!s.startsWith("_")) - scriptStatusOrBuffer(s); + report(s); } private void log() throws ScriptException { @@ -8021,7 +8038,7 @@ if (scriptLevel == 0 && !isAppend && nFiles < 2) showString((String) viewer.getModelSetAuxiliaryInfoValue("modelLoadNote")); if (debugHigh) - scriptStatusOrBuffer("Successfully loaded:" + report("Successfully loaded:" + (filenames == null ? htParams.get("fullPathName") : modelName)); Map<String, Object> info = viewer.getModelSetAuxiliaryInfo(); if (info != null && info.containsKey("centroidMinMax") @@ -9046,6 +9063,12 @@ private void delete() throws ScriptException { if (tokAt(1) == T.dollarsign) { + if (slen == 4 && optParameterAsString(2).equals("saved") && slen == 4) { + viewer.deleteSaved(optParameterAsString(3)); + if (doReport()) + report(GT.o(GT._("show saved: {0}"), viewer.listSavedStates())); + return; + } setObjectProperty(); return; } @@ -9057,7 +9080,7 @@ bs = viewer.getAllAtoms(); int nDeleted = viewer.deleteAtoms(bs, false); if (doReport()) - scriptStatusOrBuffer(GT.i(GT._("{0} atoms deleted"), nDeleted)); + report(GT.i(GT._("{0} atoms deleted"), nDeleted)); } public boolean doReport() { @@ -9250,7 +9273,7 @@ int nDeleted = viewer.deleteAtoms(bs, true); boolean isQuiet = !doReport(); if (!isQuiet) - scriptStatusOrBuffer(GT.i(GT._("{0} atoms deleted"), nDeleted)); + report(GT.i(GT._("{0} atoms deleted"), nDeleted)); viewer.select(null, false, 0, isQuiet); } @@ -9901,7 +9924,7 @@ if (chk) return; int n = viewer.autoHbond(null, null, false); - scriptStatusOrBuffer(GT.i(GT._("{0} hydrogen bonds"), Math.abs(n))); + report(GT.i(GT._("{0} hydrogen bonds"), Math.abs(n))); return; } if (slen == 2 && getToken(1).tok == T.delete) { @@ -10969,7 +10992,7 @@ key = T.nameOf(tok = newTok); } else if (!justShow && !isContextVariable) { // special cases must be checked - if (key.length() == 0 || key.charAt(0) == '_') // these cannot be set by user + if (key.length() == 0 || key.charAt(0) == '_' && tokAt(2) != T.leftsquare) // these cannot be set by user error(ERROR_cannotSet); // these next are not reported and do not allow calculation xxxx = a + b @@ -11055,7 +11078,7 @@ // a[...] = ); - setVariable(pt, 0, key, setType); + setVariable(pt, 0, key, (setType == '[')); if (!isJmolSet) return; } @@ -11631,21 +11654,28 @@ /** * * @param pt + * starting point in command token sequence * @param ptMax + * ending point in command token sequenec, possibly -1 for "all" * @param key - * @param setType + * the variable name to save the result in. This must be a standard + * user variable, either local or global + * @param isArrayItem + * indicates the context a[xxxx] = yyyyy and that the stack will + * contain the variable name and array pointer when it returns + * @return a variable or null * @throws ScriptException */ @SuppressWarnings("unchecked") - private void setVariable(int pt, int ptMax, String key, int setType) + private SV setVariable(int pt, int ptMax, String key, boolean isArrayItem) throws ScriptException { BS bs = null; String propertyName = ""; int tokProperty = T.nada; - boolean isArrayItem = (setType == '['); boolean settingProperty = false; boolean isExpression = false; - boolean settingData = (key.startsWith("property_")); + boolean settingData = key.startsWith("property_"); + boolean isThrown = key.equals("thrown_value"); boolean isNull = key.equals("all"); SV t = (settingData || isNull ? null : getContextVariableAsVariable(key)); boolean isUserVariable = (t != null); @@ -11673,27 +11703,27 @@ List<SV> v = (List<SV>) parameterExpression(pt, ptMax, key, true, true, -1, isArrayItem, null, null); if (isNull) - return; + return null; int nv = v.size(); if (nv == 0 || !isArrayItem && nv > 1 || isArrayItem && (nv < 3 || nv % 2 != 1)) invArg(); if (chk) - return; + return null; // x[3][4] = ?? SV tv = v.get(isArrayItem ? v.size() - 1 : 0); // create user variable if needed for list now, so we can do the copying boolean needVariable = (!isUserVariable && !isExpression && !settingData && (isArrayItem - || settingProperty || !(tv.value instanceof String + || settingProperty || isThrown || !(tv.value instanceof String || tv.tok == T.integer || tv.value instanceof Integer || tv.value instanceof Float || tv.value instanceof Boolean))); if (needVariable) { - if (key.startsWith("_")) + if (key.startsWith("_") + || (t = viewer.getOrSetNewVariable(key, !isArrayItem)) == null) errorStr(ERROR_invalidArgument, key); - t = viewer.getOrSetNewVariable(key, true); isUserVariable = true; } @@ -11708,15 +11738,17 @@ t.tok = T.hash; t.value = new Hashtable<String, SV>(); } - if (t.tok == T.hash) { + switch (t.tok) { + case T.context: + case T.hash: String hkey = vv.asString(); - Map<String, SV> tmap = (Map<String, SV>) t.value; if (isLast) { - tmap.put(hkey, tnew); + t.mapPut(hkey, tnew); break; } - t = tmap.get(hkey); - } else { + t = t.mapValue(hkey); + break; + default: int ipt = vv.asInt(); // in the case of for (x in y) where y is an array, we need to select the item before continuing if (t.tok == T.varray) @@ -11755,7 +11787,8 @@ case T.string: // check for a["t"] = xxx if (vv.tok == T.string) { - t.value = PT.rep((String) t.value, (String) vv.value, tnew.asString()); + t.value = PT.rep((String) t.value, (String) vv.value, + tnew.asString()); continue; } break; @@ -11764,7 +11797,7 @@ break; } } - return; + return t; } if (settingProperty) { if (!isExpression) { @@ -11786,16 +11819,16 @@ Integer.valueOf(tv.tok == T.varray ? 1 : 0) }, viewer .getAtomCount(), 0, 0, tv.tok == T.varray ? Integer.MAX_VALUE : Integer.MIN_VALUE, 0); - return; + return null; } setBitsetProperty(bs, tokProperty, tv.asInt(), tv.asFloat(), tv); - return; + return null; } if (isUserVariable) { t.setv(tv); t.setModified(true); - return; + return t; } Object vv = SV.oValue(tv); @@ -11807,7 +11840,7 @@ new Object[] { key, "" + vv, BSUtil.copy(viewer.getSelectedAtoms()), Integer.valueOf(0) }, viewer.getAtomCount(), 0, 0, Integer.MIN_VALUE, 0); - return; + return null; } if (vv instanceof Boolean) { @@ -11825,6 +11858,7 @@ } else { Logger.error("ERROR -- return from propertyExpression was " + vv); } + return tv; } private void axes(int index) throws ScriptException { @@ -12122,14 +12156,26 @@ if (slen > 1) { String saveName = optParameterAsString(2); switch (tokAt(1)) { + case T.bonds: + if (!chk) + viewer.saveBonds(saveName); + return; + case T.context: + if (!chk) + viewer.saveContext(saveName); + return; + case T.coord: + if (!chk) + viewer.saveCoordinates(saveName, viewer.getSelectedAtoms()); + return; case T.orientation: case T.rotation: if (!chk) viewer.saveOrientation(saveName, null); return; - case T.bonds: + case T.selection: if (!chk) - viewer.saveBonds(saveName); + viewer.saveSelection(saveName); return; case T.state: if (!chk) @@ -12139,20 +12185,14 @@ if (!chk) viewer.saveStructure(saveName); return; - case T.coord: - if (!chk) - viewer.saveCoordinates(saveName, viewer.getSelectedAtoms()); - return; - case T.selection: - if (!chk) - viewer.saveSelection(saveName); - return; } } - errorStr2(ERROR_what, "SAVE", - "bonds? coordinates? orientation? selection? state? structure?"); + errorStr2(ERROR_what, "SAVE", saveList); } + private final static String saveList = + "bonds? context? coordinates? orientation? rotation? selection? state? structure?"; + private void restore() throws ScriptException { // restore orientation name time if (slen > 1) { @@ -12192,6 +12232,19 @@ if (!chk) viewer.restoreBonds(saveName); return; + case T.context: + if (chk) + return; + ScriptContext sc = viewer.getContext(saveName); + if (sc != null) { + restoreScriptContext(sc, true, false, false); + if (thisContext != null) { + thisContext.setMustResume(); + mustResumeEval = true; + tQuiet = true; + } + } + return; case T.coord: if (chk) return; @@ -12223,8 +12276,7 @@ return; } } - errorStr2(ERROR_what, "RESTORE", - "bonds? coords? orientation? rotation? scene? selection? state? structure?"); + errorStr2(ERROR_what, "RESTORE", saveList); } public int[] colorArgb = new int[] { Integer.MIN_VALUE }; Modified: trunk/Jmol/src/org/jmol/script/ScriptInterruption.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptInterruption.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptInterruption.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -26,10 +26,10 @@ package org.jmol.script; public class ScriptInterruption extends ScriptException { - boolean willResume; + //boolean willResume; public ScriptInterruption(ScriptEvaluator eval, String why, int millis) { - super(eval, why, "!", eval.viewer.autoExit); - willResume = (millis != Integer.MAX_VALUE); + super(eval, why, "!", millis == Integer.MIN_VALUE || eval.viewer.autoExit); + //willResume = (millis != Integer.MAX_VALUE && millis != Integer.MIN_VALUE); // the delay execution is here just to ensure that even a delay of 0 // still forces the interruption. if (why.equals("delay")) Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -102,14 +102,13 @@ } @SuppressWarnings("unchecked") - SV getResult(boolean allowUnderflow) - throws ScriptException { + SV getResult(boolean allowUnderflow) throws ScriptException { boolean isOK = true; while (isOK && oPt >= 0) isOK = operate(); if (isOK) { if (asVector) { - List<SV> result = new List<SV>(); + List<SV> result = new List<SV>(); for (int i = 0; i <= xPt; i++) result.addLast(SV.selectItemVar(xStack[i])); return SV.newV(T.vector, result); @@ -118,16 +117,15 @@ SV x = xStack[0]; if (chk) { if (asBitSet) - return SV.newV(T.bitset, new BS()); + return SV.newV(T.bitset, new BS()); return x; } - if (x.tok == T.bitset || x.tok == T.varray - || x.tok == T.string || x.tok == T.matrix3f - || x.tok == T.matrix4f) + if (x.tok == T.bitset || x.tok == T.varray || x.tok == T.string + || x.tok == T.matrix3f || x.tok == T.matrix4f) x = SV.selectItemVar(x); - if (asBitSet && x.tok == - T.varray) - x = SV.newV(T.bitset, SV.unEscapeBitSetArray((List<SV>)x.value, false)); + if (asBitSet && x.tok == T.varray) + x = SV.newV(T.bitset, + SV.unEscapeBitSetArray((List<SV>) x.value, false)); return x; } } @@ -698,7 +696,7 @@ // prior to 12.2/3.18, x[1]["id"] was misread as x[1][0] var = (SV) SV.selectItemTok(var, Integer.MIN_VALUE); } - if (var.tok == T.hash) { + if (var.tok == T.hash || var.tok == T.context) { SV v = var.mapValue(SV.sValue(var1)); xStack[xPt] = (v == null ? SV.newS("") : v); return true; Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2014-02-20 06:38:25 UTC (rev 19365) +++ trunk/Jmol/src/org/jmol/script/T.java 2014-02-20 19:41:01 UTC (rev 19366) @@ -206,8 +206,8 @@ // -- EVEN help, javascript, cd, gotocmd -- allow for single starting variable public final static int implicitStringCommand = (1 << 14) | scriptCommand; - // this implicitExpression flag indicates that phrases surrounded - // by ( ) should be considered the same as { }. + // this mathExpression flag indicates that + // the command evaluates a math expression. // -- elseif, forcmd, ifcmd, print, returncmd, set, var, whilecmd public final static int mathExpressionCommand = (1 << 15) | scriptCommand; @@ -268,6 +268,7 @@ public final static int set = 3 | mathExpressionCommand | expression; public final static int var = 4 | mathExpressionCommand; public final static int log = 5 | mathExpressionCommand; + public final static int throwcmd = 6 | mathExpressionCommand; //public final static int prompt see mathfunc public final static int echo = 1 /* must be odd */ | implicitStringCommand | shapeCommand | setparam; @@ -345,7 +346,7 @@ public final static int refresh = scriptCommand | 44 | noArgs; public final static int reset = scriptCommand | 45; public final static int restore = scriptCommand | 46; - public final static int resume = scriptCommand | 47 | noArgs; + public final static int resume = scriptCommand | 47; public final static int rotate = scriptCommand | 48 | defaultON; public final static int rotateSelected = scriptCommand | 49; public final static int save = scriptCommand | 50; @@ -359,7 +360,6 @@ public final static int stereo = scriptCommand | 59 | defaultON; //public final static int structure see intproperty public final static int sync = scriptCommand | 60; - public final static int throwcmd = scriptCommand | 61 | implicitStringCommand; public final static int timeout = scriptCommand | 62 | setparam; public final static int translate = scriptCommand | 64; public final static int translateSelected = scriptCommand | 66; @@ -1126,6 +1126,7 @@ public final static int colorscheme = misc | 64; public final static int command = misc | 66; public final static int commands = misc | 68; + public final static int context = misc | 69; public final static int constraint = misc | 70; public final static int contour = misc | 72; public final static int contourlines = misc | 74; @@ -1279,7 +1280,8 @@ public final static int rotate45 = misc | 306; public final static int rotation = misc | 308; public final static int rubberband = misc | 310; - public final static int sasurface = misc | 312; + public final static int sasurface = misc | 311; + public final static int saved = misc | 312; public final static int scale = misc | 314; public final static int scene = misc | 315; // Jmol 12.3.32 public final static int selection = misc | 316; @@ -1834,6 +1836,7 @@ "clickable", T.t(clickable), "clipboard", T.t(clipboard), "connected", T.t(connected), + "context", T.t(context), "constraint", T.t(constraint), "contourLines", T.t(contourlines), "coord", T.t(coord), @@ -1990,6 +1993,7 @@ "rock", T.t(rock), "rubberband", T.t(rubberband), "saSurface", T.t(sasurface), + "saved", T.t(saved), "scale", T.t(scale), "scene", T.t(scene), "search", T.t(search), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-17 12:34:30
|
Revision: 19456 http://sourceforge.net/p/jmol/code/19456 Author: hansonr Date: 2014-03-17 12:34:24 +0000 (Mon, 17 Mar 2014) Log Message: ----------- ___JmolVersion="14.1.12_2014.03.17" bug fix: write XYZ broken by changes to the way arrays are shown with the PRINT command bug fix: x = adfjladj(3) crashes Jmol bug fix: x[0] = "tst" "here" "now" should cause script exception Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptExpr.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-03-17 03:20:21 UTC (rev 19455) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-03-17 12:34:24 UTC (rev 19456) @@ -617,7 +617,7 @@ if (x.value instanceof String) return (String) x.value; // just the command sb = new SB(); - sValueArray(sb, (SV) x, "", "", false); + sValueArray(sb, (SV) x, "", "", false, true); return sb.toString(); case string: String s = (String) x.value; @@ -642,7 +642,7 @@ } private static void sValueArray(SB sb, SV vx, String path, String tabs, - boolean isEscaped) { + boolean isEscaped, boolean isRaw) { switch (vx.tok) { case hash: case context: @@ -655,17 +655,19 @@ } path += thiskey; if (vx.tok == varray) { - sb.append(isEscaped ? "[ " : tabs + "\t[\n"); + if (!isRaw) + sb.append(isEscaped ? "[ " : tabs + "[\n"); List<SV> sx = vx.getList(); for (int i = 0; i < sx.size(); i++) { if (isEscaped && i > 0) sb.append(","); SV sv = sx.get(i); - sValueArray(sb, sv, path, tabs + "\t", isEscaped); + sValueArray(sb, sv, path, tabs + "\t", isEscaped, tabs.length() == 0 && !isEscaped && isRawType(sv.tok)); if (!isEscaped) sb.append("\n"); } - sb.append(isEscaped ? " ]" : tabs + "\t]"); + if (!isRaw) + sb.append(isEscaped ? " ]" : tabs + "]"); } else { Map<String, SV> ht = (vx.tok == context ? ((ScriptContext) vx.value) .getFullMap() : vx.getMap()); @@ -673,7 +675,7 @@ } break; default: - if (!isEscaped) + if (!isRaw && !isEscaped) sb.append(tabs); sb.append(isEscaped ? vx.escape() : sValue(vx)); } @@ -689,30 +691,22 @@ for (int i = 0; i < keys.length; i++) { String key = keys[i]; sb.append(sep).append(PT.esc(key)).appendC(':'); - sValueArray(sb, ht.get(key), path, tabs+"\t", true); + sValueArray(sb, ht.get(key), path, tabs+"\t", true, false); sep = ","; } sb.append(" }"); return; } sb.append(tabs).append("{\n"); + tabs += "\t"; for (int i = 0; i < keys.length; i++) { sb.append(tabs); String key = keys[i]; sb.append(key).append("\t:"); SB sb2 = new SB(); SV v = ht.get(key); - isEscaped = false; - switch (v.tok) { - case T.string: - case T.decimal: - case T.integer: - case T.point3f: - case T.point4f: - case T.bitset: - isEscaped = true; - } - sValueArray(sb2, v, path, (v.tok == hash ? tabs + "\t" : tabs), isEscaped); + isEscaped = isRawType(v.tok); + sValueArray(sb2, v, path, tabs, isEscaped, false); String value = sb2.toString(); if (isEscaped) sb.append("\t"); @@ -720,9 +714,24 @@ sb.append("\n"); sb.append(value).append("\n"); } - sb.append(tabs).append("}"); + sb.append(tabs.substring(1)).append("}"); } + private static boolean isRawType(int tok) { + switch (tok) { + case T.string: + case T.decimal: + case T.integer: + case T.point3f: + case T.point4f: + case T.bitset: + case T.on: + case T.off: + return true; + } + return false; + } + public static P3 ptValue(SV x) { switch (x.tok) { case point3f: @@ -1059,7 +1068,7 @@ case hash: case context: SB sb = new SB(); - sValueArray(sb, this, "", "", true); + sValueArray(sb, this, "", "", true, false); return sb.toString(); default: return sValue(this); Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2014-03-17 03:20:21 UTC (rev 19455) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2014-03-17 12:34:24 UTC (rev 19456) @@ -111,7 +111,7 @@ * variables * @param localVar * x or y in above for(), select() examples - * @param isAssignment TODO + * @param isSpecialAssignment TODO * @return either a vector or a value, caller's choice. * @throws ScriptException * errors are thrown directly to the Eval error system. @@ -119,7 +119,7 @@ protected Object parameterExpression(int pt, int ptMax, String key, boolean ignoreComma, boolean asVector, int ptAtom, boolean isArrayItem, - Map<String, SV> localVars, String localVar, boolean isAssignment) + Map<String, SV> localVars, String localVar, boolean isSpecialAssignment) throws ScriptException { /* @@ -144,11 +144,11 @@ int nSquare = 0; int nParen = 0; boolean topLevel = true; - ScriptMathProcessor rpn = new ScriptMathProcessor(this, isAssignment, isArrayItem, asVector, - false, false); + ScriptMathProcessor rpn = new ScriptMathProcessor(this, isSpecialAssignment, isArrayItem, asVector, + false, false, key); if (ptMax < pt) ptMax = slen; - int ptEq = (isAssignment ? 0 : 1); + int ptEq = (isSpecialAssignment ? 0 : 1); out: for (int i = pt; i < ptMax; i++) { v = null; int tok = getToken(i).tok; @@ -177,8 +177,8 @@ break out; if (tok == T.rightbrace) invArg(); - if (isAssignment && nSquare == 1 && tokAt(i + 1) == T.opEQ) - isAssignment = rpn.endAssignment(); + if (isSpecialAssignment && nSquare == 1 && tokAt(i + 1) == T.opEQ) + isSpecialAssignment = rpn.endAssignment(); } switch (tok) { @@ -414,8 +414,8 @@ break; case T.perper: case T.per: - if (isAssignment && topLevel && tokAt(i + 2) == T.opEQ) - isAssignment = rpn.endAssignment(); + if (isSpecialAssignment && topLevel && tokAt(i + 2) == T.opEQ) + isSpecialAssignment = rpn.endAssignment(); if (ptEq == 0 && topLevel) { switch (tokAt(i + 1)) { case T.nada: @@ -636,7 +636,7 @@ st = code; } ScriptMathProcessor rpn = new ScriptMathProcessor(this, false, false, - false, mustBeBitSet, allowUnderflow); + false, mustBeBitSet, allowUnderflow, null); Object val; int comparisonValue = Integer.MAX_VALUE; boolean refreshed = false; @@ -1942,8 +1942,9 @@ SV t = (settingData ? null : getContextVariableAsVariable(key)); - // determine whether this is some sort of special assignment - // of a known variable + // determine whether this is some sort of + // special assignment of a known variable + if (isSet && !isExpression) { // pt will be 1 unless... switch (tokAt(2)) { Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-03-17 03:20:21 UTC (rev 19455) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-03-17 12:34:24 UTC (rev 19456) @@ -92,15 +92,17 @@ private int ptid = 0; private int ptx = Integer.MAX_VALUE; private int pto = Integer.MAX_VALUE; - private boolean isAssignment; + private boolean isSpecialAssignment; private boolean doSelections = true; private boolean assignLeft; private boolean allowUnderflow; + private boolean isAssignment; - ScriptMathProcessor(ScriptExpr eval, boolean isAssignment, boolean isArrayItem, - boolean asVector, boolean asBitSet, boolean allowUnderflow) { + ScriptMathProcessor(ScriptExpr eval, boolean isSpecialAssignment, boolean isArrayItem, + boolean asVector, boolean asBitSet, boolean allowUnderflow, String key) { this.eval = eval; - this.isAssignment = assignLeft = isAssignment; + this.isSpecialAssignment = assignLeft = isSpecialAssignment; + this.isAssignment = (isSpecialAssignment || key != null); this.viewer = eval.viewer; this.debugHigh = eval.debugHigh; this.chk = wasSyntaxCheck = eval.chk; @@ -126,11 +128,11 @@ if (isOK) { if (asVector) { // check for y = x x or y = x + ; - if (isAssignment && (xPt > 0 && oPt < 0 || oPt >= 0 && oStack[oPt] != null)) + if (isAssignment && (xPt > 0 && oPt < 0 || oPt >= 0 && (xPt > 1 || oStack[oPt] != null))) eval.invArg(); List<SV> result = new List<SV>(); for (int i = 0; i <= xPt; i++) - result.addLast(isAssignment ? xStack[i] : SV.selectItemVar(xStack[i])); + result.addLast(isSpecialAssignment ? xStack[i] : SV.selectItemVar(xStack[i])); if (lastAssignedString != null) { result.remove(0); result.add(0, lastAssignedString); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-10-12 23:29:57
|
Revision: 20056 http://sourceforge.net/p/jmol/code/20056 Author: hansonr Date: 2014-10-12 23:29:52 +0000 (Sun, 12 Oct 2014) Log Message: ----------- JavaScript bug Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/FileLoadThread.java trunk/Jmol/src/org/jmol/script/ScriptEval.java Modified: trunk/Jmol/src/org/jmol/script/FileLoadThread.java =================================================================== --- trunk/Jmol/src/org/jmol/script/FileLoadThread.java 2014-10-12 18:48:40 UTC (rev 20055) +++ trunk/Jmol/src/org/jmol/script/FileLoadThread.java 2014-10-12 23:29:52 UTC (rev 20056) @@ -107,7 +107,7 @@ */ void setData(String fileName, String fileName0, Object data, Object myData) throws InterruptedException { - System.out.println("FileLoadThread async setData " + fileName); + //System.out.println("FileLoadThread async setData " + fileName); boolean isCanceled = fileName.equals("#CANCELED#"); sc.parentContext.htFileCache.put(key, (isCanceled ? fileName : (cacheName = cacheName.substring(0, cacheName.lastIndexOf("_") + 1) Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-10-12 18:48:40 UTC (rev 20055) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-10-12 23:29:52 UTC (rev 20056) @@ -6253,7 +6253,7 @@ remotePath = paramAsStr(++i); filename = paramAsStr(++i); } - if (vwr.isJS || vwr.testAsync && (isAsync || filename.startsWith("?"))) { + if ((vwr.isJS || vwr.testAsync) && (isAsync || filename.startsWith("?"))) { filename = loadFileAsync("SCRIPT_", filename, i, true); // on first pass a ScriptInterruption will be thrown; // on the second pass we will have the file name, which will be cache://local_n__m This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2015-03-09 01:38:53
|
Revision: 20370 http://sourceforge.net/p/jmol/code/20370 Author: hansonr Date: 2015-03-09 01:38:45 +0000 (Mon, 09 Mar 2015) Log Message: ----------- refactoring -- removing JmolCmdExtension interface Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/script/ScriptExpr.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Removed Paths: ------------- trunk/Jmol/src/org/jmol/script/JmolCmdExtension.java trunk/Jmol/src/org/jmol/script/JmolMathExtension.java trunk/Jmol/src/org/jmol/script/JmolSmilesExtension.java Deleted: trunk/Jmol/src/org/jmol/script/JmolCmdExtension.java =================================================================== --- trunk/Jmol/src/org/jmol/script/JmolCmdExtension.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/JmolCmdExtension.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -1,19 +0,0 @@ -package org.jmol.script; - -import org.jmol.java.BS; -import org.jmol.viewer.ShapeManager; - -public interface JmolCmdExtension { - - public JmolCmdExtension init(Object eval); - - public String dispatch(int iShape, boolean b, T[] st) throws ScriptException; - - public Object getBitsetIdent(BS bs, String label, Object tokenValue, - boolean useAtomMap, int index, - boolean isExplicitlyAll); - - public boolean evalParallel(ScriptContext context, - ShapeManager shapeManager); - -} Deleted: trunk/Jmol/src/org/jmol/script/JmolMathExtension.java =================================================================== --- trunk/Jmol/src/org/jmol/script/JmolMathExtension.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/JmolMathExtension.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -1,20 +0,0 @@ -package org.jmol.script; - -import org.jmol.atomdata.RadiusData; -import org.jmol.java.BS; - -public interface JmolMathExtension { - - public JmolMathExtension init(Object eval); - - public boolean evaluate(ScriptMathProcessor mp, T op, SV[] args, int tok) - throws ScriptException; - - public Object getMinMax(Object floatOrSVArray, int intValue); - - BS setContactBitSets(BS bsA, BS bsB, boolean localOnly, float distance, - RadiusData rd, boolean warnMultiModel); - - - -} Deleted: trunk/Jmol/src/org/jmol/script/JmolSmilesExtension.java =================================================================== --- trunk/Jmol/src/org/jmol/script/JmolSmilesExtension.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/JmolSmilesExtension.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -1,26 +0,0 @@ -package org.jmol.script; - -import javajs.util.Lst; -import javajs.util.M4; -import javajs.util.P3; - -import org.jmol.java.BS; - -public interface JmolSmilesExtension { - - JmolSmilesExtension init(Object se); - - float getSmilesCorrelation(BS bsA, BS bsB, String smiles, Lst<P3> ptsA, - Lst<P3> ptsB, M4 m4, Lst<BS> vReturn, - boolean isSmarts, boolean asMap, int[][] mapSet, - P3 center, boolean firstMatchOnly, boolean bestMap) - throws ScriptException; - - Object getSmilesMatches(String pattern, String smiles, BS bsSelected, - BS bsMatch3D, boolean isSmarts, boolean asOneBitset) - throws ScriptException; - - float[] getFlexFitList(BS bs1, BS bs2, String smiles1, boolean isSmarts) - throws ScriptException; - -} Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -230,21 +230,6 @@ private static int iProcess; - private JmolMathExtension mathExt; - public JmolMathExtension getMathExt() { - return (mathExt == null ? (mathExt = (JmolMathExtension) getExt("Math")).init(this) : mathExt); - } - - private JmolSmilesExtension smilesExt; - public JmolSmilesExtension getSmilesExt() { - return (smilesExt == null ? (smilesExt = (JmolSmilesExtension) getExt("Smiles")).init(this) : smilesExt); - } - - private JmolCmdExtension cmdIso; - public JmolCmdExtension getIsoExt() { - return (cmdIso == null ? (cmdIso = (JmolCmdExtension) getExt("Iso")).init(this) : cmdIso); - } - public ShapeManager sm; public boolean isJS; Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -23,6 +23,9 @@ import org.jmol.modelset.BondSet; import org.jmol.modelset.Group; import org.jmol.modelset.ModelSet; +import org.jmol.scriptext.CmdExt; +import org.jmol.scriptext.MathExt; +import org.jmol.scriptext.SmilesExt; import org.jmol.util.BSUtil; import org.jmol.util.Elements; import org.jmol.util.Escape; @@ -49,11 +52,26 @@ public boolean debugHigh; - private JmolCmdExtension cmdExt; - public JmolCmdExtension getCmdExt() { - return (cmdExt == null ? (cmdExt = (JmolCmdExtension) getExt("Cmd")).init(this) : cmdExt); + private CmdExt cmdExt; + public CmdExt getCmdExt() { + return (cmdExt == null ? (cmdExt = (CmdExt) getExt("Cmd")).init(this) : cmdExt); } + private CmdExt isoExt; + public CmdExt getIsoExt() { + return (isoExt == null ? (isoExt = (CmdExt) getExt("Iso")).init(this) : isoExt); + } + + private MathExt mathExt; + public MathExt getMathExt() { + return (mathExt == null ? (mathExt = (MathExt) getExt("Math")).init(this) : mathExt); + } + + private SmilesExt smilesExt; + public SmilesExt getSmilesExt() { + return (smilesExt == null ? (smilesExt = (SmilesExt) getExt("Smiles")).init(this) : smilesExt); + } + public Object getExt(String type) { return Interface.getInterface("org.jmol.scriptext." + type + "Ext", vwr, "script"); } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2015-03-09 01:37:22 UTC (rev 20369) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2015-03-09 01:38:45 UTC (rev 20370) @@ -841,7 +841,7 @@ // just exit; otherwise we add a new TRUE to xStack if (!chk) - return getMathExt().evaluate(this, op, args, tok); + return eval.getMathExt().evaluate(this, op, args, tok); if (op.tok == T.propselector) xPt--; // pop x in "x.func(...)" return addXBool(true); @@ -1660,7 +1660,7 @@ case T.stddev: case T.sum: case T.sum2: - return addXObj(getMathExt().getMinMax(x2.getList(), op.intValue)); + return addXObj(eval.getMathExt().getMinMax(x2.getList(), op.intValue)); case T.pop: return addX(x2.pushPop(null, null)); case T.sort: @@ -1755,10 +1755,6 @@ return false; } - private JmolMathExtension getMathExt() { - return ((ScriptEval) eval).getMathExt(); - } - public SV evalOp(T token) throws ScriptException { if (!addOp(token) || !operate()) return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2015-03-31 12:24:17
|
Revision: 20419 http://sourceforge.net/p/jmol/code/20419 Author: hansonr Date: 2015-03-31 12:24:14 +0000 (Tue, 31 Mar 2015) Log Message: ----------- Jmol.___JmolVersion="14.3.13_2015.03.30" bug fix: {hash}.Key = value will be stored as "key" rather than "Key" if "key" is also a user-defined function. bug fix: {hash}.key will fail if "key" is also a user-defined function. bug fix: print a where a is an associative arrays fails in JavaScript (since jmol-14.3.7_2014.08.25) Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptExpr.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-03-31 04:44:02 UTC (rev 20418) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-03-31 12:24:14 UTC (rev 20419) @@ -141,8 +141,8 @@ * variables * @param localVar * x or y in above for(), select() examples - * @param isSpecialAssignment - * x[n] = .... + * @param isSpecialAssignment + * x[n] = .... * @return either a vector or a value, caller's choice. * @throws ScriptException * errors are thrown directly to the Eval error system. @@ -150,7 +150,9 @@ private Object parameterExpression(int pt, int ptMax, String key, boolean ignoreComma, boolean asVector, int ptAtom, boolean isArrayItem, - Map<String, SV> localVars, String localVar, boolean isSpecialAssignment) + Map<String, SV> localVars, + String localVar, + boolean isSpecialAssignment) throws ScriptException { /* @@ -175,8 +177,8 @@ if (ptMax < pt) ptMax = slen; int ptEq = (isSpecialAssignment ? 0 : 1); - ScriptMathProcessor rpn = new ScriptMathProcessor(this, isSpecialAssignment, isArrayItem, asVector, - false, false, key); + ScriptMathProcessor rpn = new ScriptMathProcessor(this, + isSpecialAssignment, isArrayItem, asVector, false, false, key); Object v, res; int nSquare = 0; int nParen = 0; @@ -190,7 +192,7 @@ : getBitsetPropertySelector(i)); if (token != null) { rpn.addX(localVars.get(localVar)); - if (!rpn.addOpAllowMath(token, (tokAt(i + 1) == T.leftparen))) + if (!rpn.addOpAllowMath(token, (tokAt(i + 1) == T.leftparen), T.nada)) invArg(); if ((token.intValue == T.function || token.intValue == T.parallel) && tokAt(iToken + 1) != T.leftparen) { @@ -357,7 +359,7 @@ // these next are for the within() command case T.plane: if (tokAt(iToken + 1) == T.leftparen) { - if (!rpn.addOpAllowMath(theToken, true)) + if (!rpn.addOpAllowMath(theToken, true, T.nada)) invArg(); break; } @@ -438,7 +440,7 @@ i = iToken; if (nParen == 0 && isOneExpressionOnly) { iToken++; - return listBS((BS)v); + return listBS((BS) v); } break; case T.spacebeforesquare: @@ -503,11 +505,13 @@ getToken(iToken + 2); } } - allowMathFunc &= (tokAt(iToken + 1) == T.leftparen || isUserFunction); - if (!rpn.addOpAllowMath(var, allowMathFunc)) + int tokNext = tokAt(iToken + 1); + allowMathFunc &= (tokNext == T.leftparen || isUserFunction); + if (!rpn.addOpAllowMath(var, allowMathFunc, isUserFunction ? tokNext + : T.nada)) invArg(); i = iToken; - if (var.intValue == T.function && tokAt(i + 1) != T.leftparen) { + if (var.intValue == T.function && tokNext != T.leftparen) { rpn.addOp(T.tokenLeftParen); rpn.addOp(T.tokenRightParen); } @@ -564,12 +568,14 @@ // first check to see if the variable has been defined already String name = paramAsStr(i).toLowerCase(); boolean haveParens = (tokAt(i + 1) == T.leftparen); - if (chk) { - v = name; - } else if (!haveParens - && (localVars == null || (v = PT.getMapValueNoCase(localVars, name)) == null && allContext)) { - v = getContextVariableAsVariable(name); - } + if (!haveParens) + if (chk) { + v = name; + } else if (localVars == null + || (v = PT.getMapValueNoCase(localVars, name)) == null + && allContext) { + v = getContextVariableAsVariable(name); + } if (v == null) { if (T.tokAttr(theTok, T.identifier) && vwr.isFunction(name)) { if (!rpn.addOp(SV.newV(T.function, theToken.value))) Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2015-03-31 04:44:02 UTC (rev 20418) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2015-03-31 12:24:14 UTC (rev 20419) @@ -409,10 +409,10 @@ * @throws ScriptException */ public boolean addOp(T op) throws ScriptException { - return addOpAllowMath(op, true); + return addOpAllowMath(op, true, T.nada); } - boolean addOpAllowMath(T op, boolean allowMathFunc) throws ScriptException { + boolean addOpAllowMath(T op, boolean allowMathFunc, int tokNext) throws ScriptException { if (debugHigh) { dumpStacks("adding " + op + " wasx=" + wasX); @@ -495,8 +495,16 @@ default: if (isMathFunc) { boolean isArgument = (oPt >= 1 && tok0 == T.leftparen); - if (!isDotSelector && wasX && !isArgument) + if (isDotSelector) { + if (tokNext == T.leftparen) { + // check for {hash}.x(), which is not allowed + // if this is desired, one needs to use {hash}..x() + if (xStack[xPt].tok == T.hash) + return false; + } + } else if (wasX && !isArgument) { return false; + } newOp = op; isLeftOp = true; break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2021-11-28 21:37:13
|
Revision: 22267 http://sourceforge.net/p/jmol/code/22267 Author: hansonr Date: 2021-11-28 21:37:11 +0000 (Sun, 28 Nov 2021) Log Message: ----------- adds private functions Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptContext.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/script/ScriptExpr.java Modified: trunk/Jmol/src/org/jmol/script/ScriptContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptContext.java 2021-11-28 18:33:40 UTC (rev 22266) +++ trunk/Jmol/src/org/jmol/script/ScriptContext.java 2021-11-28 21:37:11 UTC (rev 22267) @@ -82,6 +82,8 @@ private int[] pointers; public String why; + + public Map<String, ScriptFunction> privateFuncs; ScriptContext() { id = ++contextCount; Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2021-11-28 18:33:40 UTC (rev 22266) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2021-11-28 21:37:11 UTC (rev 22267) @@ -381,7 +381,8 @@ public boolean compileScriptFile(String filename, boolean tQuiet) { clearState(tQuiet); contextPath = filename; - return compileScriptFileInternal(filename, null, null, null); + String script = getScriptFileInternal(filename, null, null, null); + return (script != null && compileScript(filename, script, debugScript)); } @Override @@ -559,12 +560,21 @@ if (sc.scriptLevel > 0 && sc.why != CONTEXT_HOLD_QUEUE) scriptLevel = sc.scriptLevel - 1; - restoreScriptContext(sc, true, false, false); + setContextForScript(sc, true); pcResume = sc.pc; executeCommands(sc.isTryCatch, scriptLevel <= 0); pcResume = -1; } + private void setContextForScript(ScriptContext sc, boolean isPop) { + addFunction(null); + Map<String, ScriptFunction> pf = privateFuncs; + restoreScriptContext(sc, isPop, false, false); + privateFuncs = null; + if (thisContext != null) + thisContext.privateFuncs = pf; + } + private void resumeViewer(String why) { vwr.setTainted(true); vwr.popHoldRepaint(why + (chk ? JC.REPAINT_IGNORE : "")); @@ -952,8 +962,9 @@ boolean debugCompiler) { scriptFileName = filename; strScript = fixScriptPath(strScript, filename); - restoreScriptContext(compiler.compile(filename, strScript, false, false, - debugCompiler && Logger.debugging, false), false, false, false); + ScriptContext sc = compiler.compile(filename, strScript, false, false, + debugCompiler && Logger.debugging, false); + setContextForScript(sc, false); isStateScript = compiler.isStateScript; forceNoAddHydrogens = (isStateScript && script.indexOf("pdbAddHydrogens") < 0); String s = script; @@ -1001,17 +1012,25 @@ return pc; } - private boolean compileScriptFileInternal(String filename, String localPath, + /** + * Retrieve the uncompiled script or null if failed + * @param filename + * @param localPath + * @param remotePath + * @param scriptPath + * @return + */ + private String getScriptFileInternal(String filename, String localPath, String remotePath, String scriptPath) { // from "script" command, with push/pop surrounding or vwr - if (filename.toLowerCase().indexOf("javascript:") == 0) - return compileScript(filename, vwr.jsEval(filename.substring(11)), - debugScript); + if (filename.toLowerCase().indexOf("javascript:") == 0) { + return vwr.jsEval(filename.substring(11)); + } String[] data = new String[2]; data[0] = filename; if (!vwr.fm.getFileDataAsString(data, -1, false, true, false)) { // first opening setErrorMessage("io error reading " + data[0] + ": " + data[1]); - return false; + return null; } String movieScript = ""; if (("\n" + data[1]).indexOf("\nJmolManifest.txt\n") >= 0) { @@ -1030,7 +1049,7 @@ data[0] = filename; if (!vwr.fm.getFileDataAsString(data, -1, false, true, false)) { // second entry setErrorMessage("io error reading " + data[0] + ": " + data[1]); - return false; + return null; } path = FileManager.getManifestScriptPath(data[1]); } @@ -1039,12 +1058,13 @@ + path; if (!vwr.fm.getFileDataAsString(data, -1, false, true, false)) { // third entry setErrorMessage("io error reading " + data[0] + ": " + data[1]); - return false; + return null; } } if (filename.endsWith("|state.spt")) { - vwr.g.setO("_pngjFile", filename.substring(0, filename.length() - 10) + "?"); - } + vwr.g.setO("_pngjFile", filename.substring(0, filename.length() - 10) + + "?"); + } } scriptFileName = filename; data[1] = FileManager.getEmbeddedScript(data[1]); @@ -1054,9 +1074,8 @@ scriptPath = scriptPath.substring(0, Math.max(scriptPath.lastIndexOf("|"), scriptPath.lastIndexOf("/"))); } - script = FileManager.setScriptFileReferences(script, localPath, remotePath, - scriptPath); - return compileScript(filename, script + movieScript, debugScript); + return FileManager.setScriptFileReferences(script, localPath, remotePath, + scriptPath) + movieScript; } // ///////////// Jmol function support // /////////////// @@ -1550,6 +1569,8 @@ if (statementOnly) return; } + if (context.privateFuncs != null) + privateFuncs = context.privateFuncs; mustResumeEval = context.mustResumeEval; script = context.script; lineNumbers = context.lineNumbers; @@ -6580,6 +6601,7 @@ filename = paramAsStr(++i); } if (filename.equalsIgnoreCase("applet")) { + filename = null; // script APPLET x "....." String appID = paramAsStr(++i); theScript = parameterExpressionString(++i, 0); // had _script variable?? @@ -6597,6 +6619,7 @@ tok = tokAt(slen - 1); doStep = (tok == T.step); if (filename.equalsIgnoreCase("inline")) { + filename = null; theScript = parameterExpressionString(++i, (doStep ? slen - 1 : 0)); i = iToken; } else { @@ -6672,9 +6695,9 @@ chk = isCmdLine_c_or_C_Option = true; pushContext(null, "SCRIPT"); contextPath += " >> " + filename; - if (theScript == null - ? compileScriptFileInternal(filename, localPath, remotePath, scriptPath) - : compileScript(null, theScript, false)) { + if (theScript == null) + theScript = getScriptFileInternal(filename, localPath, remotePath, scriptPath); + if (compileScript(filename, theScript, filename != null && debugScript)) { this.pcEnd = pcEnd; this.lineEnd = lineEnd; while (pc < lineNumbers.length && lineNumbers[pc] < lineNumber) @@ -6697,10 +6720,8 @@ boolean timeMsg = vwr.getBoolean(T.showtiming); if (timeMsg) Logger.startTimer("script"); - Map<String, ScriptFunction> pf = privateFuncs; privateFuncs = null; dispatchCommands(false, false, false); - privateFuncs = pf; if (isStateScript) ScriptManager.setStateScriptVersion(vwr, null); if (timeMsg) Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2021-11-28 18:33:40 UTC (rev 22266) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2021-11-28 21:37:11 UTC (rev 22267) @@ -2633,10 +2633,11 @@ } protected void addFunction(ScriptFunction f) { - if (f.isPrivate) { + if (f == null || f.isPrivate) { if (privateFuncs == null) privateFuncs = new Hashtable<String, ScriptFunction>(); - privateFuncs.put(f.name, f); + if (f != null) + privateFuncs.put(f.name, f); } else { vwr.addFunction(f); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |