package jmathlib.toolbox.general; import jmathlib.core.tokens.*; import jmathlib.core.interpreter.*; import jmathlib.core.functions.ExternalFunction; import java.util.*; /**An external function for getting the stored variables*/ public class whos extends ExternalFunction { public OperandToken evaluate(Token[] operands, GlobalValues globals) { Iterator iter = globals.getLocalVariables().getIterator(); // display header information globals.getInterpreter().displayText("\nYour variables are:\n"); globals.getInterpreter().displayText("\nName: \t size: \t type \n"); // check if global context is requested if (getNArgIn(operands) == 1) { if ((operands[0] instanceof CharToken)) { String data = ((CharToken)operands[0]).getValue(); if (data.equals("global")) iter = globals.getGlobalVariables().getIterator(); } } // iterate through the complete local variable list while(iter.hasNext()) { Map.Entry next = ((Map.Entry)iter.next()); Variable var = (Variable)next.getValue(); OperandToken op = (OperandToken)var.getData(); Boolean global = var.isGlobal(); String name = var.getName(); String line = ""; line = name + " \t"; // if variable is global get data from global context if (global) op = (OperandToken)globals.getGlobalVariables().getVariable(name).getData(); // check which type of variable if (op instanceof DataToken) { line += getSizeString(op); line += " \t "+ ((DataToken)op).getDataType()+" "; } else { line += " \t unknown"; } //if (getLocalVariables().isVariable(var.getName())) if (global) line += "(global)"; globals.getInterpreter().displayText(line); } return null; } private String getSizeString(OperandToken tok) { int[] s = ((DataToken)tok).getSize(); String line =""; // for tokens with no size return "" if (s==null) return ""; // build up "size"-string for (int i=0; i< s.length; i++) { line += s[i]; if (i<s.length-1) line +="x"; } return line; } } /* @GROUP general @SYNTAX whos whos("global") @DOC Returns a list of all the variables in the system. @EXAMPLES @NOTES @SEE who, clear, global */