global.set has been implemented, but not diff xmit for globals
This commit is contained in:
@@ -721,43 +721,52 @@ eng::string XYZ::debug_string() const {
|
||||
}
|
||||
|
||||
|
||||
void (*dprintf_hook)(const char *oneline);
|
||||
void (*dprint_hook)(const char *oneline, size_t size);
|
||||
|
||||
void hook_dprintf(void (*func)(const char *oneline)) {
|
||||
dprintf_hook = func;
|
||||
void hook_dprint(void (*func)(const char *oneline, size_t size)) {
|
||||
dprint_hook = func;
|
||||
}
|
||||
|
||||
static void chop_up_dprintf(char *buffer, int size) {
|
||||
void dprintview(std::string_view view) {
|
||||
// Drop the final newline, if any. We're going
|
||||
// to automatically end with a newline and we don't
|
||||
// want to double up.
|
||||
if ((size > 0) && (buffer[size-1] == '\n')) {
|
||||
size -= 1;
|
||||
if ((view.size() > 0) && (view.back() == '\n')) {
|
||||
view.remove_suffix(1);
|
||||
}
|
||||
|
||||
// Chop it up into lines and call the hook one line
|
||||
// at a time. Replace control characters as we go.
|
||||
// at a time.
|
||||
const char *buffer = view.data();
|
||||
const char *base = buffer;
|
||||
for (int i = 0; i <= size; i++) {
|
||||
if (buffer[i] < ' ') {
|
||||
if ((buffer[i] == '\n') || (buffer[i] == 0)) {
|
||||
buffer[i] = 0;
|
||||
if (dprintf_hook == nullptr) {
|
||||
fprintf(stderr, "%s\n", base);
|
||||
} else {
|
||||
dprintf_hook(base);
|
||||
}
|
||||
base = buffer + i + 1;
|
||||
for (int i = 0; i < int(view.size()); i++) {
|
||||
if ((buffer[i] == '\n') || (buffer[i] == 0)) {
|
||||
size_t sz = buffer + i - base;
|
||||
if (dprint_hook == nullptr) {
|
||||
fwrite(base, 1, sz, stderr);
|
||||
fwrite("\n", 1, 1, stderr);
|
||||
} else {
|
||||
buffer[i] = ' ';
|
||||
dprint_hook(base, sz);
|
||||
}
|
||||
base = buffer + i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Output the final line.
|
||||
size_t sz = buffer + view.size() - base;
|
||||
if (sz > 0) {
|
||||
if (dprint_hook == nullptr) {
|
||||
fwrite(base, 1, sz, stderr);
|
||||
fwrite("\n", 1, 1, stderr);
|
||||
} else {
|
||||
dprint_hook(base, sz);
|
||||
}
|
||||
}
|
||||
|
||||
// If we're sending to stderr, flush. If not, then
|
||||
// the hook routine is responsible for flushing its own
|
||||
// output.
|
||||
if (dprintf_hook == nullptr) {
|
||||
if (dprint_hook == nullptr) {
|
||||
fflush(stderr);
|
||||
}
|
||||
}
|
||||
@@ -768,11 +777,11 @@ void dprintf(const char *format, ...) {
|
||||
va_start (args, format);
|
||||
int n = vsnprintf(buffer, 256, format, args);
|
||||
if (n <= 255) {
|
||||
chop_up_dprintf(buffer, n);
|
||||
dprintview(std::string_view(buffer, n));
|
||||
} else {
|
||||
char *lbuffer = (char *)malloc(n + 1);
|
||||
vsnprintf(lbuffer, n+1, format, args);
|
||||
chop_up_dprintf(lbuffer, n);
|
||||
dprintview(std::string_view(lbuffer, n));
|
||||
free(lbuffer);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user