diff options
Diffstat (limited to 'libs/tgl/src/auto-static-print-ds.c')
-rw-r--r-- | libs/tgl/src/auto-static-print-ds.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/libs/tgl/src/auto-static-print-ds.c b/libs/tgl/src/auto-static-print-ds.c new file mode 100644 index 0000000000..cfec470fcc --- /dev/null +++ b/libs/tgl/src/auto-static-print-ds.c @@ -0,0 +1,106 @@ +static int multiline_output = 1; +static int multiline_offset; +static int multiline_offset_size = 2; + +static int disable_field_names; + +#define OUT_BUF_SIZE (1 << 25) +static char out_buf[OUT_BUF_SIZE]; +static int out_buf_pos; + +#define eprintf(...) \ + do { \ + out_buf_pos += snprintf (out_buf + out_buf_pos, OUT_BUF_SIZE - out_buf_pos, __VA_ARGS__);\ + assert (out_buf_pos < OUT_BUF_SIZE);\ + } while (0)\ + +static int valid_utf8_char (const char *str) { + unsigned char c = (unsigned char) *str; + int n = 0; + + if ((c & 0x80) == 0x00) { + n = 0; + } else if ((c & 0xe0) == 0xc0) { + n = 1; + } else if ((c & 0xf0) == 0xe0) { + n = 2; + } else if ((c & 0xf8) == 0xf0) { + n = 3; + } else if ((c & 0xfc) == 0xf8) { + n = 4; + } else if ((c & 0xfe) == 0xfc) { + n = 5; + } else { + return -1; + } + + int i; + for (i = 0; i < n; i ++) { + if ((((unsigned char)(str[i + 1])) & 0xc0) != 0x80) { + return -1; + } + } + return n + 1; +} + +static void print_escaped_string (const char *str, int len) { + eprintf ("\""); + const char *end = str + len; + while (str < end) { + int n = valid_utf8_char (str); + if (n < 0) { + eprintf ("\\x%02x", (int)(unsigned char)*str); + str ++; + } else if (n >= 2) { + int i; + for (i = 0; i < n; i++) { + eprintf ("%c", *(str ++)); + } + } else if (((unsigned char)*str) >= ' ' && *str != '"' && *str != '\\') { + eprintf ("%c", *str); + str ++; + } else { + switch (*str) { + case '\n': + eprintf("\\n"); + break; + case '\r': + eprintf("\\r"); + break; + case '\t': + eprintf("\\t"); + break; + case '\b': + eprintf("\\b"); + break; + case '\a': + eprintf("\\a"); + break; + case '\\': + eprintf ("\\\\"); + break; + case '"': + eprintf ("\\\""); + break; + default: + eprintf ("\\x%02x", (int)(unsigned char)*str); + break; + } + str ++; + } + } + eprintf ("\""); +} + +static void print_offset (void) { + int i; + for (i = 0; i < multiline_offset; i++) { + eprintf (" "); + } +} + +char *tglf_extf_print_ds (struct tgl_state *TLS, void *DS, struct paramed_type *T) { + out_buf_pos = 0; + if (print_ds_type_any (DS, T) < 0) { return 0; } + return out_buf; +} |