1111struct  parser_context  {
1212	cbor_reader_t  * reader ;
1313
14- 	cbor_item_t  * items ;
15- 	size_t  itemidx ;
16- 	size_t  maxitems ;
17- 
1814	uint8_t  major_type ;
1915	uint8_t  additional_info ;
2016	uint8_t  following_bytes ;
@@ -93,8 +89,9 @@ static cbor_error_t parse(struct parser_context *ctx, size_t maxitems)
9389		return  CBOR_EXCESSIVE ;
9490	}
9591
96- 	for  (size_t  i  =  0 ; i  <  maxitems  &&  ctx -> itemidx  <  ctx -> maxitems 
97- 			&&  ctx -> reader -> msgidx  <  ctx -> reader -> msgsize ; i ++ ) {
92+ 	for  (size_t  i  =  0 ; i  <  maxitems  && 
93+ 			ctx -> reader -> itemidx  <  ctx -> reader -> maxitems  && 
94+ 			ctx -> reader -> msgidx  <  ctx -> reader -> msgsize ; i ++ ) {
9895		uint8_t  val  =  ctx -> reader -> msg [ctx -> reader -> msgidx ];
9996		ctx -> major_type  =  get_cbor_major_type (val );
10097		ctx -> additional_info  =  get_cbor_additional_info (val );
@@ -131,44 +128,44 @@ static cbor_error_t do_integer(struct parser_context *ctx)
131128		return  CBOR_ILLEGAL ;
132129	}
133130
134- 	cbor_item_t  * item  =  & ctx -> items [ctx -> itemidx ];
131+ 	cbor_item_t  * item  =  & ctx -> reader -> items [ctx -> reader -> itemidx ];
135132	item -> type  =  CBOR_ITEM_INTEGER ;
136133	item -> size  =  (size_t )ctx -> following_bytes ;
137134	item -> offset  =  ctx -> reader -> msgidx ;
138135
139136	ctx -> reader -> msgidx  +=  (size_t )(ctx -> following_bytes  +  1 );
140- 	ctx -> itemidx ++ ;
137+ 	ctx -> reader -> itemidx ++ ;
141138
142139	return  CBOR_SUCCESS ;
143140}
144141
145142static  cbor_error_t  do_string (struct  parser_context  * ctx )
146143{
147- 	cbor_item_t  * item  =  & ctx -> items [ctx -> itemidx ];
144+ 	cbor_item_t  * item  =  & ctx -> reader -> items [ctx -> reader -> itemidx ];
148145	size_t  len  =  go_get_item_length (ctx );
149146
150147	item -> type  =  CBOR_ITEM_STRING ;
151148	item -> size  =  len ;
152149	item -> offset  =  ctx -> reader -> msgidx ;
153150
154151	if  (len  ==  (size_t )CBOR_INDEFINITE_VALUE ) {
155- 		ctx -> itemidx ++ ;
156- 		return  parse (ctx , ctx -> maxitems  -  ctx -> itemidx );
152+ 		ctx -> reader -> itemidx ++ ;
153+ 		return  parse (ctx , ctx -> reader -> maxitems  -  ctx -> reader -> itemidx );
157154	}
158155	if  (len  >  ctx -> reader -> msgsize  -  ctx -> reader -> msgidx ) {
159156		return  CBOR_ILLEGAL ;
160157	}
161158
162159	ctx -> reader -> msgidx  +=  len ;
163- 	ctx -> itemidx ++ ;
160+ 	ctx -> reader -> itemidx ++ ;
164161
165162	return  CBOR_SUCCESS ;
166163}
167164
168165static  cbor_error_t  do_recursive (struct  parser_context  * ctx )
169166{
170- 	size_t  current_item_index  =  ctx -> itemidx ;
171- 	cbor_item_t  * item  =  & ctx -> items [current_item_index ];
167+ 	size_t  current_item_index  =  ctx -> reader -> itemidx ;
168+ 	cbor_item_t  * item  =  & ctx -> reader -> items [current_item_index ];
172169	size_t  len  =  go_get_item_length (ctx );
173170
174171	item -> type  =  (cbor_item_data_t )(ctx -> major_type  -  1 );
@@ -179,9 +176,9 @@ static cbor_error_t do_recursive(struct parser_context *ctx)
179176		return  CBOR_ILLEGAL ;
180177	}
181178
182- 	ctx -> itemidx ++ ;
179+ 	ctx -> reader -> itemidx ++ ;
183180
184- 	return  parse (ctx , MIN (len , ctx -> maxitems  -  ctx -> itemidx ));
181+ 	return  parse (ctx , MIN (len , ctx -> reader -> maxitems  -  ctx -> reader -> itemidx ));
185182}
186183
187184/* TODO: Implement tag */ 
@@ -193,7 +190,7 @@ static cbor_error_t do_tag(struct parser_context *ctx)
193190
194191static  cbor_error_t  do_float_and_other (struct  parser_context  * ctx )
195192{
196- 	cbor_item_t  * item  =  & ctx -> items [ctx -> itemidx ];
193+ 	cbor_item_t  * item  =  & ctx -> reader -> items [ctx -> reader -> itemidx ];
197194	cbor_error_t  err  =  CBOR_SUCCESS ;
198195
199196	item -> type  =  CBOR_ITEM_FLOAT ;
@@ -202,7 +199,7 @@ static cbor_error_t do_float_and_other(struct parser_context *ctx)
202199
203200	if  (ctx -> following_bytes  ==  (uint8_t )CBOR_INDEFINITE_VALUE ) {
204201		ctx -> reader -> msgidx ++ ;
205- 		ctx -> itemidx ++ ;
202+ 		ctx -> reader -> itemidx ++ ;
206203		return  CBOR_BREAK ;
207204	} else  if  (!has_valid_following_bytes (ctx , & err )) {
208205		return  err ;
@@ -211,29 +208,33 @@ static cbor_error_t do_float_and_other(struct parser_context *ctx)
211208	}
212209
213210	ctx -> reader -> msgidx  +=  item -> size  +  1 ;
214- 	ctx -> itemidx ++ ;
211+ 	ctx -> reader -> itemidx ++ ;
215212
216213	return  err ;
217214}
218215
219- cbor_error_t  cbor_parse (cbor_reader_t  * reader ,
220- 		cbor_item_t   * items ,  size_t  maxitems ,  size_t   * items_parsed )
216+ cbor_error_t  cbor_parse (cbor_reader_t  * reader ,  void   const   * msg ,  size_t   msgsize , 
217+ 		size_t  * nitems_parsed )
221218{
219+ 	assert (reader -> items  !=  NULL );
220+ 	reader -> itemidx  =  0 ;
221+ 
222+ 	reader -> msg  =  (uint8_t  const  * )msg ;
223+ 	reader -> msgsize  =  msgsize ;
224+ 	reader -> msgidx  =  0 ;
225+ 
222226	struct  parser_context  ctx  =  {
223227		.reader  =  reader ,
224- 		.items  =  items ,
225- 		.itemidx  =  0 ,
226- 		.maxitems  =  maxitems ,
227228	};
228229
229- 	cbor_error_t  err  =  parse (& ctx , maxitems );
230+ 	cbor_error_t  err  =  parse (& ctx , reader -> maxitems );
230231
231232	if  (err  ==  CBOR_SUCCESS  &&  reader -> msgidx  <  reader -> msgsize ) {
232233		err  =  CBOR_OVERRUN ;
233234	}
234235
235- 	if  (items_parsed  !=  NULL ) {
236- 		* items_parsed  =  ctx . itemidx ;
236+ 	if  (nitems_parsed  !=  NULL ) {
237+ 		* nitems_parsed  =  reader -> itemidx ;
237238	}
238239
239240	return  err ;
0 commit comments