Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_find

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;
     
    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_find

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.