typval_encode.h (5101B)
1 /// @file eval/typval_encode.h 2 /// 3 /// Contains common definitions for eval/typval_encode.c.h. Most of time should 4 /// not be included directly. 5 #pragma once 6 7 #include <assert.h> 8 #include <inttypes.h> 9 #include <stddef.h> 10 #include <string.h> 11 12 #include "klib/kvec.h" 13 #include "nvim/eval/typval_defs.h" 14 15 #include "eval/typval_encode.h.inline.generated.h" 16 17 /// Type of the stack entry 18 typedef enum { 19 kMPConvDict, ///< Convert dict_T *dictionary. 20 kMPConvList, ///< Convert list_T *list. 21 kMPConvPairs, ///< Convert mapping represented as a list_T* of pairs. 22 kMPConvPartial, ///< Convert partial_T* partial. 23 kMPConvPartialList, ///< Convert argc/argv pair coming from a partial. 24 } MPConvStackValType; 25 26 /// Stage at which partial is being converted 27 typedef enum { 28 kMPConvPartialArgs, ///< About to convert arguments. 29 kMPConvPartialSelf, ///< About to convert self dictionary. 30 kMPConvPartialEnd, ///< Already converted everything. 31 } MPConvPartialStage; 32 33 /// Structure representing current Vimscript to messagepack conversion state 34 typedef struct { 35 MPConvStackValType type; ///< Type of the stack entry. 36 typval_T *tv; ///< Currently converted typval_T. 37 int saved_copyID; ///< copyID item used to have. 38 union { 39 struct { 40 dict_T *dict; ///< Currently converted dictionary. 41 dict_T **dictp; ///< Location where that dictionary is stored. 42 ///< Normally it is &.tv->vval.v_dict, but not when 43 ///< converting partials. 44 hashitem_T *hi; ///< Currently converted dictionary item. 45 size_t todo; ///< Amount of items left to process. 46 } d; ///< State of dictionary conversion. 47 struct { 48 list_T *list; ///< Currently converted list. 49 listitem_T *li; ///< Currently converted list item. 50 } l; ///< State of list or generic mapping conversion. 51 struct { 52 MPConvPartialStage stage; ///< Stage at which partial is being converted. 53 partial_T *pt; ///< Currently converted partial. 54 } p; ///< State of partial conversion. 55 struct { 56 typval_T *arg; ///< Currently converted argument. 57 typval_T *argv; ///< Start of the argument list. 58 size_t todo; ///< Number of items left to process. 59 } a; ///< State of list or generic mapping conversion. 60 } data; ///< Data to convert. 61 } MPConvStackVal; 62 63 /// Stack used to convert Vimscript values to messagepack. 64 typedef kvec_withinit_t(MPConvStackVal, 8) MPConvStack; 65 66 /// Length of the string stored in typval_T 67 /// 68 /// @param[in] tv String for which to compute length for. Must be typval_T 69 /// with VAR_STRING. 70 /// 71 /// @return Length of the string stored in typval_T, including 0 for NULL 72 /// string. 73 static inline size_t tv_strlen(const typval_T *const tv) 74 FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT 75 FUNC_ATTR_NONNULL_ALL 76 { 77 assert(tv->v_type == VAR_STRING); 78 return (tv->vval.v_string == NULL ? 0 : strlen(tv->vval.v_string)); 79 } 80 81 /// Code for checking whether container references itself 82 /// 83 /// @param[in,out] val Container to check. 84 /// @param copyID_attr Name of the container attribute that holds copyID. 85 /// After checking whether value of this attribute is 86 /// copyID (variable) it is set to copyID. 87 /// @param[in] copyID CopyID used by the caller. 88 /// @param conv_type Type of the conversion, @see MPConvStackValType. 89 #define TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val, copyID_attr, copyID, \ 90 conv_type) \ 91 do { \ 92 const int te_csr_ret = TYPVAL_ENCODE_CHECK_SELF_REFERENCE(TYPVAL_ENCODE_FIRST_ARG_NAME, \ 93 (val), &(val)->copyID_attr, mpstack, \ 94 copyID, conv_type, objname); \ 95 if (te_csr_ret != NOTDONE) { \ 96 return te_csr_ret; \ 97 } \ 98 } while (0) 99 100 #define TYPVAL_ENCODE_FUNC_NAME_INNER_2(pref, name, suf) \ 101 pref##name##suf 102 #define TYPVAL_ENCODE_FUNC_NAME_INNER(pref, name, suf) \ 103 TYPVAL_ENCODE_FUNC_NAME_INNER_2(pref, name, suf) 104 105 /// Construct function name, possibly using macros 106 /// 107 /// Is used to expand macros that may appear in arguments. 108 /// 109 /// @note Expands all arguments, even if only one is needed. 110 /// 111 /// @param[in] pref Prefix. 112 /// @param[in] suf Suffix. 113 /// 114 /// @return Concat: pref + #TYPVAL_ENCODE_NAME + suf. 115 #define TYPVAL_ENCODE_FUNC_NAME(pref, suf) \ 116 TYPVAL_ENCODE_FUNC_NAME_INNER(pref, TYPVAL_ENCODE_NAME, suf) 117 118 /// Self reference checker function name 119 #define TYPVAL_ENCODE_CHECK_SELF_REFERENCE \ 120 TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _check_self_reference) 121 122 /// Entry point function name 123 #define TYPVAL_ENCODE_ENCODE \ 124 TYPVAL_ENCODE_FUNC_NAME(encode_vim_to_, ) 125 126 /// Name of the …convert_one_value function 127 #define TYPVAL_ENCODE_CONVERT_ONE_VALUE \ 128 TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _convert_one_value) 129 130 /// Name of the dummy const dict_T *const variable 131 #define TYPVAL_ENCODE_NODICT_VAR \ 132 TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _nodict_var)