// // aegis - project change supervisor // Copyright (C) 1994-1996, 1999, 2002-2008 Peter Miller // // 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 3 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. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include #include #include rpt_expr_func::~rpt_expr_func() { } rpt_expr_func::rpt_expr_func(const rpt_expr::pointer &e1, const rpt_expr::pointer &e2) { append(e1); append(e2); } rpt_expr::pointer rpt_expr_func::create(const rpt_expr::pointer &e1, const rpt_expr::pointer &e2) { return pointer(new rpt_expr_func(e1, e2)); } rpt_value::pointer rpt_expr_func::evaluate() const { // // get the function pointer from the first argument // assert(get_nchildren() == 2); rpt_value::pointer vp = nth_child(0)->evaluate(true, true); if (vp->is_an_error()) return vp; rpt_value_func *rvfp = dynamic_cast(vp.get()); if (!rvfp) { sub_context_ty sc; sc.var_set_charstar("Name", vp->name()); nstring s(sc.subst_intl(i18n("invalid function name ($name)"))); return rpt_value_error::create(nth_child(0)->get_pos(), s); } rpt_func::pointer fp = rvfp->query(); // // get the argument list from the second argument // rpt_expr::pointer ep = nth_child(1); if (!fp->verify(ep)) { sub_context_ty sc; nstring s(sc.subst_intl(i18n("invalid function arguments"))); return rpt_value_error::create(get_pos(), s); } size_t argc = ep->get_nchildren(); rpt_value::pointer *argv = new rpt_value::pointer [argc]; for (size_t j = 0; j < argc; ++j) { vp = ep->nth_child(j)->evaluate(true, true); argv[j] = vp; if (vp->is_an_error()) { delete [] argv; return vp; } } // // evaluate the function // vp = fp->run(ep, argc, argv); // // free the argument list // delete [] argv; // // return the function return value // return vp; }