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