1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2013 Lennart Poettering
10 #include "bus-signature.h"
13 static int signature_element_length_internal(
15 bool allow_dict_entry
,
17 unsigned struct_depth
,
27 if (bus_type_is_basic(*s
) || *s
== SD_BUS_TYPE_VARIANT
) {
32 if (*s
== SD_BUS_TYPE_ARRAY
) {
35 if (array_depth
>= 32)
38 r
= signature_element_length_internal(s
+ 1, true, array_depth
+1, struct_depth
, &t
);
46 if (*s
== SD_BUS_TYPE_STRUCT_BEGIN
) {
47 const char *p
= s
+ 1;
49 if (struct_depth
>= 32)
52 while (*p
!= SD_BUS_TYPE_STRUCT_END
) {
55 r
= signature_element_length_internal(p
, false, array_depth
, struct_depth
+1, &t
);
66 if (*s
== SD_BUS_TYPE_DICT_ENTRY_BEGIN
&& allow_dict_entry
) {
67 const char *p
= s
+ 1;
70 if (struct_depth
>= 32)
73 while (*p
!= SD_BUS_TYPE_DICT_ENTRY_END
) {
76 if (n
== 0 && !bus_type_is_basic(*p
))
79 r
= signature_element_length_internal(p
, false, array_depth
, struct_depth
+1, &t
);
97 int signature_element_length(const char *s
, size_t *l
) {
98 return signature_element_length_internal(s
, true, 0, 0, l
);
101 bool signature_is_single(const char *s
, bool allow_dict_entry
) {
108 r
= signature_element_length_internal(s
, allow_dict_entry
, 0, 0, &t
);
115 bool signature_is_pair(const char *s
) {
120 if (!bus_type_is_basic(*s
))
123 return signature_is_single(s
+ 1, false);
126 bool signature_is_valid(const char *s
, bool allow_dict_entry
) {
137 r
= signature_element_length_internal(p
, allow_dict_entry
, 0, 0, &t
);