diff options
author | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2013-09-15 13:57:53 -0700 |
---|---|---|
committer | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2013-09-15 13:57:53 -0700 |
commit | 9e1ecc534bace7d00a265a49018c0148a56361ae (patch) | |
tree | f7a779b999a7aed942510e3d448355f3554c20c7 | |
parent | 9634a336f080bc15c1e67495eb9216d1863808f8 (diff) |
Added Environment::call() method that makes it possible to call PHP functions
-rw-r--r-- | include/environment.h | 28 | ||||
-rw-r--r-- | include/value.h | 5 | ||||
-rw-r--r-- | phpcpp.h | 4 | ||||
-rw-r--r-- | src/environment.cpp | 228 | ||||
-rw-r--r-- | src/includes.h | 4 | ||||
-rw-r--r-- | tests/simple/simple.cpp | 4 |
6 files changed, 268 insertions, 5 deletions
diff --git a/include/environment.h b/include/environment.h index 6484d83..a7512d7 100644 --- a/include/environment.h +++ b/include/environment.h @@ -107,7 +107,33 @@ public: */ Global operator[](const std::string &name); - + /** + * Call a function in PHP + * We have ten variants of this function, depending on the number of parameters + * @param name Name of the function + * @return Value + */ + Value call(const Value &name); + Value call(const Value &name, Value p0); + Value call(const Value &name, Value p0, Value p1); + Value call(const Value &name, Value p0, Value p1, Value p2); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8); + Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9); + +private: + /** + * Call function with a number of parameters + * @param name Function name + * @param argc Number of parameters + * @param argv The parameters + * @return Value + */ + Value exec(const Value &name, int argc, struct _zval_struct ***params); protected: /** diff --git a/include/value.h b/include/value.h index fa2b608..e29b8f2 100644 --- a/include/value.h +++ b/include/value.h @@ -492,6 +492,11 @@ protected: * @var struct zval */ struct _zval_struct *_val; + + /** + * The environment can access the zval directly + */ + friend class Environment; }; /** @@ -21,13 +21,13 @@ /** * Include all headers files that are related to this library */ -#include <phpcpp/hiddenpointer.h> #include <phpcpp/type.h> +#include <phpcpp/value.h> +#include <phpcpp/hiddenpointer.h> #include <phpcpp/environment.h> #include <phpcpp/argument.h> #include <phpcpp/byval.h> #include <phpcpp/byref.h> -#include <phpcpp/value.h> #include <phpcpp/global.h> #include <phpcpp/member.h> #include <phpcpp/parameters.h> diff --git a/src/environment.cpp b/src/environment.cpp index b2fdad6..9b0a18e 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -64,6 +64,234 @@ Global Environment::operator[](const std::string &name) } /** + * Call function with a number of parameters + * @param name Function name + * @param argc Number of parameters + * @param argv The parameters + * @return Value + */ +Value Environment::exec(const Value &name, int argc, zval ***params) +{ + // the return zval + zval *retval = nullptr; + + // call the function + if (call_user_function_ex(CG(function_table), NULL, name._val, &retval, argc, params, 1, NULL) != SUCCESS) return nullptr; + + // was a value returned? + if (retval) return Value(retval); + + // no value was returned, return NULL + return nullptr; +} + +/** + * Call a function in PHP that does not have any parameters + * @param name Name of the function + * @return Value + */ +Value Environment::call(const Value &name) +{ + // call with zero parameters + return exec(name, 0, NULL); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0) +{ + // array of parameters + zval **params[1] = { &p0._val }; + + // call the function + return exec(name, 1, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1) +{ + // array of parameters + zval **params[2] = { &p0._val, &p1._val }; + + // call the function + return exec(name, 2, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2) +{ + // array of parameters + zval **params[3] = { &p0._val, &p1._val, &p2._val }; + + // call the function + return exec(name, 3, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3) +{ + // array of parameters + zval **params[4] = { &p0._val, &p1._val, &p2._val, &p3._val }; + + // call the function + return exec(name, 4, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4) +{ + // array of parameters + zval **params[5] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val }; + + // call the function + return exec(name, 5, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @param p5 The sixth parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5) +{ + // array of parameters + zval **params[6] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val }; + + // call the function + return exec(name, 6, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @param p5 The sixth parameter + * @param p6 The seventh parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6) +{ + // array of parameters + zval **params[7] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val }; + + // call the function + return exec(name, 7, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @param p5 The sixth parameter + * @param p6 The seventh parameter + * @param p7 The eight parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7) +{ + // array of parameters + zval **params[8] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val }; + + // call the function + return exec(name, 8, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @param p5 The sixth parameter + * @param p6 The seventh parameter + * @param p7 The eight parameter + * @param p8 The nineth parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8) +{ + // array of parameters + zval **params[9] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val, &p8._val }; + + // call the function + return exec(name, 9, params); +} + +/** + * Call a function in PHP + * @param name Name of the function + * @param p0 The first parameter + * @param p1 The second parameter + * @param p2 The third parameter + * @param p3 The fourth parameter + * @param p4 The fifth parameter + * @param p5 The sixth parameter + * @param p6 The seventh parameter + * @param p7 The eight parameter + * @param p8 The nineth parameter + * @param p9 The tenth parameter + * @return Value + */ +Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9) +{ + // array of parameters + zval **params[10] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val, &p8._val, &p9._val }; + + // call the function + return exec(name, 10, params); +} + +/** * End of namespace */ } diff --git a/src/includes.h b/src/includes.h index 7fb8c5f..41989c8 100644 --- a/src/includes.h +++ b/src/includes.h @@ -34,13 +34,13 @@ /** * Include other files from this library */ -#include "../include/hiddenpointer.h" #include "../include/type.h" +#include "../include/value.h" +#include "../include/hiddenpointer.h" #include "../include/environment.h" #include "../include/argument.h" #include "../include/byval.h" #include "../include/byref.h" -#include "../include/value.h" #include "../include/global.h" #include "../include/member.h" #include "../include/parameters.h" diff --git a/tests/simple/simple.cpp b/tests/simple/simple.cpp index dede458..fbc29d4 100644 --- a/tests/simple/simple.cpp +++ b/tests/simple/simple.cpp @@ -27,6 +27,10 @@ static Php::Value my_plus(Php::Environment &env, Php::Parameters ¶ms) g = "zo kan het ook"; + string output = env.call("strtoupper","test in lowercase"); + + cout << "output: " << output << endl; + return p1 + p2; } |