139{
140 static char Nil[] = {
PT_char,
'\0'};
141 static const int Sz16 = sizeof(short) + 1;
142 static const int Sz32 = sizeof(int) + 1;
143 static const int Sz64 = sizeof(long long) + 1;
144 struct iovec *vP = iovP;
146 char *wP = Work;
147 int Dtype, dlen = 0, TotLen = 0;
148
149 unsigned long long n64;
150 unsigned int n32;
151 unsigned short n16;
152
153 union {unsigned long long *B64;
154 unsigned int *B32;
155 unsigned short *B16;
156 char **B08;} Base;
157
159 do {Base.B08 = (
char **)(base + pP->
Doffs);
160
161
162 switch(Dtype)
164 if (!*Base.B08) {vP->iov_base = Nil; vP->iov_len = 2;
165 vP++; TotLen += 2; break;
166 }
167 dlen = (pP->
Dlen < 0 ? strlen(*Base.B08)+1 : pP->
Dlen);
169 return eMsg(
"string too long packing",
int(pP-pup), pP);
170 if (vP >= iovE)
171 return eMsg(
"too many args packing",
int(pP-pup), pP);
172 n16 = htons(static_cast<unsigned short>(dlen));
173 vP->iov_base = wP; vP->iov_len = sizeof(n16); vP++;
174 memcpy(wP, &n16, sizeof(n16)); wP += sizeof(n16);
175 vP->iov_base = *Base.B08; vP->iov_len = dlen; vP++;
176 TotLen += dlen + sizeof(n16);
177 break;
178
180 n16 = htons(*Base.B16);
182 memcpy(wP+1, &n16, sizeof(n16));
183 vP->iov_base = wP; vP->iov_len = Sz16; vP++;
184 wP += Sz16; TotLen += Sz16; dlen = sizeof(n16);
185 break;
186
188 n32 = htonl(*Base.B32);
189 *wP =
static_cast<char>(
PT_int);
190 memcpy(wP+1, &n32, sizeof(n32));
191 vP->iov_base = wP; vP->iov_len = Sz32; vP++;
192 wP += Sz32; TotLen += Sz32; dlen = sizeof(n32);
193 break;
194
196 h2nll(*Base.B64, n64);
198 memcpy(wP+1, &n64, sizeof(n64));
199 vP->iov_base = wP; vP->iov_len = Sz64; vP++;
200 wP += Sz64; TotLen += Sz64; dlen = sizeof(n64);
201 break;
202
204
207
210 *Base.B08 = (char *)vP;
212 vP++;
213 break;
214
216 vP++;
217 break;
218
220 *Base.B32 = dlen;
221 break;
222
224 *Base.B32 = TotLen;
225 break;
226
228 *Base.B16 = htons(static_cast<unsigned short>(TotLen));
229 return static_cast<int>(vP-iovP);
230
232 return static_cast<int>(vP-iovP);
233
234 default: {}
235 }
236 pP++;
238 }
while(vP < iovE || (vP==iovE && Dtype !=
PT_Skip && (Dtype &
PT_MaskD)));
239
240
241
242 return eMsg(
"arg list too long packing",
int(pP-pup), pup);
243}