]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/StrList.cc
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 66 HTTP Header Tools */
12 #include "base/TextException.h"
13 #include "sbuf/SBuf.h"
14 #include "SquidString.h"
18 strListAdd(String
&str
, const char *item
, const size_t itemSize
, const char delimiter
)
21 const char buf
[] = { delimiter
, ' ' };
22 const auto bufSize
= sizeof(buf
);
23 Must(str
.canGrowBy(bufSize
));
24 str
.append(buf
, bufSize
);
26 Must(str
.canGrowBy(itemSize
));
27 str
.append(item
, itemSize
);
31 strListAdd(String
*str
, const char *item
, const char delimiter
)
35 strListAdd(*str
, item
, strlen(item
), delimiter
);
39 strListAdd(String
&str
, const SBuf
&item
, char delimiter
)
41 strListAdd(str
, item
.rawContent(), item
.length(), delimiter
);
44 /** returns true iff "m" is a member of the list */
46 strListIsMember(const String
* list
, const SBuf
&m
, char del
)
48 const char *pos
= nullptr;
53 int mlen
= m
.plength();
54 while (strListGetItem(list
, del
, &item
, &ilen
, &pos
)) {
55 if (mlen
== ilen
&& m
.caseCmp(item
, ilen
) == 0)
61 /** returns true iff "s" is a substring of a member of the list */
63 strListIsSubstr(const String
* list
, const char *s
, char del
)
66 return (list
->find(s
) != String::npos
);
70 * iterates through a 0-terminated string of items separated by 'del's.
71 * white space around 'del' is considered to be a part of 'del'
72 * like strtok, but preserves the source, and can iterate several strings at once
74 * returns true if next item is found.
75 * init pos with NULL to start iteration.
78 strListGetItem(const String
* str
, char del
, const char **item
, int *ilen
, const char **pos
)
81 /* ',' is always enabled as field delimiter as this is required for
82 * processing merged header values properly, even if Cookie normally
83 * uses ';' as delimiter.
85 static char delim
[3][8] = {
91 assert(str
&& item
&& pos
);
97 *pos
= str
->termedBuf();
103 /* skip leading whitespace and delimiters */
104 *pos
+= strspn(*pos
, delim
[2]);
106 *item
= *pos
; /* remember item's start */
108 /* find next delimiter */
110 *pos
+= strcspn(*pos
, delim
[quoted
]);
114 } else if (quoted
&& **pos
== '\\') {
119 break; /* Delimiter found, marking the end of this value */
123 len
= *pos
- *item
; /* *pos points to del or '\0' */
126 while (len
> 0 && xisspace((*item
)[len
- 1]))
136 getListMember(const String
&list
, const char *key
, const char delimiter
)
138 const char *pos
= nullptr;
139 const char *item
= nullptr;
141 const auto keyLen
= strlen(key
);
142 while (strListGetItem(&list
, delimiter
, &item
, &ilen
, &pos
)) {
143 if (static_cast<size_t>(ilen
) > keyLen
&& strncmp(item
, key
, keyLen
) == 0 && item
[keyLen
] == '=')
144 return SBuf(item
+ keyLen
+ 1, ilen
- keyLen
- 1);