From f3cf854e6f81088e52ab70b834df814a5da51350 Mon Sep 17 00:00:00 2001 From: manduchi Date: Fri, 22 Apr 2022 15:29:36 +0200 Subject: [PATCH 1/3] Feature:add the possibility of passing var args via array in MDSplus::compileWithArgs and MDSplus::executeWithArgs --- include/mdsobjects.h | 4 ++ mdsobjects/cpp/mdsdataobjects.cpp | 109 ++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/include/mdsobjects.h b/include/mdsobjects.h index 341d97bc5f..c02033bcd8 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); ///@} 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 From 217f718775a433e0cd717a43b4c6f718af55335e Mon Sep 17 00:00:00 2001 From: manduchi Date: Fri, 22 Apr 2022 15:55:59 +0200 Subject: [PATCH 2/3] Fix:need to change name of compileWithArgs and executeWithArgs for array args --- include/mdsobjects.h | 8 ++++---- mdsobjects/cpp/mdsdataobjects.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/mdsobjects.h b/include/mdsobjects.h index c02033bcd8..a992d118a3 100644 --- a/include/mdsobjects.h +++ b/include/mdsobjects.h @@ -185,18 +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 *compileWithArgsV(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 *compileWithArgsV(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 *executeWithArgsV(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 *executeWithArgsV(const char *expr, Tree *tree, Data **args, int nArgs); friend EXPORT Data *deserialize(char const *serialized); friend EXPORT Data *deserialize(Data *serialized); ///@} diff --git a/mdsobjects/cpp/mdsdataobjects.cpp b/mdsobjects/cpp/mdsdataobjects.cpp index 5729260a1d..a191e1b3fc 100644 --- a/mdsobjects/cpp/mdsdataobjects.cpp +++ b/mdsobjects/cpp/mdsdataobjects.cpp @@ -849,7 +849,7 @@ Data *MDSplus::compileWithArgs(const char *expr, int nArgs...) return res; } -Data *MDSplus::compileWithArgs(const char *expr, Data **argsData, int nArgs) +Data *MDSplus::compileWithArgsV(const char *expr, Data **argsData, int nArgs) { void **args = new void *[nArgs]; int i; @@ -919,7 +919,7 @@ Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, int nArgs...) return res; } -Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs) +Data *MDSplus::compileWithArgsV(const char *expr, Tree *tree, Data **argsData, int nArgs) { int i; void **args = new void *[nArgs]; @@ -977,7 +977,7 @@ Data *MDSplus::executeWithArgs(const char *expr, int nArgs...) return evalData; } -Data *MDSplus::executeWithArgs(const char *expr, Data **argsData, int nArgs) +Data *MDSplus::executeWithArgsV(const char *expr, Data **argsData, int nArgs) { void **args = new void *[nArgs]; @@ -1043,7 +1043,7 @@ 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) +Data *MDSplus::executeWithArgsV(const char *expr, Tree *tree, Data **argsData, int nArgs) { void **args = new void *[nArgs]; From 1652a631cd00492be5f7800238e93c2f9c7e0a81 Mon Sep 17 00:00:00 2001 From: manduchi Date: Fri, 22 Apr 2022 16:17:43 +0200 Subject: [PATCH 3/3] Back to original name --- include/mdsobjects.h | 12 ++++++++---- mdsobjects/cpp/mdsdataobjects.cpp | 8 ++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/mdsobjects.h b/include/mdsobjects.h index a992d118a3..f2a988ffc3 100644 --- a/include/mdsobjects.h +++ b/include/mdsobjects.h @@ -185,18 +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 *compileWithArgsV(const char *expr, Data **args, 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 *compileWithArgsV(const char *expr, Tree *tree, Data **args, 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 *executeWithArgsV(const char *expr, Data **args, 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 *executeWithArgsV(const char *expr, Tree *tree, Data **args, 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); ///@} @@ -4568,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 a191e1b3fc..5729260a1d 100644 --- a/mdsobjects/cpp/mdsdataobjects.cpp +++ b/mdsobjects/cpp/mdsdataobjects.cpp @@ -849,7 +849,7 @@ Data *MDSplus::compileWithArgs(const char *expr, int nArgs...) return res; } -Data *MDSplus::compileWithArgsV(const char *expr, Data **argsData, int nArgs) +Data *MDSplus::compileWithArgs(const char *expr, Data **argsData, int nArgs) { void **args = new void *[nArgs]; int i; @@ -919,7 +919,7 @@ Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, int nArgs...) return res; } -Data *MDSplus::compileWithArgsV(const char *expr, Tree *tree, Data **argsData, int nArgs) +Data *MDSplus::compileWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs) { int i; void **args = new void *[nArgs]; @@ -977,7 +977,7 @@ Data *MDSplus::executeWithArgs(const char *expr, int nArgs...) return evalData; } -Data *MDSplus::executeWithArgsV(const char *expr, Data **argsData, int nArgs) +Data *MDSplus::executeWithArgs(const char *expr, Data **argsData, int nArgs) { void **args = new void *[nArgs]; @@ -1043,7 +1043,7 @@ Data *MDSplus::executeWithArgs(const char *expr, Tree *tree, int nArgs...) freeDsc(args[i]); return evalData; } -Data *MDSplus::executeWithArgsV(const char *expr, Tree *tree, Data **argsData, int nArgs) +Data *MDSplus::executeWithArgs(const char *expr, Tree *tree, Data **argsData, int nArgs) { void **args = new void *[nArgs];