diff options
author | Richard Knight <q@1bpm.net> | 2022-09-22 15:17:08 +0100 |
---|---|---|
committer | Richard Knight <q@1bpm.net> | 2022-09-22 15:17:08 +0100 |
commit | b60bcda728f7bce9e5753aa20e59b29a4479aab8 (patch) | |
tree | b5a7050604254ca8f77591acf7884081c3fe7881 /src/opcodes.cpp | |
parent | 6258a82af556285658a542876175b04039cd2707 (diff) | |
download | csound-json-7ed81153c7c2725c426e179bd21939cf6130661f.tar.gz csound-json-7ed81153c7c2725c426e179bd21939cf6130661f.tar.bz2 csound-json-7ed81153c7c2725c426e179bd21939cf6130661f.zip |
Diffstat (limited to 'src/opcodes.cpp')
-rw-r--r-- | src/opcodes.cpp | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/src/opcodes.cpp b/src/opcodes.cpp index a241a74..8f76317 100644 --- a/src/opcodes.cpp +++ b/src/opcodes.cpp @@ -753,6 +753,110 @@ struct jsonptr : plugin<1, 2> { } }; + +/* + Get string value by JSON Pointer + */ +struct jsonptrvalStringBase : plugin<1, 2> { + void run() { + STRINGDAT &output = outargs.str_data(0); + jsoncons::json queried = jsoncons::jsonpointer::get( + jsonSession->data, std::string(inargs.str_data(1).data) + ); + std::string value = queried.as<std::string>(); + output.size = value.size(); + output.data = csound->strdup((char*) value.c_str()); + } +}; +struct jsonptrvalString : jsonptrvalStringBase { + PLUGINCHILD("S", "iS", true) +}; +struct jsonptrvalStringK : jsonptrvalStringBase { + PLUGINCHILDK("S", "iS", true) +}; + + +/* + Get string array value by JSON Pointer + */ +struct jsonptrvalStringArrayBase : plugin<1, 2> { + void run() { + jsoncons::json queried = jsoncons::jsonpointer::get( + jsonSession->data, std::string(inargs.str_data(1).data) + ); + jsonArrayToCSArray(csound, &queried, (ARRAYDAT*) outargs(0), true); + } +}; +struct jsonptrvalStringArray : jsonptrvalStringArrayBase { + PLUGINCHILD("S[]", "iS", true) +}; +struct jsonptrvalStringArrayK : jsonptrvalStringArrayBase { + PLUGINCHILDK("S[]", "iS", true) +}; + + +/* + Get numeric value by JSON Pointer + */ +struct jsonptrvalNumericBase : plugin<1, 2> { + void run() { + jsoncons::json queried = jsoncons::jsonpointer::get( + jsonSession->data, std::string(inargs.str_data(1).data) + ); + outargs[0] = queried.as<MYFLT>(); + } +}; +struct jsonptrvalNumeric : jsonptrvalNumericBase { + PLUGINCHILD("i", "iS", true) +}; +struct jsonptrvalNumericK : jsonptrvalNumericBase { + PLUGINCHILDK("k", "iS", true) +}; + + +/* + Get numeric array value by JSON Pointer + */ +struct jsonptrvalNumericArrayBase : plugin<1, 2> { + void run() { + jsoncons::json queried = jsoncons::jsonpointer::get( + jsonSession->data, std::string(inargs.str_data(1).data) + ); + jsonArrayToCSArray(csound, &queried, (ARRAYDAT*) outargs(0), false); + } +}; +struct jsonptrvalNumericArray : jsonptrvalNumericArrayBase { + PLUGINCHILD("i[]", "iS", true) +}; +struct jsonptrvalNumericArrayK : jsonptrvalNumericArrayBase { + PLUGINCHILDK("k[]", "iS", true) +}; + + +/* + Get numeric array value by JSON Pointer + */ +struct jsonptrarr : plugin<1, 2> { + PLUGINIT("i[]", "iS", true) + void irun() { + JSONSession* jsonSession2; + jsoncons::json queried = jsoncons::jsonpointer::get( + jsonSession->data, std::string(inargs.str_data(1).data) + ); + std::vector<jsoncons::json> vals = queried.as<std::vector<jsoncons::json>>(); + ARRAYDAT* array = (ARRAYDAT*) outargs(0); + arrayInit(csound, array, vals.size(), 1); + MYFLT handle; + for (std::size_t index = 0; index < vals.size(); index++) { + handle = createHandle<JSONSession>(csound, &jsonSession2, handleName); + jsonSession2->active = true; + jsonSession2->data = vals[index]; + array->data[index] = handle; + } + } +}; + + /* Check for existence by JSON Pointer */ @@ -820,7 +924,7 @@ struct jsonptradd : inplug<3> { INPLUGINIT("iSi") void irun() { JSONSession* jsonSession2; - getSession(args[1], &jsonSession2); + getSession(args[2], &jsonSession2); jsoncons::jsonpointer::add( jsonSession->data, @@ -1090,6 +1194,18 @@ void csnd::on_load(csnd::Csound *csound) { // csnd::plugin<jsonpathrpl>(csound, "jsonpathrpl", csnd::thread::i); csnd::plugin<jsonptr>(csound, "jsonptr", csnd::thread::i); + + csnd::plugin<jsonptrarr>(csound, "jsonptrarr", csnd::thread::i); + + csnd::plugin<jsonptrvalStringArray>(csound, "jsonptrval.Sa", csnd::thread::i); + csnd::plugin<jsonptrvalStringArrayK>(csound, "jsonptrval.Sak", csnd::thread::i); + csnd::plugin<jsonptrvalString>(csound, "jsonptrval.S", csnd::thread::i); + csnd::plugin<jsonptrvalStringK>(csound, "jsonptrval.Sk", csnd::thread::i); + csnd::plugin<jsonptrvalNumeric>(csound, "jsonptrval.i", csnd::thread::i); + csnd::plugin<jsonptrvalNumericK>(csound, "jsonptrval.k", csnd::thread::i); + csnd::plugin<jsonptrvalNumericArray>(csound, "jsonptrval.ia", csnd::thread::i); + csnd::plugin<jsonptrvalNumericArrayK>(csound, "jsonptrval.ka", csnd::thread::i); + csnd::plugin<jsonptrhas>(csound, "jsonptrhas", csnd::thread::i); csnd::plugin<jsonptrhasK>(csound, "jsonptrhask", csnd::thread::ik); csnd::plugin<jsonptraddvalString>(csound, "jsonptraddval.S", csnd::thread::i); |