1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
7 #include "bus-signature.h"
10 static int signature_element_length_internal(
12 bool allow_dict_entry
,
14 unsigned struct_depth
,
24 if (bus_type_is_basic(*s
) || *s
== SD_BUS_TYPE_VARIANT
) {
29 if (*s
== SD_BUS_TYPE_ARRAY
) {
32 if (array_depth
>= 32)
35 r
= signature_element_length_internal(s
+ 1, true, array_depth
+1, struct_depth
, &t
);
43 if (*s
== SD_BUS_TYPE_STRUCT_BEGIN
) {
44 const char *p
= s
+ 1;
46 if (struct_depth
>= 32)
49 while (*p
!= SD_BUS_TYPE_STRUCT_END
) {
52 r
= signature_element_length_internal(p
, false, array_depth
, struct_depth
+1, &t
);
60 /* D-Bus spec: Empty structures are not allowed; there
61 * must be at least one type code between the parentheses.
69 if (*s
== SD_BUS_TYPE_DICT_ENTRY_BEGIN
&& allow_dict_entry
) {
70 const char *p
= s
+ 1;
73 if (struct_depth
>= 32)
76 while (*p
!= SD_BUS_TYPE_DICT_ENTRY_END
) {
79 if (n
== 0 && !bus_type_is_basic(*p
))
82 r
= signature_element_length_internal(p
, false, array_depth
, struct_depth
+1, &t
);
100 int signature_element_length(const char *s
, size_t *l
) {
101 return signature_element_length_internal(s
, true, 0, 0, l
);
104 bool signature_is_single(const char *s
, bool allow_dict_entry
) {
111 r
= signature_element_length_internal(s
, allow_dict_entry
, 0, 0, &t
);
118 bool signature_is_pair(const char *s
) {
123 if (!bus_type_is_basic(*s
))
126 return signature_is_single(s
+ 1, false);
129 bool signature_is_valid(const char *s
, bool allow_dict_entry
) {
140 r
= signature_element_length_internal(p
, allow_dict_entry
, 0, 0, &t
);
147 return p
- s
<= SD_BUS_MAXIMUM_SIGNATURE_LENGTH
;