Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>
#include <thread.h>
#include "object.h"
#include "parse.h"
#include "search.h"

Object *
search(Object *rt, Object *parent, Reprog *preg) {
        /* Create a `search object', a subtree of rt containing
         * only objects with s in their value of key fields plus
         * their parentage.
         *
         * Algorithm: depth-first traversal of rt.  On the way down,
         * copy rt to nr (new root), on the way back up, delete
         * subtrees without match.
         *
         * returns null when there are no matches in rt's subtree
         */
        Object *o, *nr;
        char *s;
        int i;
        int yes = 0;

        nr = newobject(rt->type, parent);
        nr->orig = rt->orig?rt->orig:rt;
        nr->value = rt->value;
        strncpy(nr->key, rt->key, KEYLEN);

        if((((s = nr->value)) && regexec(preg, s, nil, 0) == 1)
        || (((s = nr->value)) && regexec(preg, s, nil, 0) == 1))
                yes = 1;
        for(i = 0; i < rt->nchildren; i++)
                if((o = search((Object*)rt->children[i], nr, preg))){
                        yes = 1;
                        addchild(nr, o, "search");
                }
        if(yes == 0){
                freeobject(nr, "s");
                return nil;
        }
        return nr;
}