3333#include <yaml.h>
3434
3535#include "device.h"
36+ #include "device_parser.h"
3637
3738#define TOKEN_LENGTH 16384
3839
@@ -49,12 +50,13 @@ static void nextsym(struct device_parser *dp)
4950 }
5051}
5152
52- static int accept (struct device_parser * dp , int type , char * scalar )
53+ int device_parser_accept (struct device_parser * dp , int type ,
54+ char * scalar , size_t scalar_len )
5355{
5456 if (dp -> event .type == type ) {
55- if (scalar ) {
56- strncpy (scalar , (char * )dp -> event .data .scalar .value , TOKEN_LENGTH - 1 );
57- scalar [TOKEN_LENGTH - 1 ] = '\0' ;
57+ if (scalar && scalar_len > 0 ) {
58+ strncpy (scalar , (char * )dp -> event .data .scalar .value , scalar_len - 1 );
59+ scalar [scalar_len - 1 ] = '\0' ;
5860 }
5961
6062 yaml_event_delete (& dp -> event );
@@ -65,9 +67,10 @@ static int accept(struct device_parser *dp, int type, char *scalar)
6567 }
6668}
6769
68- static bool expect (struct device_parser * dp , int type , char * scalar )
70+ bool device_parser_expect (struct device_parser * dp , int type ,
71+ char * scalar , size_t scalar_len )
6972{
70- if (accept (dp , type , scalar )) {
73+ if (device_parser_accept (dp , type , scalar , scalar_len )) {
7174 return true;
7275 }
7376
@@ -103,30 +106,37 @@ static void parse_board(struct device_parser *dp)
103106
104107 dev = calloc (1 , sizeof (* dev ));
105108
106- while (accept (dp , YAML_SCALAR_EVENT , key )) {
109+ while (device_parser_accept (dp , YAML_SCALAR_EVENT , key , TOKEN_LENGTH )) {
107110 if (!strcmp (key , "users" )) {
108111 dev -> users = calloc (1 , sizeof (* dev -> users ));
109112 list_init (dev -> users );
110113
111- if (accept (dp , YAML_SCALAR_EVENT , value ))
114+ if (device_parser_accept (dp , YAML_SCALAR_EVENT , value , 0 ))
112115 continue ;
113116
114- expect (dp , YAML_SEQUENCE_START_EVENT , NULL );
117+ device_parser_expect (dp , YAML_SEQUENCE_START_EVENT , NULL , 0 );
115118
116- while (accept (dp , YAML_SCALAR_EVENT , key )) {
119+ while (device_parser_accept (dp , YAML_SCALAR_EVENT , key , TOKEN_LENGTH )) {
117120 struct device_user * user = calloc (1 , sizeof (* user ));
118121
119122 user -> username = strdup (key );
120123
121124 list_add (dev -> users , & user -> node );
122125 }
123126
124- expect (dp , YAML_SEQUENCE_END_EVENT , NULL );
127+ device_parser_expect (dp , YAML_SEQUENCE_END_EVENT , NULL , 0 );
125128
126129 continue ;
127130 }
128131
129- expect (dp , YAML_SCALAR_EVENT , value );
132+ if (!strcmp (key , "local_gpio" )) {
133+ dev -> control_options = local_gpio_ops .parse_options (dp );
134+ if (dev -> control_options )
135+ set_control_ops (dev , & local_gpio_ops );
136+ continue ;
137+ }
138+
139+ device_parser_expect (dp , YAML_SCALAR_EVENT , value , TOKEN_LENGTH );
130140
131141 if (!strcmp (key , "board" )) {
132142 dev -> board = strdup (value );
@@ -212,25 +222,25 @@ int device_parser(const char *path)
212222
213223 nextsym (& dp );
214224
215- expect (& dp , YAML_STREAM_START_EVENT , NULL );
225+ device_parser_expect (& dp , YAML_STREAM_START_EVENT , NULL , 0 );
216226
217- expect (& dp , YAML_DOCUMENT_START_EVENT , NULL );
218- expect (& dp , YAML_MAPPING_START_EVENT , NULL );
227+ device_parser_expect (& dp , YAML_DOCUMENT_START_EVENT , NULL , 0 );
228+ device_parser_expect (& dp , YAML_MAPPING_START_EVENT , NULL , 0 );
219229
220- if (accept (& dp , YAML_SCALAR_EVENT , key )) {
221- expect (& dp , YAML_SEQUENCE_START_EVENT , NULL );
230+ if (device_parser_accept (& dp , YAML_SCALAR_EVENT , key , TOKEN_LENGTH )) {
231+ device_parser_expect (& dp , YAML_SEQUENCE_START_EVENT , NULL , 0 );
222232
223- while (accept (& dp , YAML_MAPPING_START_EVENT , NULL )) {
233+ while (device_parser_accept (& dp , YAML_MAPPING_START_EVENT , NULL , 0 )) {
224234 parse_board (& dp );
225- expect (& dp , YAML_MAPPING_END_EVENT , NULL );
235+ device_parser_expect (& dp , YAML_MAPPING_END_EVENT , NULL , 0 );
226236 }
227237
228- expect (& dp , YAML_SEQUENCE_END_EVENT , NULL );
238+ device_parser_expect (& dp , YAML_SEQUENCE_END_EVENT , NULL , 0 );
229239 }
230240
231- expect (& dp , YAML_MAPPING_END_EVENT , NULL );
232- expect (& dp , YAML_DOCUMENT_END_EVENT , NULL );
233- expect (& dp , YAML_STREAM_END_EVENT , NULL );
241+ device_parser_expect (& dp , YAML_MAPPING_END_EVENT , NULL , 0 );
242+ device_parser_expect (& dp , YAML_DOCUMENT_END_EVENT , NULL , 0 );
243+ device_parser_expect (& dp , YAML_STREAM_END_EVENT , NULL , 0 );
234244
235245 yaml_event_delete (& dp .event );
236246 yaml_parser_delete (& dp .parser );
0 commit comments