summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdemangle/common/rust.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdemangle/common/rust.h')
-rw-r--r--usr/src/lib/libdemangle/common/rust.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/usr/src/lib/libdemangle/common/rust.h b/usr/src/lib/libdemangle/common/rust.h
new file mode 100644
index 0000000000..fbe609ab9d
--- /dev/null
+++ b/usr/src/lib/libdemangle/common/rust.h
@@ -0,0 +1,87 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2019 Joyent, Inc.
+ * Copyright 2021 Jason King
+ */
+
+#ifndef _RUST_H
+#define _RUST_H
+
+#include <errno.h>
+#include <sys/types.h>
+#include "demangle-sys.h"
+#include "demangle_int.h"
+#include "strview.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum rustenc_version {
+ RUSTENC_LEGACY = -1,
+ RUSTENC_V0 = 0
+} rustenc_version_t;
+
+typedef struct rust_state {
+ const char *rs_str; /* The original string */
+ custr_t *rs_demangled;
+ sysdem_ops_t *rs_ops;
+ custr_alloc_t rs_cualloc;
+ strview_t rs_orig; /* strview of original string, sans prefix */
+ int rs_error;
+ rustenc_version_t rs_encver;
+ uint64_t rs_lt_depth;
+ boolean_t rs_skip;
+ boolean_t rs_args_stay_open;
+ boolean_t rs_args_is_open;
+ boolean_t rs_verbose;
+ boolean_t rs_show_const_type;
+ boolean_t rs_isutf8;
+} rust_state_t;
+#define HAS_ERROR(_st) ((_st)->rs_error != 0)
+#define SET_ERROR(_st) ((_st)->rs_error = errno)
+
+/*
+ * In certain circumstances, we need to parse an item, but not emit any
+ * output. These macros assist in that. To use:
+ *
+ * rust_state_t *st;
+ * boolean_t saved_state;
+ * ...
+ * SKIP_BEGIN(st, saved_state);
+ * ... stuff to no emit
+ * SKIP_END(st, saved_state);
+ */
+#define SKIP_BEGIN(_st, _save) \
+ (_save) = (_st)->rs_skip, \
+ (_st)->rs_skip = B_TRUE
+#define SKIP_END(_st, _n) (_st)->rs_skip = (_n)
+
+boolean_t rust_appendc(rust_state_t *, char);
+boolean_t rust_append(rust_state_t *, const char *);
+boolean_t rust_append_printf(rust_state_t *, const char *, ...) __PRINTFLIKE(2);
+boolean_t rust_append_sv(rust_state_t *restrict, uint64_t, strview_t *restrict);
+boolean_t rust_append_utf8_c(rust_state_t *, uint32_t);
+boolean_t rust_parse_base10(rust_state_t *restrict, strview_t *restrict,
+ uint64_t *restrict);
+boolean_t rust_demangle_legacy(rust_state_t *restrict, strview_t *restrict);
+boolean_t rust_demangle_v0(rust_state_t *restrict, strview_t *restrict);
+
+boolean_t rustv0_puny_decode(rust_state_t *restrict, strview_t *restrict,
+ boolean_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RUST_H */