1 /*******************************************************************************
2 *
3 * HEADER: member.h
4 *
5 ********************************************************************************
6 *
7 * DESCRIPTION: C::B::C struct member utilities
8 *
9 ********************************************************************************
10 *
11 * Copyright (c) 2002-2020 Marcus Holland-Moritz. All rights reserved.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the same terms as Perl itself.
14 *
15 *******************************************************************************/
16 
17 #ifndef _CBC_MEMBER_H
18 #define _CBC_MEMBER_H
19 
20 /*===== GLOBAL INCLUDES ======================================================*/
21 
22 
23 /*===== LOCAL INCLUDES =======================================================*/
24 
25 #include "util/list.h"
26 #include "util/hash.h"
27 #include "ctlib/cttype.h"
28 
29 
30 /*===== DEFINES ==============================================================*/
31 
32 #define CBC_GM_ACCEPT_DOTLESS_MEMBER         0x00000001U
33 #define CBC_GM_DONT_CROAK                    0x00000002U
34 #define CBC_GM_NO_OFFSET_SIZE_CALC           0x00000004U
35 #define CBC_GM_REJECT_OUT_OF_BOUNDS_INDEX    0x00000008U
36 #define CBC_GM_REJECT_OFFSET                 0x00000010U
37 
38 /*===== TYPEDEFS =============================================================*/
39 
40 typedef struct {
41   LinkedList hit, off, pad;
42   HashTable  htpad;
43 } GMSInfo;
44 
45 typedef struct {
46   TypeSpec    type;
47   Struct     *parent;
48   Declarator *pDecl;
49   int         level;
50   int         offset;
51   unsigned    size;
52   u_32        flags;
53 } MemberInfo;
54 
55 struct me_walk_info
56 {
57   enum me_walk_rv
58   {
59     MERV_COMPOUND_MEMBER,
60     MERV_ARRAY_INDEX,
61     MERV_OFFSET,
62     MERV_ERR_INVALID_MEMBER_START,
63     MERV_ERR_INVALID_INDEX,
64     MERV_ERR_INVALID_CHAR,
65     MERV_ERR_INDEX_NOT_TERMINATED,
66     MERV_ERR_INCOMPLETE,
67     MERV_ERR_TERMINATED,
68     MERV_END
69   } retval;
70 
71   union
72   {
73     struct {
74       const char *name;
75       size_t name_length;
76       unsigned has_dot : 1;
77     } compound_member;
78     int array_index;
79     int offset;
80     char invalid_char;
81   } u;
82 };
83 
84 typedef struct member_expr *MemberExprWalker;
85 
86 
87 /*===== FUNCTION PROTOTYPES ==================================================*/
88 
89 #define get_all_member_strings CBC_get_all_member_strings
90 int get_all_member_strings(pTHX_ MemberInfo *pMI, LinkedList list);
91 
92 #define get_member_string CBC_get_member_string
93 SV *get_member_string(pTHX_ const MemberInfo *pMI, int offset, GMSInfo *pInfo);
94 
95 #define get_member CBC_get_member
96 int get_member(pTHX_ const MemberInfo *pMI, const char *member,
97                MemberInfo *pMIout, unsigned gm_flags);
98 
99 #define member_expr_walker_new CBC_member_expr_walker_new
100 MemberExprWalker member_expr_walker_new(pTHX_ const char *expr, size_t len);
101 
102 #define member_expr_walker_retval_string CBC_member_expr_walker_retval_string
103 const char *member_expr_walker_retval_string(enum me_walk_rv retval);
104 
105 #define member_expr_walker_walk CBC_member_expr_walker_walk
106 void member_expr_walker_walk(pTHX_ MemberExprWalker me, struct me_walk_info *info);
107 
108 #define member_expr_walker_delete CBC_member_expr_walker_delete
109 void member_expr_walker_delete(pTHX_ MemberExprWalker me);
110 
111 #endif
112