]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/esi/Segment.cc
2 * Copyright (C) 1996-2014 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_TYPE(ESISegment
);
20 ESISegmentFreeList (ESISegment::Pointer
&head
)
22 while (head
.getRaw()) {
23 ESISegment::Pointer temp
= head
;
30 ESISegment::space() const
32 assert (len
<= sizeof(buf
));
33 return sizeof (buf
) - len
;
37 ESISegment::adsorbList (ESISegment::Pointer from
)
39 assert (next
.getRaw() == NULL
);
40 assert (from
.getRaw() != NULL
);
41 /* prevent worst case */
42 assert (!(len
== 0 && from
->len
== space() ));
43 Pointer copyFrom
= from
;
45 while (copyFrom
.getRaw() && space() >= copyFrom
->len
) {
46 assert (append (copyFrom
) == copyFrom
->len
);
47 copyFrom
= copyFrom
->next
;
54 ESISegment::ListTransfer (ESISegment::Pointer
&from
, ESISegment::Pointer
&to
)
62 ESISegment::Pointer temp
= to
->tail();
63 temp
->adsorbList (from
);
68 ESISegment::listLength() const
71 ESISegment
const* temp
= this;
75 temp
= temp
->next
.getRaw();
82 ESISegment::listToChar() const
84 size_t length
= listLength();
85 char *rv
= (char *)xmalloc (length
+ 1);
89 ESISegment::Pointer temp
= this;
92 while (temp
.getRaw()) {
93 memcpy(&rv
[pos
], temp
->buf
, temp
->len
);
102 ESISegment::listAppend (char const *s
, size_t length
)
104 assert (next
.getRaw() == NULL
);
105 ESISegment::Pointer output
= this;
106 /* copy the string to output */
109 while (pos
< length
) {
110 if (output
->space() == 0) {
111 assert (output
->next
.getRaw() == NULL
);
112 output
->next
= new ESISegment
;
113 output
= output
->next
;
116 pos
+= output
->append(s
+ pos
, length
- pos
);
121 ESISegment::ListAppend (ESISegment::Pointer
&head
, char const *s
, size_t len
)
124 head
= new ESISegment
;
126 head
->tail()->listAppend (s
, len
);
130 ESISegment::operator new(size_t byteCount
)
132 assert (byteCount
== sizeof (ESISegment
));
134 CBDATA_INIT_TYPE(ESISegment
);
135 rv
= (void *)cbdataAlloc (ESISegment
);
140 ESISegment::operator delete (void *address
)
142 cbdataFree (address
);
145 /* XXX: if needed, make this iterative */
147 ESISegment::cloneList () const
149 ESISegment::Pointer result
= new ESISegment (*this);
150 result
->next
= next
.getRaw() ? next
->cloneList() : NULL
;
155 ESISegment::append(char const *appendBuffer
, size_t appendLength
)
157 size_t toCopy
= min(appendLength
, space());
158 memcpy(&buf
[len
], appendBuffer
, toCopy
);
164 ESISegment::append(ESISegment::Pointer from
)
166 return append (from
->buf
, from
->len
);
170 ESISegment::tail() const
172 ESISegment
const *result
= this;
174 while (result
->next
.getRaw())
175 result
= result
->next
.getRaw();
183 ESISegment::Pointer result
= this;
185 while (result
->next
.getRaw())
186 result
= result
->next
;
188 return result
.getRaw();
191 ESISegment::ESISegment() : len(0), next(NULL
)
194 ESISegment::ESISegment(ESISegment
const &old
) : len (0), next(NULL
)
196 append (old
.buf
, old
.len
);
200 ESISegment::dumpToLog() const
202 ESISegment::Pointer temp
= this;
204 while (temp
.getRaw()) {
211 ESISegment::dumpOne() const
214 temp
.limitInit(buf
, len
);
215 debugs(86, 9, "ESISegment::dumpOne: \"" << temp
<< "\"");