|
- #include "extra/Base64.hpp"
- #include "extra/String.hpp"
-
- int main(int argc, char* argv[])
- {
- if (argc != 2)
- {
- d_stdout("usage: %s [base64-dpf-state]", argv[0]);
- return 1;
- }
-
- const std::vector<uint8_t> data(d_getChunkFromBase64String(argv[1]));
-
- if (data.empty())
- {
- printf("{}\n");
- return 0;
- }
-
- String key, value;
- bool firstValue = true;
- bool hasValue = false;
- bool fillingKey = true; // if filling key or value
- char queryingType = 'i'; // can be 'n', 's' or 'p' (none, states, parameters)
-
- const char* const buffer = reinterpret_cast<const char*>(data.data());
-
- printf("{");
-
- for (size_t i = 0; i < data.size(); ++i)
- {
- // found terminator, stop here
- if (buffer[i] == '\xfe')
- {
- break;
- }
-
- // append to temporary vars
- if (fillingKey)
- {
- key += buffer + i;
- }
- else
- {
- value += buffer + i;
- hasValue = true;
- }
-
- // increase buffer offset by length of string
- i += std::strlen(buffer + i);
-
- // if buffer offset points to null, we found the end of a string, lets check
- if (buffer[i] == '\0')
- {
- // special keys
- if (key == "__dpf_state_begin__")
- {
- DISTRHO_SAFE_ASSERT_INT_RETURN(queryingType == 'i' || queryingType == 'n', queryingType, 1);
- if (queryingType == 'n')
- printf(",");
- printf("\n \"states\": {");
- queryingType = 's';
- key.clear();
- value.clear();
- firstValue = true;
- hasValue = false;
- continue;
- }
- if (key == "__dpf_state_end__")
- {
- DISTRHO_SAFE_ASSERT_INT_RETURN(queryingType == 's', queryingType, 1);
- printf("\n }");
- queryingType = 'n';
- key.clear();
- value.clear();
- hasValue = false;
- continue;
- }
- if (key == "__dpf_parameters_begin__")
- {
- DISTRHO_SAFE_ASSERT_INT_RETURN(queryingType == 'i' || queryingType == 'n', queryingType, 1);
- if (queryingType == 'n')
- printf(",");
- printf("\n \"parameters\": {");
- queryingType = 'p';
- key.clear();
- value.clear();
- firstValue = true;
- hasValue = false;
- continue;
- }
- if (key == "__dpf_parameters_end__")
- {
- DISTRHO_SAFE_ASSERT_INT_RETURN(queryingType == 'p', queryingType, 1);
- printf("\n }");
- queryingType = 'x';
- key.clear();
- value.clear();
- hasValue = false;
- continue;
- }
-
- // no special key, swap between reading real key and value
- fillingKey = !fillingKey;
-
- // if there is no value yet keep reading until we have one
- if (! hasValue)
- continue;
-
- if (key == "__dpf_program__")
- {
- DISTRHO_SAFE_ASSERT_INT_RETURN(queryingType == 'i', queryingType, 1);
- queryingType = 'n';
-
- printf("\n \"program\": %s", value.buffer());
- }
- else if (queryingType == 's')
- {
- if (! firstValue)
- printf(",");
- // TODO safely encode value as json compatible string
- printf("\n \"%s\": %s", key.buffer(), value.buffer());
- }
- else if (queryingType == 'p')
- {
- if (! firstValue)
- printf(",");
- printf("\n \"%s\": %s", key.buffer(), value.buffer());
- }
-
- key.clear();
- value.clear();
- firstValue = hasValue = false;
- }
- }
-
- printf("\n}\n");
- return 0;
- }
|