StrList.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2020 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 
17 void
18 strListAdd(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 
30 void
31 strListAdd(String *str, const char *item, const char delimiter)
32 {
33  assert(str);
34  assert(item);
35  strListAdd(*str, item, strlen(item), delimiter);
36 }
37 
38 void
39 strListAdd(String &str, const SBuf &item, char delimiter)
40 {
41  strListAdd(str, item.rawContent(), item.length(), delimiter);
42 }
43 
45 int
46 strListIsMember(const String * list, const SBuf &m, char del)
47 {
48  const char *pos = NULL;
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 
62 int
63 strListIsSubstr(const String * list, const char *s, char del)
64 {
65  assert(list && del);
66  return (list->find(s) != String::npos);
67 
75 }
76 
85 int
86 strListGetItem(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 
143 SBuf
144 getListMember(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 
SBuf getListMember(const String &list, const char *key, const char delimiter)
Definition: StrList.cc:144
Definition: SBuf.h:86
static const char * delimiter
Definition: ldap_backend.cc:64
const static size_type npos
Definition: SquidString.h:39
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
bool canGrowBy(const size_type growthLen) const
whether appending growthLen characters is safe (i.e., unlikely to assert)
Definition: SquidString.h:123
#define NULL
Definition: types.h:166
const char * rawContent() const
Definition: SBuf.cc:519
int strListIsMember(const String *list, const SBuf &m, char del)
Definition: StrList.cc:46
void append(char const *buf, int len)
Definition: String.cc:161
#define assert(EX)
Definition: assert.h:19
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:404
int plength() const
Definition: SBuf.h:411
int strListIsSubstr(const String *list, const char *s, char del)
Definition: StrList.cc:63
const char * termedBuf() const
Definition: SquidString.h:91
size_type size() const
Definition: SquidString.h:72
#define Must(condition)
Like assert() but throws an exception instead of aborting the process.
Definition: TextException.h:69
int unsigned int const char *desc STUB void int len
Definition: stub_fd.cc:20
size_type find(char const ch) const
Definition: String.cc:522
int caseCmp(const SBuf &S, const size_type n) const
shorthand version for case-insensitive compare()
Definition: SBuf.h:272
#define xisspace(x)
Definition: xis.h:17
void const char * buf
Definition: stub_helper.cc:16
int strListGetItem(const String *str, char del, const char **item, int *ilen, const char **pos)
Definition: StrList.cc:86

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors