]> git.ipfire.org Git - thirdparty/squid.git/blame - src/esi/Segment.cc
Source Format Enforcement (#1234)
[thirdparty/squid.git] / src / esi / Segment.cc
CommitLineData
43ae1d95 1/*
b8ae064d 2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
43ae1d95 3 *
bbc27441
AJ
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.
43ae1d95 7 */
8
bbc27441
AJ
9/* DEBUG: section 86 ESI processing */
10
582c2af2 11#include "squid.h"
675b8408 12#include "debug/Stream.h"
f99c2cfe 13#include "esi/Segment.h"
43ae1d95 14#include "SquidString.h"
15
8c41d298 16CBDATA_CLASS_INIT(ESISegment);
43ae1d95 17
43ae1d95 18void
19ESISegmentFreeList (ESISegment::Pointer &head)
20{
21 while (head.getRaw()) {
22 ESISegment::Pointer temp = head;
23 head = head->next;
aee3523a 24 temp->next = nullptr;
43ae1d95 25 }
26}
27
28size_t
29ESISegment::space() const
30{
31 assert (len <= sizeof(buf));
32 return sizeof (buf) - len;
33}
34
35void
36ESISegment::adsorbList (ESISegment::Pointer from)
37{
aee3523a
AR
38 assert (next.getRaw() == nullptr);
39 assert (from.getRaw() != nullptr);
43ae1d95 40 /* prevent worst case */
41 assert (!(len == 0 && from->len == space() ));
42 Pointer copyFrom = from;
43
44 while (copyFrom.getRaw() && space() >= copyFrom->len) {
45 assert (append (copyFrom) == copyFrom->len);
46 copyFrom = copyFrom->next;
47 }
48
49 next = copyFrom;
50}
51
52void
53ESISegment::ListTransfer (ESISegment::Pointer &from, ESISegment::Pointer &to)
54{
55 if (!to.getRaw()) {
56 to = from;
aee3523a 57 from = nullptr;
43ae1d95 58 return;
59 }
60
61 ESISegment::Pointer temp = to->tail();
62 temp->adsorbList (from);
aee3523a 63 from = nullptr;
43ae1d95 64}
65
66size_t
67ESISegment::listLength() const
68{
69 size_t result = 0;
70 ESISegment const* temp = this;
71
72 while (temp) {
73 result += temp->len;
74 temp = temp->next.getRaw();
75 }
76
77 return result;
78}
79
80char *
81ESISegment::listToChar() const
82{
83 size_t length = listLength();
84 char *rv = (char *)xmalloc (length + 1);
85 assert (rv);
86 rv [length] = '\0';
87
88 ESISegment::Pointer temp = this;
89 size_t pos = 0;
90
91 while (temp.getRaw()) {
41d00cd3 92 memcpy(&rv[pos], temp->buf, temp->len);
43ae1d95 93 pos += temp->len;
94 temp = temp->next;
95 }
96
97 return rv;
98}
99
100void
101ESISegment::listAppend (char const *s, size_t length)
102{
aee3523a 103 assert (next.getRaw() == nullptr);
43ae1d95 104 ESISegment::Pointer output = this;
105 /* copy the string to output */
106 size_t pos=0;
107
108 while (pos < length) {
109 if (output->space() == 0) {
aee3523a 110 assert (output->next.getRaw() == nullptr);
43ae1d95 111 output->next = new ESISegment;
112 output = output->next;
113 }
114
115 pos += output->append(s + pos, length - pos);
116 }
117}
118
119void
120ESISegment::ListAppend (ESISegment::Pointer &head, char const *s, size_t len)
121{
122 if (!head.getRaw())
123 head = new ESISegment;
124
125 head->tail()->listAppend (s, len);
126}
127
43ae1d95 128/* XXX: if needed, make this iterative */
129ESISegment::Pointer
130ESISegment::cloneList () const
131{
132 ESISegment::Pointer result = new ESISegment (*this);
aee3523a 133 result->next = next.getRaw() ? next->cloneList() : nullptr;
43ae1d95 134 return result;
135}
136
137size_t
138ESISegment::append(char const *appendBuffer, size_t appendLength)
139{
140 size_t toCopy = min(appendLength, space());
41d00cd3 141 memcpy(&buf[len], appendBuffer, toCopy);
43ae1d95 142 len += toCopy;
143 return toCopy;
144}
145
146size_t
147ESISegment::append(ESISegment::Pointer from)
148{
149 return append (from->buf, from->len);
150}
151
152ESISegment const *
153ESISegment::tail() const
154{
155 ESISegment const *result = this;
156
157 while (result->next.getRaw())
158 result = result->next.getRaw();
159
160 return result;
161}
162
163ESISegment *
164ESISegment::tail()
165{
166 ESISegment::Pointer result = this;
167
168 while (result->next.getRaw())
169 result = result->next;
170
171 return result.getRaw();
172}
173
aee3523a 174ESISegment::ESISegment(ESISegment const &old) : len (0), next(nullptr)
43ae1d95 175{
176 append (old.buf, old.len);
177}
178
179void
180ESISegment::dumpToLog() const
181{
182 ESISegment::Pointer temp = this;
183
184 while (temp.getRaw()) {
185 temp->dumpOne();
186 temp = temp->next;
187 }
188}
189
190void
191ESISegment::dumpOne() const
192{
30abd221 193 String temp;
2fe0439c 194 temp.assign(buf, len);
17bc3f22 195 debugs(86, 9, "ESISegment::dumpOne: \"" << temp << "\"");
43ae1d95 196}
f53969cc 197