Skip to content

Commit be2d4d7

Browse files
committed
libcamera: prefer to use pair<T, const char*> for options
1 parent a231d4d commit be2d4d7

File tree

1 file changed

+34
-35
lines changed

1 file changed

+34
-35
lines changed

device/libcamera/options.cc

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

100101
static 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

Comments
 (0)