1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2017 Jason King 14 */ 15 16 #ifndef _CPP_H 17 #define _CPP_H 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 #include <stdio.h> 24 #include "sysdemangle.h" 25 #include "str.h" 26 27 typedef struct name_s { 28 str_pair_t *nm_items; 29 sysdem_ops_t *nm_ops; 30 size_t nm_len; 31 size_t nm_size; 32 } name_t; 33 34 extern size_t cpp_name_max_depth; 35 36 void name_clear(name_t *); 37 void name_init(name_t *, sysdem_ops_t *); 38 void name_fini(name_t *); 39 size_t name_len(const name_t *); 40 boolean_t name_empty(const name_t *); 41 boolean_t name_add(name_t *, const char *, size_t, const char *, size_t); 42 boolean_t name_add_str(name_t *, str_t *, str_t *); 43 boolean_t name_join(name_t *, size_t, const char *); 44 boolean_t name_fmt(name_t *, const char *, const char *); 45 str_pair_t *name_at(const name_t *, size_t); 46 str_pair_t *name_top(name_t *); 47 void name_pop(name_t *, str_pair_t *); 48 49 typedef struct sub_s { 50 name_t *sub_items; 51 sysdem_ops_t *sub_ops; 52 size_t sub_len; 53 size_t sub_size; 54 } sub_t; 55 56 void sub_clear(sub_t *); 57 void sub_init(sub_t *, sysdem_ops_t *); 58 void sub_fini(sub_t *); 59 void sub_pop(sub_t *); 60 boolean_t sub_save(sub_t *, const name_t *, size_t); 61 boolean_t sub_substitute(const sub_t *, size_t, name_t *); 62 boolean_t sub_empty(const sub_t *); 63 size_t sub_len(const sub_t *); 64 65 typedef struct templ_s { 66 sub_t *tpl_items; 67 sysdem_ops_t *tpl_ops; 68 size_t tpl_len; 69 size_t tpl_size; 70 } templ_t; 71 72 void templ_init(templ_t *, sysdem_ops_t *); 73 void templ_fini(templ_t *); 74 boolean_t templ_empty(const templ_t *); 75 size_t templ_top_len(const templ_t *); 76 boolean_t templ_sub(const templ_t *, size_t, name_t *); 77 boolean_t templ_save(const name_t *, size_t, templ_t *); 78 79 boolean_t templ_push(templ_t *); 80 void templ_pop(templ_t *); 81 sub_t *templ_top(templ_t *); 82 83 #ifdef __cplusplus 84 } 85 #endif 86 87 #endif /* _CPP_H */