summaryrefslogtreecommitdiff
path: root/deps/jemalloc/include/jemalloc/internal/emitter.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/jemalloc/include/jemalloc/internal/emitter.h')
-rw-r--r--deps/jemalloc/include/jemalloc/internal/emitter.h435
1 files changed, 0 insertions, 435 deletions
diff --git a/deps/jemalloc/include/jemalloc/internal/emitter.h b/deps/jemalloc/include/jemalloc/internal/emitter.h
deleted file mode 100644
index 3a2b2f7f2..000000000
--- a/deps/jemalloc/include/jemalloc/internal/emitter.h
+++ /dev/null
@@ -1,435 +0,0 @@
-#ifndef JEMALLOC_INTERNAL_EMITTER_H
-#define JEMALLOC_INTERNAL_EMITTER_H
-
-#include "jemalloc/internal/ql.h"
-
-typedef enum emitter_output_e emitter_output_t;
-enum emitter_output_e {
- emitter_output_json,
- emitter_output_table
-};
-
-typedef enum emitter_justify_e emitter_justify_t;
-enum emitter_justify_e {
- emitter_justify_left,
- emitter_justify_right,
- /* Not for users; just to pass to internal functions. */
- emitter_justify_none
-};
-
-typedef enum emitter_type_e emitter_type_t;
-enum emitter_type_e {
- emitter_type_bool,
- emitter_type_int,
- emitter_type_unsigned,
- emitter_type_uint32,
- emitter_type_uint64,
- emitter_type_size,
- emitter_type_ssize,
- emitter_type_string,
- /*
- * A title is a column title in a table; it's just a string, but it's
- * not quoted.
- */
- emitter_type_title,
-};
-
-typedef struct emitter_col_s emitter_col_t;
-struct emitter_col_s {
- /* Filled in by the user. */
- emitter_justify_t justify;
- int width;
- emitter_type_t type;
- union {
- bool bool_val;
- int int_val;
- unsigned unsigned_val;
- uint32_t uint32_val;
- uint64_t uint64_val;
- size_t size_val;
- ssize_t ssize_val;
- const char *str_val;
- };
-
- /* Filled in by initialization. */
- ql_elm(emitter_col_t) link;
-};
-
-typedef struct emitter_row_s emitter_row_t;
-struct emitter_row_s {
- ql_head(emitter_col_t) cols;
-};
-
-static inline void
-emitter_row_init(emitter_row_t *row) {
- ql_new(&row->cols);
-}
-
-static inline void
-emitter_col_init(emitter_col_t *col, emitter_row_t *row) {
- ql_elm_new(col, link);
- ql_tail_insert(&row->cols, col, link);
-}
-
-typedef struct emitter_s emitter_t;
-struct emitter_s {
- emitter_output_t output;
- /* The output information. */
- void (*write_cb)(void *, const char *);
- void *cbopaque;
- int nesting_depth;
- /* True if we've already emitted a value at the given depth. */
- bool item_at_depth;
-};
-
-static inline void
-emitter_init(emitter_t *emitter, emitter_output_t emitter_output,
- void (*write_cb)(void *, const char *), void *cbopaque) {
- emitter->output = emitter_output;
- emitter->write_cb = write_cb;
- emitter->cbopaque = cbopaque;
- emitter->item_at_depth = false;
- emitter->nesting_depth = 0;
-}
-
-/* Internal convenience function. Write to the emitter the given string. */
-JEMALLOC_FORMAT_PRINTF(2, 3)
-static inline void
-emitter_printf(emitter_t *emitter, const char *format, ...) {
- va_list ap;
-
- va_start(ap, format);
- malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap);
- va_end(ap);
-}
-
-/* Write to the emitter the given string, but only in table mode. */
-JEMALLOC_FORMAT_PRINTF(2, 3)
-static inline void
-emitter_table_printf(emitter_t *emitter, const char *format, ...) {
- if (emitter->output == emitter_output_table) {
- va_list ap;
- va_start(ap, format);
- malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap);
- va_end(ap);
- }
-}
-
-static inline void
-emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier,
- emitter_justify_t justify, int width) {
- size_t written;
- if (justify == emitter_justify_none) {
- written = malloc_snprintf(out_fmt, out_size,
- "%%%s", fmt_specifier);
- } else if (justify == emitter_justify_left) {
- written = malloc_snprintf(out_fmt, out_size,
- "%%-%d%s", width, fmt_specifier);
- } else {
- written = malloc_snprintf(out_fmt, out_size,
- "%%%d%s", width, fmt_specifier);
- }
- /* Only happens in case of bad format string, which *we* choose. */
- assert(written < out_size);
-}
-
-/*
- * Internal. Emit the given value type in the relevant encoding (so that the
- * bool true gets mapped to json "true", but the string "true" gets mapped to
- * json "\"true\"", for instance.
- *
- * Width is ignored if justify is emitter_justify_none.
- */
-static inline void
-emitter_print_value(emitter_t *emitter, emitter_justify_t justify, int width,
- emitter_type_t value_type, const void *value) {
- size_t str_written;
-#define BUF_SIZE 256
-#define FMT_SIZE 10
- /*
- * We dynamically generate a format string to emit, to let us use the
- * snprintf machinery. This is kinda hacky, but gets the job done
- * quickly without having to think about the various snprintf edge
- * cases.
- */
- char fmt[FMT_SIZE];
- char buf[BUF_SIZE];
-
-#define EMIT_SIMPLE(type, format) \
- emitter_gen_fmt(fmt, FMT_SIZE, format, justify, width); \
- emitter_printf(emitter, fmt, *(const type *)value); \
-
- switch (value_type) {
- case emitter_type_bool:
- emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width);
- emitter_printf(emitter, fmt, *(const bool *)value ?
- "true" : "false");
- break;
- case emitter_type_int:
- EMIT_SIMPLE(int, "d")
- break;
- case emitter_type_unsigned:
- EMIT_SIMPLE(unsigned, "u")
- break;
- case emitter_type_ssize:
- EMIT_SIMPLE(ssize_t, "zd")
- break;
- case emitter_type_size:
- EMIT_SIMPLE(size_t, "zu")
- break;
- case emitter_type_string:
- str_written = malloc_snprintf(buf, BUF_SIZE, "\"%s\"",
- *(const char *const *)value);
- /*
- * We control the strings we output; we shouldn't get anything
- * anywhere near the fmt size.
- */
- assert(str_written < BUF_SIZE);
- emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width);
- emitter_printf(emitter, fmt, buf);
- break;
- case emitter_type_uint32:
- EMIT_SIMPLE(uint32_t, FMTu32)
- break;
- case emitter_type_uint64:
- EMIT_SIMPLE(uint64_t, FMTu64)
- break;
- case emitter_type_title:
- EMIT_SIMPLE(char *const, "s");
- break;
- default:
- unreachable();
- }
-#undef BUF_SIZE
-#undef FMT_SIZE
-}
-
-
-/* Internal functions. In json mode, tracks nesting state. */
-static inline void
-emitter_nest_inc(emitter_t *emitter) {
- emitter->nesting_depth++;
- emitter->item_at_depth = false;
-}
-
-static inline void
-emitter_nest_dec(emitter_t *emitter) {
- emitter->nesting_depth--;
- emitter->item_at_depth = true;
-}
-
-static inline void
-emitter_indent(emitter_t *emitter) {
- int amount = emitter->nesting_depth;
- const char *indent_str;
- if (emitter->output == emitter_output_json) {
- indent_str = "\t";
- } else {
- amount *= 2;
- indent_str = " ";
- }
- for (int i = 0; i < amount; i++) {
- emitter_printf(emitter, "%s", indent_str);
- }
-}
-
-static inline void
-emitter_json_key_prefix(emitter_t *emitter) {
- emitter_printf(emitter, "%s\n", emitter->item_at_depth ? "," : "");
- emitter_indent(emitter);
-}
-
-static inline void
-emitter_begin(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth == 0);
- emitter_printf(emitter, "{");
- emitter_nest_inc(emitter);
- } else {
- // tabular init
- emitter_printf(emitter, "%s", "");
- }
-}
-
-static inline void
-emitter_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth == 1);
- emitter_nest_dec(emitter);
- emitter_printf(emitter, "\n}\n");
- }
-}
-
-/*
- * Note emits a different kv pair as well, but only in table mode. Omits the
- * note if table_note_key is NULL.
- */
-static inline void
-emitter_kv_note(emitter_t *emitter, const char *json_key, const char *table_key,
- emitter_type_t value_type, const void *value,
- const char *table_note_key, emitter_type_t table_note_value_type,
- const void *table_note_value) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth > 0);
- emitter_json_key_prefix(emitter);
- emitter_printf(emitter, "\"%s\": ", json_key);
- emitter_print_value(emitter, emitter_justify_none, -1,
- value_type, value);
- } else {
- emitter_indent(emitter);
- emitter_printf(emitter, "%s: ", table_key);
- emitter_print_value(emitter, emitter_justify_none, -1,
- value_type, value);
- if (table_note_key != NULL) {
- emitter_printf(emitter, " (%s: ", table_note_key);
- emitter_print_value(emitter, emitter_justify_none, -1,
- table_note_value_type, table_note_value);
- emitter_printf(emitter, ")");
- }
- emitter_printf(emitter, "\n");
- }
- emitter->item_at_depth = true;
-}
-
-static inline void
-emitter_kv(emitter_t *emitter, const char *json_key, const char *table_key,
- emitter_type_t value_type, const void *value) {
- emitter_kv_note(emitter, json_key, table_key, value_type, value, NULL,
- emitter_type_bool, NULL);
-}
-
-static inline void
-emitter_json_kv(emitter_t *emitter, const char *json_key,
- emitter_type_t value_type, const void *value) {
- if (emitter->output == emitter_output_json) {
- emitter_kv(emitter, json_key, NULL, value_type, value);
- }
-}
-
-static inline void
-emitter_table_kv(emitter_t *emitter, const char *table_key,
- emitter_type_t value_type, const void *value) {
- if (emitter->output == emitter_output_table) {
- emitter_kv(emitter, NULL, table_key, value_type, value);
- }
-}
-
-static inline void
-emitter_dict_begin(emitter_t *emitter, const char *json_key,
- const char *table_header) {
- if (emitter->output == emitter_output_json) {
- emitter_json_key_prefix(emitter);
- emitter_printf(emitter, "\"%s\": {", json_key);
- emitter_nest_inc(emitter);
- } else {
- emitter_indent(emitter);
- emitter_printf(emitter, "%s\n", table_header);
- emitter_nest_inc(emitter);
- }
-}
-
-static inline void
-emitter_dict_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth > 0);
- emitter_nest_dec(emitter);
- emitter_printf(emitter, "\n");
- emitter_indent(emitter);
- emitter_printf(emitter, "}");
- } else {
- emitter_nest_dec(emitter);
- }
-}
-
-static inline void
-emitter_json_dict_begin(emitter_t *emitter, const char *json_key) {
- if (emitter->output == emitter_output_json) {
- emitter_dict_begin(emitter, json_key, NULL);
- }
-}
-
-static inline void
-emitter_json_dict_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- emitter_dict_end(emitter);
- }
-}
-
-static inline void
-emitter_table_dict_begin(emitter_t *emitter, const char *table_key) {
- if (emitter->output == emitter_output_table) {
- emitter_dict_begin(emitter, NULL, table_key);
- }
-}
-
-static inline void
-emitter_table_dict_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_table) {
- emitter_dict_end(emitter);
- }
-}
-
-static inline void
-emitter_json_arr_begin(emitter_t *emitter, const char *json_key) {
- if (emitter->output == emitter_output_json) {
- emitter_json_key_prefix(emitter);
- emitter_printf(emitter, "\"%s\": [", json_key);
- emitter_nest_inc(emitter);
- }
-}
-
-static inline void
-emitter_json_arr_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth > 0);
- emitter_nest_dec(emitter);
- emitter_printf(emitter, "\n");
- emitter_indent(emitter);
- emitter_printf(emitter, "]");
- }
-}
-
-static inline void
-emitter_json_arr_obj_begin(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- emitter_json_key_prefix(emitter);
- emitter_printf(emitter, "{");
- emitter_nest_inc(emitter);
- }
-}
-
-static inline void
-emitter_json_arr_obj_end(emitter_t *emitter) {
- if (emitter->output == emitter_output_json) {
- assert(emitter->nesting_depth > 0);
- emitter_nest_dec(emitter);
- emitter_printf(emitter, "\n");
- emitter_indent(emitter);
- emitter_printf(emitter, "}");
- }
-}
-
-static inline void
-emitter_json_arr_value(emitter_t *emitter, emitter_type_t value_type,
- const void *value) {
- if (emitter->output == emitter_output_json) {
- emitter_json_key_prefix(emitter);
- emitter_print_value(emitter, emitter_justify_none, -1,
- value_type, value);
- }
-}
-
-static inline void
-emitter_table_row(emitter_t *emitter, emitter_row_t *row) {
- if (emitter->output != emitter_output_table) {
- return;
- }
- emitter_col_t *col;
- ql_foreach(col, &row->cols, link) {
- emitter_print_value(emitter, col->justify, col->width,
- col->type, (const void *)&col->bool_val);
- }
- emitter_table_printf(emitter, "\n");
-}
-
-#endif /* JEMALLOC_INTERNAL_EMITTER_H */