1 #pragma once
2 
3 #include "bej_common.h"
4 
5 #include <stdint.h>
6 
7 #ifdef __cplusplus
8 extern "C"
9 {
10 #endif
11 
12 /**
13  * @brief Mask for the type of the dictionary within a bejTupleS.
14  */
15 #define DICTIONARY_TYPE_MASK 0x01
16 
17 /**
18  * @brief Number of bits needed to shift to get the sequence number from a
19  * bejTupleS nnint value.
20  */
21 #define DICTIONARY_SEQ_NUM_SHIFT 1
22 
23 /**
24  * @brief BEJ dictionary type.
25  */
26 enum BejDictionaryType
27 {
28     bejPrimary = 0,
29     bejAnnotation = 1,
30 };
31 
32 /**
33  * @brief Dictionary property header.
34  */
35 struct BejDictionaryProperty
36 {
37     struct BejTupleF format;
38     uint16_t sequenceNumber;
39     uint16_t childPointerOffset;
40     uint16_t childCount;
41     uint8_t nameLength;
42     uint16_t nameOffset;
43 } __attribute__((__packed__));
44 
45 struct BejDictionaryHeader
46 {
47     uint8_t versionTag;
48     uint8_t truncationFlag:1;
49     uint8_t reservedFlags:7;
50     uint16_t entryCount;
51     uint32_t schemaVersion;
52     uint32_t dictionarySize;
53 } __attribute__((__packed__));
54 
55 /**
56  * @brief Get the offset of the first property in a dictionary.
57  *
58  * @return the offset to the first property.
59  */
60 uint16_t bejDictGetPropertyHeadOffset();
61 
62 /**
63  * @brief Get the offset of the first annotated property in an annoation
64  * dictionary.
65  *
66  * @return the offset to the first annotated property in an annoation
67  * dictionary.
68  */
69 uint16_t bejDictGetFirstAnnotatedPropertyOffset();
70 
71 /**
72  * @brief Get the property related to the given sequence number.
73  *
74  * @param[in] dictionary - dictionary containing the sequence number.
75  * @param[in] startingPropertyOffset - offset of the starting property for
76  * the search.
77  * @param[in] sequenceNumber - sequence number of the property.
78  * @param[out] property - if the search is successful, this will point to a
79  * valid property.
80  * @return 0 if successful.
81  */
82 int bejDictGetProperty(const uint8_t* dictionary,
83                        uint16_t startingPropertyOffset, uint16_t sequenceNumber,
84                        const struct BejDictionaryProperty** property);
85 
86 /**
87  * @brief Get the name of a property.
88  *
89  * @param[in] dictionary - dictionary containing the property.
90  * @param[in] nameOffset - dictionary offset of the name.
91  * @param[in] nameLength - length of the name.
92  * @return a NULL terminated string. If the nameLength is 0, this will
93  * return an empty string.
94  */
95 const char* bejDictGetPropertyName(const uint8_t* dictionary,
96                                    uint16_t nameOffset, uint8_t nameLength);
97 
98 /**
99  * @brief Get the property related to the given property name.
100  *
101  * @param[in] dictionary - dictionary containing the property.
102  * @param[in] startingPropertyOffset - offset of the starting property for
103  * the search.
104  * @param[in] propertyName - name of the searched property.
105  * @param[out] property - if the search is successful, this will point to a
106  * valid property.
107  * @param[out] propertyOffset - if the search is successful, this will point
108  * to the offset of the property within the dictionary. Can provide a NULL
109  * pointer if this is not needed.
110  * @return 0 if successful.
111  */
112 int bejDictGetPropertyByName(
113     const uint8_t* dictionary, uint16_t startingPropertyOffset,
114     const char* propertyName, const struct BejDictionaryProperty** property,
115     uint16_t* propertyOffset);
116 
117 #ifdef __cplusplus
118 }
119 #endif
120