@@ -82,19 +82,20 @@ static const std::map<unsigned, std::string> *libcamera_find_control_ids(unsigne
8282 return &iter->second .enum_values ;
8383}
8484
85- static long long libcamera_find_control_id_named_value (unsigned control_id, const char * *value)
85+ static std::pair< long long , const char *> libcamera_find_control_id_named_value (unsigned control_id, const char *value)
8686{
8787 auto named_values = libcamera_find_control_ids (control_id);
8888 if (named_values) {
8989 for (const auto & named_value : *named_values) {
90- if (device_option_is_equal (named_value.second .c_str (), *value)) {
91- *value += named_value.second .length ();
92- return named_value.first ;
90+ if (device_option_is_equal (named_value.second .c_str (), value)) {
91+ return std::make_pair (named_value.first , value + named_value.second .length ());
9392 }
9493 }
9594 }
9695
97- return strtoll (*value, (char **)value, 10 );
96+ char *endptr = NULL ;
97+ auto res = strtoll (value, &endptr, 10 );
98+ return std::make_pair (res, endptr);
9899}
99100
100101static libcamera::ControlInfoMap::Map libcamera_control_list (device_t *dev)
@@ -323,12 +324,14 @@ int libcamera_device_dump_options2(device_t *dev, device_option_fn fn, void *opa
323324 return n;
324325}
325326
326- static float libcamera_parse_float (const char * *value)
327+ static std::pair< float , const char *> libcamera_parse_float (const char *value)
327328{
328- return strtof (*value, (char **)value);
329+ char *endptr = NULL ;
330+ auto res = strtof (value, &endptr);
331+ return std::make_pair (res, endptr);
329332}
330333
331- static libcamera::Rectangle libcamera_parse_rectangle (const char * *value)
334+ static std::pair< libcamera::Rectangle, const char *> libcamera_parse_rectangle (const char *value)
332335{
333336 static const char *RECTANGLE_PATTERNS[] =
334337 {
@@ -341,19 +344,17 @@ static libcamera::Rectangle libcamera_parse_rectangle(const char **value)
341344 libcamera::Rectangle rectangle;
342345 int read = 0 ;
343346
344- if (4 == sscanf (* value, RECTANGLE_PATTERNS[i],
347+ if (4 == sscanf (value, RECTANGLE_PATTERNS[i],
345348 &rectangle.x , &rectangle.y ,
346349 &rectangle.width , &rectangle.height , &read)) {
347- *value += read;
348- return rectangle;
350+ return std::make_pair (rectangle, value + read);
349351 }
350352 }
351353
352- value = NULL ;
353- return libcamera::Rectangle ();
354+ return std::make_pair (libcamera::Rectangle (), (const char *)NULL );
354355}
355356
356- static libcamera::Size libcamera_parse_size (const char * *value)
357+ static std::pair< libcamera::Size, const char *> libcamera_parse_size (const char *value)
357358{
358359 static const char *SIZE_PATTERNS[] =
359360 {
@@ -366,18 +367,16 @@ static libcamera::Size libcamera_parse_size(const char **value)
366367 libcamera::Size size;
367368 int read = 0 ;
368369
369- if (2 == sscanf (*value, SIZE_PATTERNS[i], &size.width , &size.height , &read)) {
370- *value += read;
371- return size;
370+ if (2 == sscanf (value, SIZE_PATTERNS[i], &size.width , &size.height , &read)) {
371+ return std::make_pair (size, value + read);
372372 }
373373 }
374374
375- *value = NULL ;
376- return libcamera::Size ();
375+ return std::make_pair (libcamera::Size (), (const char *)NULL );
377376}
378377
379378#if LIBCAMERA_VERSION_MAJOR == 0 && LIBCAMERA_VERSION_MINOR > 3 && LIBCAMERA_VERSION_PATCH >= 2 // Support for older libcamera versions
380- static libcamera::Point libcamera_parse_point (const char ** value)
379+ static libcamera::Point libcamera_parse_point (const char *value)
381380{
382381 static const char *POINT_PATTERNS[] =
383382 {
@@ -390,32 +389,32 @@ static libcamera::Point libcamera_parse_point(const char **value)
390389 libcamera::Point point;
391390 int read = 0 ;
392391
393- if (2 == sscanf (* value, POINT_PATTERNS[i],
392+ if (2 == sscanf (value, POINT_PATTERNS[i],
394393 &point.x , &point.y , &read)) {
395- *value += read;
396- return point;
394+ return std::make_pair (point, value + read);
397395 }
398396 }
399397
400- *value = NULL ;
401- return libcamera::Point ();
398+ return std::make_pair (libcamera::Point (), NULL );
402399}
403400#endif
404401
405- template <typename T>
406- static bool libcamera_parse_control_value (libcamera::ControlValue &control_value, bool control_array, const char *value, const std::function<T( const char **)> & fn)
402+ template <typename T, typename F >
403+ static bool libcamera_parse_control_value (libcamera::ControlValue &control_value, bool control_array, const char *value, const F & fn)
407404{
408405 std::vector<T> items;
409406
410407 while (value && *value) {
411- items. push_back ( fn (& value) );
412- if (!value )
408+ auto [item, next] = fn (value);
409+ if (!next )
413410 return false ; // failed to parse
414- else if (!*value)
411+ items.push_back (item);
412+
413+ if (!*next)
415414 break ; // reached end of elements
416- else if (*value != ' ,' )
415+ if (*next != ' ,' )
417416 return false ; // expected comma to split items
418- value++ ;
417+ value = next ;
419418 }
420419
421420 if (items.empty ()) {
@@ -456,17 +455,17 @@ int libcamera_device_set_option(device_t *dev, const char *keyp, const char *val
456455
457456 case libcamera::ControlTypeByte:
458457 libcamera_parse_control_value<unsigned char >(control_value, control_array, value,
459- [control_id](const char ** value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
458+ [control_id](const char *value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
460459 break ;
461460
462461 case libcamera::ControlTypeInteger32:
463462 libcamera_parse_control_value<int32_t >(control_value, control_array, value,
464- [control_id](const char ** value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
463+ [control_id](const char *value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
465464 break ;
466465
467466 case libcamera::ControlTypeInteger64:
468467 libcamera_parse_control_value<int64_t >(control_value, control_array, value,
469- [control_id](const char ** value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
468+ [control_id](const char *value) { return libcamera_find_control_id_named_value (control_id->id (), value); });
470469 break ;
471470
472471 case libcamera::ControlTypeFloat:
0 commit comments