in src/dxapi/native/io/streams.cpp [189:264]
void InputStreamPreloader::dbg_dump(size_t startOffset, size_t nBytes, bool dumpHex, bool dumpUnchunked)
{
char basename[200];
char name[200];
FILE *f;
const byte *data = &data_[startOffset];
const byte *end = data + nBytes;
uint64 time_ms = time_ns() / TIME_NANOS_PER_MILLISECOND;
sprintf(basename, "preloaded@%llu", (ulonglong)time_ms);
sprintf(name, "%s.bin", basename);
f = fopen(name, "wb");
fwrite(data, 1, nBytes, f);
fclose(f);
dbg_log("Saved dump of preload buffer");
if (dumpUnchunked) {
// Use external unchunking code for now
#if 0
vector<byte> out;
sprintf(name, "%s_unc.bin", basename);
f = fopen(name, "wb");
//puts(name);
const byte * p = data;
while (p < end - 1) {
char * endptr;
ulonglong length = strtoull((const char *)p, &endptr, 0x10);
assert(NULL != endptr);
assert(endptr[0] == '\xD');
assert(endptr[1] == '\xA');
if (0 == length) break;
p = (byte *)endptr + 2;
size_t inext = p - data_.data() + length;
if (inext >= i) {
inext = i;
length = inext - (p - data_.data());
out.resize(out.size() + length);
memcpy(&out[out.size() - length], p, length);
break;
}
else {
out.resize(out.size() + length);
memcpy(&out[out.size() - length], p, length);
}
p += length;
assert(p[0] == '\xD');
assert(p[1] == '\xA');
p += 2;
i = p - data_.data();
}
fwrite(out.data(), out.size(), 1, f);
fclose(f);
dbg_log("Saved dump of preload buffer without HTTP chunks");
#endif
}
if (dumpHex) {
sprintf(name, "%s.txt", basename);
f = fopen(name, "wt");
forn(i, end - data) {
// Printf a hex value with optional EOL character after every 16 values
fprintf(f, "%02X%c", data[i], " \n"[0xF == (i & 0xF)]);
}
fclose(f);
dbg_log("Saved dump of preload buffer in hex text format");
}
}