diff --git a/include/mdsobjects.h b/include/mdsobjects.h index 341d97bc5f..f2a988ffc3 100644 --- a/include/mdsobjects.h +++ b/include/mdsobjects.h @@ -185,14 +185,18 @@ namespace MDSplus /// Friendship declaration for TDI expression compilation friend EXPORT Data *compile(const char *expr); friend EXPORT Data *compileWithArgs(const char *expr, int nArgs...); + friend EXPORT Data *compileWithArgs(const char *expr, Data **args, int nArgs); friend EXPORT Data *compile(const char *expr, Tree *tree); friend EXPORT Data *compileWithArgs(const char *expr, Tree *tree, int nArgs...); + friend EXPORT Data *compileWithArgs(const char *expr, Tree *tree, Data **args, int nArgs); friend EXPORT Data *execute(const char *expr); friend EXPORT Data *executeWithArgs(const char *expr, int nArgs...); + friend EXPORT Data *executeWithArgs(const char *expr, Data **args, int nArgs); friend EXPORT Data *execute(const char *expr, Tree *tree); friend EXPORT Data *executeWithArgs(const char *expr, Tree *tree, int nArgs...); + friend EXPORT Data *executeWithArgs(const char *expr, Tree *tree, Data **args, int nArgs); friend EXPORT Data *deserialize(char const *serialized); friend EXPORT Data *deserialize(Data *serialized); ///@} @@ -4564,12 +4568,16 @@ namespace MDSplus EXPORT Data *deserialize(Data *serializedData); EXPORT Data *compile(const char *expr); EXPORT Data *compileWithArgs(const char *expr, int nArgs...); + EXPORT Data *compileWithArgs(const char *expr, Data **argsData, int nArgs); EXPORT Data *compile(const char *expr, Tree *tree); EXPORT Data *compileWithArgs(const char *expr, Tree *tree, int nArgs...); + EXPORT Data *compileWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs); EXPORT Data *execute(const char *expr); EXPORT Data *executeWithArgs(const char *expr, int nArgs...); + EXPORT Data *executeWithArgs(const char *expr, Data **argsData, int nArgs); EXPORT Data *execute(const char *expr, Tree *tree); EXPORT Data *executeWithArgs(const char *expr, Tree *tree, int nArgs...); + EXPORT Data *executeWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs); // EXPORT Tree *getActiveTree(); // EXPORT void setActiveTree(Tree *tree); // Required for handling dynamic memory allocated in a different DLL on windows diff --git a/mdsobjects/cpp/mdsdataobjects.cpp b/mdsobjects/cpp/mdsdataobjects.cpp index fb58bf6d22..5729260a1d 100644 --- a/mdsobjects/cpp/mdsdataobjects.cpp +++ b/mdsobjects/cpp/mdsdataobjects.cpp @@ -849,6 +849,37 @@ Data *MDSplus::compileWithArgs(const char *expr, int nArgs...) return res; } +Data *MDSplus::compileWithArgs(const char *expr, Data **argsData, int nArgs) +{ + void **args = new void *[nArgs]; + int i; + for (i = 0; i < nArgs; i++) + { + args[i] = argsData[i]->convertToDsc(); + } + int status; + Data *res; + try + { + AutoPointer actTree(getActiveTree()); + res = (Data *)compileFromExprWithArgs(expr, nArgs, &args[0], actTree, + (actTree) ? actTree->getCtx() : NULL, + &status); + } + catch (MdsException &exc) + { + res = (Data *)compileFromExprWithArgs(expr, nArgs, &args[0], NULL, NULL, + &status); + } + for (i = 0; i < nArgs; i++) + freeDsc(args[i]); + delete [] args; + + if (STATUS_NOT_OK) + throw MdsException(status); + return res; +} + /// /// \brief MDSplus::compile /// \param expr TDI expression to evaluate @@ -888,6 +919,26 @@ Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, int nArgs...) return res; } +Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs) +{ + int i; + void **args = new void *[nArgs]; + + for (i = 0; i < nArgs; i++) + { + args[i] = argsData[i]->convertToDsc(); + } + int status; + Data *res = (Data *)compileFromExprWithArgs( + expr, nArgs, (void *)args, tree, (tree) ? tree->getCtx() : NULL, &status); + for (i = 0; i < nArgs; i++) + freeDsc(args[i]); + delete [] args; + if (STATUS_NOT_OK) + throw MdsException(status); + return res; +} + Data *MDSplus::execute(const char *expr) { return executeWithArgs(expr, 0); } Data *MDSplus::executeWithArgs(const char *expr, int nArgs...) @@ -926,6 +977,40 @@ Data *MDSplus::executeWithArgs(const char *expr, int nArgs...) return evalData; } +Data *MDSplus::executeWithArgs(const char *expr, Data **argsData, int nArgs) +{ + void **args = new void *[nArgs]; + + + for (int i = 0; i < nArgs; i++) + { + args[i] = argsData[i]->convertToDsc(); + } + int status; + Tree *actTree = 0; + try + { + actTree = getActiveTree(); + } + catch (MdsException const &exc) + { + actTree = 0; + } + Data *compData = (Data *)compileFromExprWithArgs( + expr, nArgs, (void *)args, actTree, (actTree) ? actTree->getCtx() : NULL, + &status); + if (STATUS_NOT_OK) + throw MdsException(status); + Data *evalData = compData->data(); + deleteData(compData); + for (int i = 0; i < nArgs; i++) + freeDsc(args[i]); + delete [] args; + if (actTree) + delete (actTree); + + return evalData; +} Data *MDSplus::execute(const char *expr, Tree *tree) { @@ -958,6 +1043,30 @@ Data *MDSplus::executeWithArgs(const char *expr, Tree *tree, int nArgs...) freeDsc(args[i]); return evalData; } +Data *MDSplus::executeWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs) +{ + void **args = new void *[nArgs]; + + for (int i = 0; i < nArgs; i++) + { + args[i] = argsData[i]->convertToDsc(); + } + int status; + Data *compData = + (Data *)compileFromExprWithArgs((char *)expr, nArgs, (void *)args, tree, + (tree) ? tree->getCtx() : NULL, &status); + if (STATUS_NOT_OK) + throw MdsException(status); + if (!compData) + throw MdsException("Cannot compile expression"); + + Data *evalData = compData->data(); + deleteData(compData); + for (int i = 0; i < nArgs; i++) + freeDsc(args[i]); + delete [] args; + return evalData; +} // Complete Conversion to Dsc by condsidering help, units and error