Browse Source

SC: use sprintf instead of snprintf

tags/v1.3.0
Brian Heim 5 years ago
parent
commit
9f35afde17
1 changed files with 19 additions and 24 deletions
  1. +19
    -24
      src/SuperColliderEngine.cpp

+ 19
- 24
src/SuperColliderEngine.cpp View File

@@ -175,64 +175,59 @@ constexpr unsigned processBeginStringOffset = sizeof(PROCESS_BEGIN_STRING);
#undef PROCESS_BEGIN_STRING #undef PROCESS_BEGIN_STRING


template <typename... Ts> template <typename... Ts>
static void doAppend(char*& buf, int& size, const char* fmt, Ts... vals) {
static void doAppend(char*& buf, const char* fmt, Ts... vals) {
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-security" #pragma GCC diagnostic ignored "-Wformat-security"
auto result = std::snprintf(buf, size, fmt, vals...);
buf += std::sprintf(buf, fmt, vals...);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
buf += result;
size -= result;
} }


const char* SC_VcvPrototypeClient::buildScProcessBlockString(const ProcessBlock* block) const noexcept { const char* SC_VcvPrototypeClient::buildScProcessBlockString(const ProcessBlock* block) const noexcept {
auto* buf = processBlockStringScratchBuf + processBeginStringOffset - 1; auto* buf = processBlockStringScratchBuf + processBeginStringOffset - 1;
int size = sizeof(processBlockStringScratchBuf) - processBeginStringOffset + 1;


// Perhaps imprudently assuming snprintf never returns a negative code // Perhaps imprudently assuming snprintf never returns a negative code
doAppend(buf, size, "%.6f,%.6f,%d,", block->sampleRate, block->sampleTime, block->bufferSize);
doAppend(buf, "%.6f,%.6f,%d,", block->sampleRate, block->sampleTime, block->bufferSize);


auto&& appendInOutArray = [&buf, &size](const int bufferSize, const float (&data)[NUM_ROWS][MAX_BUFFER_SIZE]) {
doAppend(buf, size, "[");
auto&& appendInOutArray = [&buf](const int bufferSize, const float (&data)[NUM_ROWS][MAX_BUFFER_SIZE]) {
doAppend(buf, "[");
for (int i = 0; i < NUM_ROWS; ++i) { for (int i = 0; i < NUM_ROWS; ++i) {
doAppend(buf, size, "FloatArray[");
doAppend(buf, "FloatArray[");
for (int j = 0; j < bufferSize; ++j) { for (int j = 0; j < bufferSize; ++j) {
doAppend(buf, size, "%g%c", data[i][j], j == bufferSize - 1 ? ' ' : ',');
doAppend(buf, "%g%c", data[i][j], j == bufferSize - 1 ? ' ' : ',');
} }
doAppend(buf, size, "]%c", i == NUM_ROWS - 1 ? ' ' : ',');
doAppend(buf, "]%c", i == NUM_ROWS - 1 ? ' ' : ',');
} }
doAppend(buf, size, "],");
doAppend(buf, "],");
}; };


appendInOutArray(block->bufferSize, block->inputs); appendInOutArray(block->bufferSize, block->inputs);
appendInOutArray(block->bufferSize, block->outputs); appendInOutArray(block->bufferSize, block->outputs);


// knobs // knobs
doAppend(buf, size, "FloatArray[");
doAppend(buf, "FloatArray[");
for (int i = 0; i < NUM_ROWS; ++i) for (int i = 0; i < NUM_ROWS; ++i)
doAppend(buf, size, "%g%c", block->knobs[i], i == NUM_ROWS - 1 ? ' ' : ',');
doAppend(buf, "%g%c", block->knobs[i], i == NUM_ROWS - 1 ? ' ' : ',');


// switches // switches
doAppend(buf, size, "],[");
doAppend(buf, "],[");
for (int i = 0; i < NUM_ROWS; ++i) for (int i = 0; i < NUM_ROWS; ++i)
doAppend(buf, size, "%s%c", block->switches[i] ? "true" : "false", i == NUM_ROWS - 1 ? ' ' : ',');
doAppend(buf, size, "]");
doAppend(buf, "%s%c", block->switches[i] ? "true" : "false", i == NUM_ROWS - 1 ? ' ' : ',');
doAppend(buf, "]");


// lights, switchlights // lights, switchlights
auto&& appendLightsArray = [&buf, &size](const float (&array)[NUM_ROWS][3]) {
doAppend(buf, size, ",[");
auto&& appendLightsArray = [&buf](const float (&array)[NUM_ROWS][3]) {
doAppend(buf, ",[");
for (int i = 0; i < NUM_ROWS; ++i) { for (int i = 0; i < NUM_ROWS; ++i) {
doAppend(buf, size, "FloatArray[%g,%g,%g]%c", array[i][0], array[i][1], array[i][2],
doAppend(buf, "FloatArray[%g,%g,%g]%c", array[i][0], array[i][1], array[i][2],
i == NUM_ROWS - 1 ? ' ' : ','); i == NUM_ROWS - 1 ? ' ' : ',');
} }
doAppend(buf, size, "]");
doAppend(buf, "]");
}; };


appendLightsArray(block->lights); appendLightsArray(block->lights);
appendLightsArray(block->switchLights); appendLightsArray(block->switchLights);


doAppend(buf, size, "));");

// printf("%s\nWrote %lu, %u remaining", processBlockStringScratchBuf, buf - processBlockStringScratchBuf, size);
doAppend(buf, "));");


return processBlockStringScratchBuf; return processBlockStringScratchBuf;
} }


Loading…
Cancel
Save