-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathah_json_2examples_2interpret_object_8c-example.html
More file actions
257 lines (255 loc) · 32.1 KB
/
ah_json_2examples_2interpret_object_8c-example.html
File metadata and controls
257 lines (255 loc) · 32.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ah_json/examples/interpret_object.c - Eclipse Arrowhead™ Core C Libraries</title>
<script src="jquery.js"></script>
<script src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(document).ready(function() { init_search(); });
/* @license-end */
</script>
<script>
window.addEventListener("load", () => {
let contents = document.querySelector("body > div.contents");
if (!contents) {
return;
}
document.querySelectorAll("#top ul > li.current > a > span").forEach((selectedMenuItem) => {
contents.classList.add(selectedMenuItem.innerText.trim().toLowerCase().replace(/\s+/, "-"));
});
for (let i = contents.childNodes.length - 1; i >= 0; i -= 1) {
let childNode = contents.childNodes.item(i);
if ((childNode.nodeType === 3 && childNode.textContent.trim().length === 0)
|| (childNode.nodeType === 1 && childNode.classList.contains("textblock") && childNode.textContent.trim().length === 0)) {
childNode.remove();
}
}
});
</script>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="DoxygenStyle.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top">
<header>
<img alt="Logo" src="arrowhead-logo-white.svg"/>
<h1>Eclipse Arrowhead™ Core C Libraries <span class="version"></span></h1>
</header>
<!-- Generated by Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Overview</span></a></li>
<li><a href="files.html"><span>Headers</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<span id="MSearchSelect" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()"> </span>
<input type="text" id="MSearchField" value="" placeholder="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.svg" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">ah_json/examples/interpret_object.c</div></div>
</div><!--header-->
<div class="contents">
<dl class="section see"><dt>See also</dt><dd><a class="el" href="json_8h.html" title="JavaScript Object Notation (JSON) utilities.">ah_json/include/ah/json.h</a></dd></dl>
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// SPDX-License-Identifier: EPL-2.0</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// An example of how to interpret a JSON representation using our</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// ah_json_parse() function and some relevant utility functions.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include <<a class="code" href="err_8h.html" title="Error management.">ah/err.h</a>></span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include <<a class="code" href="json_8h.html" title="JavaScript Object Notation (JSON) utilities.">ah/json.h</a>></span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include <stdbool.h></span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include <stdio.h></span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include <stdlib.h></span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include <string.h></span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="keywordtype">int</span> main(<span class="keywordtype">void</span>)</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span>{</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <a class="code hl_typedef" href="defs_8h.html#a746483e29fbbad8cb71e1b3875763ae2" title="Signed integer type used to hold an error code.">ah_err_t</a> err;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> <span class="keywordtype">char</span> err_buf[128u];</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* err_ctx;</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> <span class="comment">// The JSON text we are interpreting.</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* json = <span class="stringliteral">"{\"sensor-id\":\"aa-xx-142b\",\"kelvin\":296.549988}"</span>;</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <a id="_a0" name="_a0"></a><a class="code hl_struct" href="structah__buf.html" title="Sized reference to a contiguous chunk of memory.">ah_buf_t</a> src = <a id="a1" name="a1"></a><a class="code hl_function" href="buf_8h.html#adb3218f1d3b002e2a656f833d90c6ffa" title="Creates new ah_buf from given base pointer and 32-bit size.">ah_buf_from</a>((uint8_t*) json, (uint32_t) strlen(json));</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="comment">// Parsing the JSON text populates `buf`.</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <a id="_a2" name="_a2"></a><a class="code hl_struct" href="structah__json__buf.html" title="JSON token buffer.">ah_json_buf_t</a> buf = { 0u };</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> err = <a id="a3" name="a3"></a><a class="code hl_function" href="json_8h.html#a11bc3dc5cd71f2c9fc9faeb1f53fd7a1" title="Parses src into an array of ah_json_val instances stored in dst.">ah_json_parse</a>(src, &buf);</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">if</span> (err != <a id="a4" name="a4"></a><a class="code hl_define" href="err_8h.html#af1346324d9368d43e1e103d395368306" title="No error.">AH_ENONE</a>) {</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> err_ctx = <span class="stringliteral">"ah_json_parse()"</span>;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> }</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="comment">// We use these to ensure the object we expect contains all mandatory fields.</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordtype">bool</span> has_sensor_id = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordtype">bool</span> has_kelvin = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="comment">// We use these to collect the data in the object.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keywordtype">char</span> sensor_id[16u] = { 0u };</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordtype">float</span> kelvin = -1.0f;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="comment">// We begin validation by ensuring that a root value of the object type exists in `buf`.</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keywordflow">if</span> (buf.<a id="a5" name="a5"></a><a class="code hl_variable" href="structah__json__buf.html#a525f7378174e73eee11332b798c97ab2" title="The current number of values in values.">length</a> == 0u || buf.<a id="a6" name="a6"></a><a class="code hl_variable" href="structah__json__buf.html#a6bc0aa34b1cf971d3e5a35301dbdea90" title="Pointer to the base of an array of JSON values.">values</a>[0u].<a id="a7" name="a7"></a><a class="code hl_variable" href="structah__json__val.html#a0291877eeb696a3b0c6013bbb7248a3f" title="The concrete JSON type of this value.">type</a> != AH_JSON_TYPE_OBJECT) {</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> err = <a id="a8" name="a8"></a><a class="code hl_define" href="err_8h.html#aadafdf4cd97c6a55df7d8b3eb5a9ab05" title="Invalid argument.">AH_EINVAL</a>;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> err_ctx = <span class="stringliteral">"'expecting object at root'"</span>;</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> }</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="comment">// We then iterate through the children of the object.</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1u; i < buf.<a class="code hl_variable" href="structah__json__buf.html#a525f7378174e73eee11332b798c97ab2" title="The current number of values in values.">length</a>; i += 1u) {</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <a id="_a9" name="_a9"></a><a class="code hl_struct" href="structah__json__val.html" title="JSON value, concretely represented as a token.">ah_json_val_t</a>* val = &buf.<a class="code hl_variable" href="structah__json__buf.html#a6bc0aa34b1cf971d3e5a35301dbdea90" title="Pointer to the base of an array of JSON values.">values</a>[i];</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="comment">// As long as the level is unchanged, the current value is going to be a</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="comment">// string and the next value is guaranteed to have the same level. Why?</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="comment">// Because we know that there is an object at level 0u, and objects are</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// guaranteed to always have even numbers of child values where even</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// children (beginning with the 0th child) is a key of type string.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordflow">if</span> (val-><a id="a10" name="a10"></a><a class="code hl_variable" href="structah__json__val.html#a579b9f4143ea22bfbeff76111a0bd774" title="The tree depth at which this value is located in its input string.">level</a> != 1u) {</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> }</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="comment">// Is the key string equal to "sensor-id"? If so, make sure we have not</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="comment">// seen a sensor-id before and that the next value is of type string.</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="comment">// Save that value to the `sensor_id` variable. To improve performance,</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// you may choose to use memcmp() directly instead of</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="comment">// ah_json_str_compare(). This requires the sender not to use any escape</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="comment">// sequences in this particular key, however.</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordflow">if</span> (<a id="a11" name="a11"></a><a class="code hl_function" href="json_8h.html#aa4ec74c4bcb886668e060b972eb90880" title="Compares strings a and b while taking JSON escape sequences into account.">ah_json_str_compare</a>(<span class="stringliteral">"sensor-id"</span>, 9u, val-><a id="a12" name="a12"></a><a class="code hl_variable" href="structah__json__val.html#a7a4ee078ca860bc4015ccce88023b4d1" title="Pointer to position within JSON input where the current value begins.">base</a>, val-><a id="a13" name="a13"></a><a class="code hl_variable" href="structah__json__val.html#a88411a1cf5da77e22b91cfd7309c3887" title="The length of the string referred to by base, or the number of child nodes if type is AH_JSON_TYPE_OB...">length</a>) == 0u) {</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordflow">if</span> (has_sensor_id) {</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> err = <a id="a14" name="a14"></a><a class="code hl_define" href="err_8h.html#aadc0f78f99ebe1dc466edaad402a9461" title="Duplicate exists.">AH_EDUP</a>;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> err_ctx = <span class="stringliteral">"ah_json_str_compare()"</span>;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> }</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> </div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> i += 1u;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> val = &buf.<a class="code hl_variable" href="structah__json__buf.html#a6bc0aa34b1cf971d3e5a35301dbdea90" title="Pointer to the base of an array of JSON values.">values</a>[i];</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordflow">if</span> (val-><a class="code hl_variable" href="structah__json__val.html#a0291877eeb696a3b0c6013bbb7248a3f" title="The concrete JSON type of this value.">type</a> != AH_JSON_TYPE_STRING) {</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> err = <a class="code hl_define" href="err_8h.html#aadafdf4cd97c6a55df7d8b3eb5a9ab05" title="Invalid argument.">AH_EINVAL</a>;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> err_ctx = <span class="stringliteral">"'expecting \"sensor-id\" to have string value'"</span>;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> }</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordtype">size_t</span> sensor_id_length = <span class="keyword">sizeof</span>(sensor_id);</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> err = <a id="a15" name="a15"></a><a class="code hl_function" href="json_8h.html#a31850704658f25d3879e7674aa95d6c2" title="Substitutes any JSON escape sequences in src with their UTF-8 equivalents and writes the result to ds...">ah_json_str_unescape</a>(val-><a class="code hl_variable" href="structah__json__val.html#a7a4ee078ca860bc4015ccce88023b4d1" title="Pointer to position within JSON input where the current value begins.">base</a>, val-><a class="code hl_variable" href="structah__json__val.html#a88411a1cf5da77e22b91cfd7309c3887" title="The length of the string referred to by base, or the number of child nodes if type is AH_JSON_TYPE_OB...">length</a>, sensor_id, &sensor_id_length);</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keywordflow">if</span> (err != <a class="code hl_define" href="err_8h.html#af1346324d9368d43e1e103d395368306" title="No error.">AH_ENONE</a>) {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> err_ctx = <span class="stringliteral">"ah_json_str_unescape()"</span>;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> }</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">if</span> (sensor_id_length == <span class="keyword">sizeof</span>(sensor_id)) {</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> sensor_id_length -= 1u;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> }</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> sensor_id[sensor_id_length] = <span class="charliteral">'\0'</span>;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> has_sensor_id = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> }</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="comment">// Is the key string equal to "kelvin"? If so, make sure we have not</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="comment">// seen a kelvin key before and that the next value is of type number.</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="comment">// Parse that value to the `kelvin` variable.</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="json_8h.html#aa4ec74c4bcb886668e060b972eb90880" title="Compares strings a and b while taking JSON escape sequences into account.">ah_json_str_compare</a>(<span class="stringliteral">"kelvin"</span>, 6u, val-><a class="code hl_variable" href="structah__json__val.html#a7a4ee078ca860bc4015ccce88023b4d1" title="Pointer to position within JSON input where the current value begins.">base</a>, val-><a class="code hl_variable" href="structah__json__val.html#a88411a1cf5da77e22b91cfd7309c3887" title="The length of the string referred to by base, or the number of child nodes if type is AH_JSON_TYPE_OB...">length</a>) == 0u) {</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordflow">if</span> (has_kelvin) {</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> err = <a class="code hl_define" href="err_8h.html#aadc0f78f99ebe1dc466edaad402a9461" title="Duplicate exists.">AH_EDUP</a>;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> err_ctx = <span class="stringliteral">"ah_json_str_compare()"</span>;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> i += 1u;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> </div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> val = &buf.<a class="code hl_variable" href="structah__json__buf.html#a6bc0aa34b1cf971d3e5a35301dbdea90" title="Pointer to the base of an array of JSON values.">values</a>[i];</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">if</span> (val-><a class="code hl_variable" href="structah__json__val.html#a0291877eeb696a3b0c6013bbb7248a3f" title="The concrete JSON type of this value.">type</a> != AH_JSON_TYPE_NUMBER) {</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> err = <a class="code hl_define" href="err_8h.html#aadafdf4cd97c6a55df7d8b3eb5a9ab05" title="Invalid argument.">AH_EINVAL</a>;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> err_ctx = <span class="stringliteral">"'expecting \"kelvin\" to have number value'"</span>;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> }</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> errno = 0;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> kelvin = strtof(val-><a class="code hl_variable" href="structah__json__val.html#a7a4ee078ca860bc4015ccce88023b4d1" title="Pointer to position within JSON input where the current value begins.">base</a>, NULL);</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keywordflow">if</span> (errno != 0) {</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> err = errno;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> err_ctx = <span class="stringliteral">"strtof"</span>;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> }</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> has_kelvin = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> }</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> }</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="comment">// Make sure we have seen all mandatory fields.</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> </div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keywordflow">if</span> (!has_sensor_id) {</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> err = <a class="code hl_define" href="err_8h.html#aadafdf4cd97c6a55df7d8b3eb5a9ab05" title="Invalid argument.">AH_EINVAL</a>;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> err_ctx = <span class="stringliteral">"'expecting \"sensor_id\" in object'"</span>;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> }</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">if</span> (!has_kelvin) {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> err = <a class="code hl_define" href="err_8h.html#aadafdf4cd97c6a55df7d8b3eb5a9ab05" title="Invalid argument.">AH_EINVAL</a>;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> err_ctx = <span class="stringliteral">"'expecting \"kelvin\" in object'"</span>;</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">goto</span> handle_err;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> }</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="comment">// Print the result, if everything worked out as expected.</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> printf(<span class="stringliteral">"Interpretation result:\n"</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="stringliteral">"\tsensor_id: %15s\n"</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="stringliteral">"\tkelvin: %15f\n"</span>,</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> sensor_id, kelvin);</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> </div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> exit(EXIT_SUCCESS);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span>handle_err:</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <a id="a16" name="a16"></a><a class="code hl_function" href="err_8h.html#abd464ae90e215314e9fca67df382dadd" title="Writes human-readable representation of err to buf.">ah_strerror_r</a>(err, err_buf, <span class="keyword">sizeof</span>(err_buf));</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> fprintf(stderr, <span class="stringliteral">"%s failed: %s\n"</span>, err_ctx, err_buf);</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> exit(EXIT_FAILURE);</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span>}</div>
</div><!-- fragment --> </div><!-- contents -->
<footer>Generated by <a href="https://doxygen.org">Doxygen</a> 1.9.5</footer>
</body>
</html>