]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/esi/Segment.cc
2 * Copyright (C) 1996-2018 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 86 ESI processing */
13 #include "esi/Segment.h"
14 #include "SquidString.h"
16 CBDATA_CLASS_INIT(ESISegment
);
19 ESISegmentFreeList (ESISegment::Pointer
&head
)
21 while (head
.getRaw()) {
22 ESISegment::Pointer temp
= head
;
29 ESISegment::space() const
31 assert (len
<= sizeof(buf
));
32 return sizeof (buf
) - len
;
36 ESISegment::adsorbList (ESISegment::Pointer from
)
38 assert (next
.getRaw() == NULL
);
39 assert (from
.getRaw() != NULL
);
40 /* prevent worst case */
41 assert (!(len
== 0 && from
->len
== space() ));
42 Pointer copyFrom
= from
;
44 while (copyFrom
.getRaw() && space() >= copyFrom
->len
) {
45 assert (append (copyFrom
) == copyFrom
->len
);
46 copyFrom
= copyFrom
->next
;
53 ESISegment::ListTransfer (ESISegment::Pointer
&from
, ESISegment::Pointer
&to
)
61 ESISegment::Pointer temp
= to
->tail();
62 temp
->adsorbList (from
);
67 ESISegment::listLength() const
70 ESISegment
const* temp
= this;
74 temp
= temp
->next
.getRaw();
81 ESISegment::listToChar() const
83 size_t length
= listLength();
84 char *rv
= (char *)xmalloc (length
+ 1);
88 ESISegment::Pointer temp
= this;
91 while (temp
.getRaw()) {
92 memcpy(&rv
[pos
], temp
->buf
, temp
->len
);
101 ESISegment::listAppend (char const *s
, size_t length
)
103 assert (next
.getRaw() == NULL
);
104 ESISegment::Pointer output
= this;
105 /* copy the string to output */
108 while (pos
< length
) {
109 if (output
->space() == 0) {
110 assert (output
->next
.getRaw() == NULL
);
111 output
->next
= new ESISegment
;
112 output
= output
->next
;
115 pos
+= output
->append(s
+ pos
, length
- pos
);
120 ESISegment::ListAppend (ESISegment::Pointer
&head
, char const *s
, size_t len
)
123 head
= new ESISegment
;
125 head
->tail()->listAppend (s
, len
);
128 /* XXX: if needed, make this iterative */
130 ESISegment::cloneList () const
132 ESISegment::Pointer result
= new ESISegment (*this);
133 result
->next
= next
.getRaw() ? next
->cloneList() : NULL
;
138 ESISegment::append(char const *appendBuffer
, size_t appendLength
)
140 size_t toCopy
= min(appendLength
, space());
141 memcpy(&buf
[len
], appendBuffer
, toCopy
);
147 ESISegment::append(ESISegment::Pointer from
)
149 return append (from
->buf
, from
->len
);
153 ESISegment::tail() const
155 ESISegment
const *result
= this;
157 while (result
->next
.getRaw())
158 result
= result
->next
.getRaw();
166 ESISegment::Pointer result
= this;
168 while (result
->next
.getRaw())
169 result
= result
->next
;
171 return result
.getRaw();
174 ESISegment::ESISegment(ESISegment
const &old
) : len (0), next(NULL
)
176 append (old
.buf
, old
.len
);
180 ESISegment::dumpToLog() const
182 ESISegment::Pointer temp
= this;
184 while (temp
.getRaw()) {
191 ESISegment::dumpOne() const
194 temp
.limitInit(buf
, len
);
195 debugs(86, 9, "ESISegment::dumpOne: \"" << temp
<< "\"");