librdesc
Loading...
Searching...
No Matches
cst_macros.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Metehan Selvi <me@metehanselvi.com>
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4
18#ifndef RDESC_CST_MACROS_H
19#define RDESC_CST_MACROS_H
20
21#include "detail.h" // IWYU pragma: export (for _rdesc_priv_node_deref)
22
23#include <stddef.h>
24
25struct rdesc; /* defined in rdesc.h */
26
27
29#define _rdesc_priv_node_deref(node) (*(struct _rdesc_priv_node *) (node))
30
31/* Returns index of parent of the node, or `SIZE_MAX` if the node is root. */
32#define _rdesc_priv_parent_idx(node) _rdesc_priv_node_deref(node).parent
33
34/* Returns index of the child in stack. */
35#define _rdesc_priv_child_idx(nt_node, child_index) \
36 (*(size_t *) (&((uint8_t *) ((struct _rdesc_priv_node *) nt_node + 1)) \
37 [(child_index) * sizeof(size_t)]))
38
39#ifdef __cplusplus
40extern "C"
41#endif
42struct rdesc_node *_rdesc_priv_cst_illegal_access(const struct rdesc *parser,
43 size_t index);
47#endif
48
49
50#ifndef RDESC_CST_MACROS
52#define RDESC_CST_MACROS
56#define rparent(p, node) \
57 _rdesc_priv_cst_illegal_access(p, _rdesc_priv_parent_idx(node))
58
61#define rtype(node) _rdesc_priv_node_deref(node).n.ty
62
64#define rid(node) _rdesc_priv_node_deref(node).n.nt.id
65
67#define ralt_idx(nt_node) \
68 _rdesc_priv_node_deref(nt_node).n.nt.alt_idx
69
75#define ralt_id(nt_node) ralt_idx(nt_node)
76
78#define rseminfo(tk_node) \
79 ((void *) &_rdesc_priv_node_deref(tk_node).n.tk.seminfo)
80
82#define rchild_count(nt_node) \
83 _rdesc_priv_node_deref(nt_node).n.nt.child_count
84
86#define rchild(p, nt_node, child_idx) \
87 _rdesc_priv_cst_illegal_access(p, _rdesc_priv_child_idx(nt_node, child_idx))
88
89#else
90#undef RDESC_CST_MACROS
91
92#undef rparent
93
94#undef rtype
95
96#undef rid
97
98#undef rseminfo
99
100#undef ralt_idx
101
102#undef ralt_id
103
104#undef rchild_count
105
106#undef rchild
107
108#endif
Recursive descent parser state.
Definition rdesc.h:42