StrList.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9/* DEBUG: section 66 HTTP Header Tools */
10
11#include "squid.h"
12#include "base/TextException.h"
13#include "sbuf/SBuf.h"
14#include "SquidString.h"
15#include "StrList.h"
16
17void
18strListAdd(String &str, const char *item, const size_t itemSize, const char delimiter)
19{
20 if (str.size()) {
21 const char buf[] = { delimiter, ' ' };
22 const auto bufSize = sizeof(buf);
23 Must(str.canGrowBy(bufSize));
24 str.append(buf, bufSize);
25 }
26 Must(str.canGrowBy(itemSize));
27 str.append(item, itemSize);
28}
29
30void
31strListAdd(String *str, const char *item, const char delimiter)
32{
33 assert(str);
34 assert(item);
35 strListAdd(*str, item, strlen(item), delimiter);
36}
37
38void
39strListAdd(String &str, const SBuf &item, char delimiter)
40{
41 strListAdd(str, item.rawContent(), item.length(), delimiter);
42}
43
45int
46strListIsMember(const String * list, const SBuf &m, char del)
47{
48 const char *pos = nullptr;
49 const char *item;
50 int ilen = 0;
51
52 assert(list);
53 int mlen = m.plength();
54 while (strListGetItem(list, del, &item, &ilen, &pos)) {
55 if (mlen == ilen && m.caseCmp(item, ilen) == 0)
56 return 1;
57 }
58 return 0;
59}
60
62int
63strListIsSubstr(const String * list, const char *s, char del)
64{
65 assert(list && del);
66 return (list->find(s) != String::npos);
67
75}
76
85int
86strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos)
87{
88 size_t len;
89 /* ',' is always enabled as field delimiter as this is required for
90 * processing merged header values properly, even if Cookie normally
91 * uses ';' as delimiter.
92 */
93 static char delim[3][8] = {
94 "\"?,",
95 "\"\\",
96 " ?,\t\r\n"
97 };
98 int quoted = 0;
99 assert(str && item && pos);
100
101 delim[0][1] = del;
102 delim[2][1] = del;
103
104 if (!*pos) {
105 *pos = str->termedBuf();
106
107 if (!*pos)
108 return 0;
109 }
110
111 /* skip leading whitespace and delimiters */
112 *pos += strspn(*pos, delim[2]);
113
114 *item = *pos; /* remember item's start */
115
116 /* find next delimiter */
117 do {
118 *pos += strcspn(*pos, delim[quoted]);
119 if (**pos == '"') {
120 quoted = !quoted;
121 *pos += 1;
122 } else if (quoted && **pos == '\\') {
123 *pos += 1;
124 if (**pos)
125 *pos += 1;
126 } else {
127 break; /* Delimiter found, marking the end of this value */
128 }
129 } while (**pos);
130
131 len = *pos - *item; /* *pos points to del or '\0' */
132
133 /* rtrim */
134 while (len > 0 && xisspace((*item)[len - 1]))
135 --len;
136
137 if (ilen)
138 *ilen = len;
139
140 return len > 0;
141}
142
143SBuf
144getListMember(const String &list, const char *key, const char delimiter)
145{
146 const char *pos = nullptr;
147 const char *item = nullptr;
148 int ilen = 0;
149 const auto keyLen = strlen(key);
150 while (strListGetItem(&list, delimiter, &item, &ilen, &pos)) {
151 if (static_cast<size_t>(ilen) > keyLen && strncmp(item, key, keyLen) == 0 && item[keyLen] == '=')
152 return SBuf(item + keyLen + 1, ilen - keyLen - 1);
153 }
154 return SBuf();
155}
156
int strListGetItem(const String *str, char del, const char **item, int *ilen, const char **pos)
Definition: StrList.cc:86
void strListAdd(String &str, const char *item, const size_t itemSize, const char delimiter)
Appends the given item of a given size to a delimiter-separated list in str.
Definition: StrList.cc:18
int strListIsMember(const String *list, const SBuf &m, char del)
Definition: StrList.cc:46
SBuf getListMember(const String &list, const char *key, const char delimiter)
Definition: StrList.cc:144
int strListIsSubstr(const String *list, const char *s, char del)
Definition: StrList.cc:63
#define Must(condition)
Definition: TextException.h:75
#define assert(EX)
Definition: assert.h:17
Definition: SBuf.h:94
int caseCmp(const SBuf &S, const size_type n) const
shorthand version for case-insensitive compare()
Definition: SBuf.h:283
const char * rawContent() const
Definition: SBuf.cc:509
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:415
int plength() const
Definition: SBuf.h:422
bool canGrowBy(const size_type growthLen) const
whether appending growthLen characters is safe (i.e., unlikely to assert)
Definition: SquidString.h:124
size_type find(char const ch) const
Definition: String.cc:429
static const size_type npos
Definition: SquidString.h:39
char const * termedBuf() const
Definition: SquidString.h:92
void append(char const *buf, int len)
Definition: String.cc:130
size_type size() const
Definition: SquidString.h:73
static const char * delimiter
Definition: ldap_backend.cc:65
#define xisspace(x)
Definition: xis.h:15

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors