package abstrasy.pcfx;
import abstrasy.Hash;
import abstrasy.Node;
import abstrasy.PCoder;
import java.util.ArrayList;
/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
* http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/
public class PCFx_find extends PCFx {
public PCFx_find() {
}
/**
* eval
*
* @param startAt Node
* @return Node
* @throws Exception
* @todo Implémenter cette méthode abstrasy.PCFx
*/
private final void addRef(Node res, Node xnode, int p) throws Exception {
if (p >= 0) {
Node znode = xnode.elementAt(p);
res.addElement(new Node(p));
}
}
public Node eval(Node startAt) throws Exception {
// forme : (find valeur in liste/string/hash)
// 0 1 2 3
Node res = null;
startAt.requirePCode(2, PCoder.PC_IN);
startAt.isGoodArgsCnt(4);
Node xnode = startAt.getSubNode(3, Node.TYPE_STRING | Node.TYPE_HASH | Node.TYPE_CLIST | Node.VTYPE_DELEGABLE);
long typePossible = 0;
if (xnode.getType()==Node.TYPE_STRING) {
typePossible = Node.TYPE_STRING;
}
else {
typePossible = Node.VTYPE_EQUALISABLE;
}
Node snode = startAt.getSubNode(1, typePossible);
/*
* Cas où (find valeur in objet)... Il s'agit d'une surcharge...
*/
if(xnode.isDelegable())
return Node.VDelegable.evalMethod(xnode, PCoder.getMethod(PCoder.PC_FIND), Node.createCList().append(snode));
res = Node.createCList();
long qt=xnode.getQType();
if (qt==Node.TYPE_CLIST) {
for(int i=0;i<xnode.size();i++) {
if (Node.equalsNodes(xnode.elementAt(i), snode))
res.addElement(new Node(i));
}
}
if (qt==Node.TYPE_HASH) {
Hash hash =xnode.getHash();
ArrayList<Node> kn=hash.keys_nodes();
for(int i=0;i<kn.size();i++) {
Node k=kn.get(i);
Node v=hash.ref(k);
if (Node.equalsNodes(v, snode))
res.addElement(k.secure());
}
}
else if (qt==Node.TYPE_STRING) {
snode.requireNodeType(Node.TYPE_STRING);
int p = 0;
String x=xnode.getString();
String s=snode.getString();
if (x.length() > 0 && s.length() > 0) {
while (p >= 0) {
p = x.indexOf(s, p);
if (p >= 0) {
res.addElement(new Node(p));
p += s.length();
}
}
}
}
return res;
}
}