/* * File : Operator.java * Created : 08-mar-2004 11:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; /** * Utility class used by {@link edu.xtec.jclic.automation.arith.Arith} to encapsulate * the properties and methods related to the members of the operations. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Operator implements Domable{ protected static final int MAX_VALUE=100000000; protected static final int WZERO=1, WONE=2, WMINUSONE=4; protected static final int NLIMITS=26; protected static final int[] LIMITS={0, -9999, -1000, -999, -100, -99, -50, -25, -20, -10, -9, -5, -1, 0, 1, 5, 9, 10, 20, 25, 50, 99, 100, 999, 1000, 9999}; protected static final int DEFAULT_LIMIT=13; protected static final int LIM0=13; protected static final int LIM10=17; protected static final int LIMI25=7; protected static final int LIMS25=19; protected static final int NOLIM=25; protected static final String[] LIM_CH={"x", "-9999", "-1000", "-999", "-100", "-99", "-50", "-25", "-20", "-10", "-9", "-5", "-1", "0", "1", "5", "9", "10", "20", "25", "50", "99", "100", "999", "1000", "9999"}; protected static final int NUMLST=20; int limInf; int limSup; int numDec; boolean wZero, wOne, wMinusOne; int fromList; int[] lst=new int[NUMLST]; protected boolean fromBlank; static final String ELEMENT_NAME="operand", DECIMALS="decimals", VALUES="values", FROM="from", TO="to", INCLUDE="include", ZERO="zero", ONE="one", MINUSONE="minusOne"; public Operator(){ limInf=LIM0; limSup=LIM10; numDec=0; wZero=false; wOne=false; wMinusOne=false; fromList=0; } public org.jdom.Element getJDomElement() { org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME); //e.setAttribute(ID, id); if(numDec>0) e.setAttribute(DECIMALS, Integer.toString(numDec)); if(fromList>0){ e.setAttribute(VALUES, JDomUtility.intArrayToString(lst, fromList)); } else{ e.setAttribute(FROM, LIM_CH[limInf]); e.setAttribute(TO, LIM_CH[limSup]); if(wZero || wOne || wMinusOne){ org.jdom.Element ei=new org.jdom.Element(INCLUDE); ei.setAttribute(ZERO, JDomUtility.boolString(wZero)); ei.setAttribute(ONE, JDomUtility.boolString(wOne)); ei.setAttribute(MINUSONE, JDomUtility.boolString(wMinusOne)); e.addContent(ei); } } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception{ JDomUtility.checkName(e, ELEMENT_NAME); numDec=JDomUtility.getIntAttr(e, DECIMALS, numDec); String s=e.getAttributeValue(VALUES); if(s!=null){ int[] v=JDomUtility.stringToIntArray(s); fromList=v.length; System.arraycopy(v, 0, lst, 0, fromList); } else{ limInf=JDomUtility.getStrIndexAttr(e, FROM, LIM_CH, limInf); limSup=JDomUtility.getStrIndexAttr(e, TO, LIM_CH, limSup); org.jdom.Element child=e.getChild(INCLUDE); if(child!=null){ wZero=JDomUtility.getBoolAttr(child, ZERO, wZero); wOne=JDomUtility.getBoolAttr(child, ONE, wOne); wMinusOne=JDomUtility.getBoolAttr(child, MINUSONE, wMinusOne); } } } public int setClic3Properties(byte[] ops, int p) { int v; int i, lb, hb; int arithVer=0; if((limInf=ops[p++]&0x7F)==0){ fromBlank=true; limInf=LIM0; } limSup=((i=ops[p++]&0x7F)==0 ? LIM10:i); numDec=ops[p++]&0x3; v=ops[p++]&0x7F; wZero=((v & WZERO)!=0); wOne=((v & WONE)!=0); wMinusOne=((v & WMINUSONE)!=0); fromList=ops[p++]&0x7F; for(i=0; i<NUMLST; i++){ lb=ops[p++]&0x7F; v=ops[p++]&0x7F; hb=v&0x3F; lst[i]=lb+hb*128; if((v&0x40)!=0) lst[i]*=-1; } return p; } protected static int adjustLimVer(int l){ if(l>=LIMI25) l++; if(l>=LIMS25) l++; return l; } }