120
122
* This is do_hvis, for HTTP style (RFC 1808)
123
do_hvis(char *dst, int c, int flag, int nextc, const char *extra)
125
do_hvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
125
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) {
128
if ((isascii(c) && isalnum(c))
130
|| c == '$' || c == '-' || c == '_' || c == '.' || c == '+'
132
|| c == '!' || c == '*' || c == '\'' || c == '(' || c == ')'
134
dst = do_svis(dst, dlen, c, flag, nextc, extra);
127
142
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf);
128
143
*dst++ = xtoa((unsigned int)c & 0xf);
150
* This is do_mvis, for Quoted-Printable MIME (RFC 2045)
151
* NB: No handling of long lines or CRLF.
154
do_mvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
157
/* Space at the end of the line */
158
((isspace(c) && (nextc == '\r' || nextc == '\n')) ||
160
(!isspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) ||
161
/* Specific char to be escaped */
162
strchr("#$@[\\]^`{|}~", c) != NULL)) {
169
*dst++ = XTOA(((unsigned int)c >> 4) & 0xf);
170
*dst++ = XTOA((unsigned int)c & 0xf);
130
dst = do_svis(dst, c, flag, nextc, extra);
172
dst = do_svis(dst, dlen, c, flag, nextc, extra);
189
244
*dst++ = '\\'; *dst++ = c;
194
251
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
196
254
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0';
197
255
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0';
198
256
*dst++ = (c & 07) + '0';
200
if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\';
258
if ((flag & VIS_NOSLASH) == 0) {
202
265
c &= 0177; *dst++ = 'M';
204
268
if (iscntrl(c)) {
209
274
*dst++ = c + '@';
211
277
*dst++ = '-'; *dst++ = c;
219
* svis - visually encode characters, also encoding the characters
286
typedef char *(*visfun_t)(char *, size_t *, int, int, int, const char *);
289
* Return the appropriate encoding function depending on the flags given.
294
if (flag & VIS_HTTPSTYLE)
296
if (flag & VIS_MIMESTYLE)
302
* isnvis - visually encode characters, also encoding the characters
220
303
* pointed to by `extra'
306
isnvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
311
_DIAGASSERT(dst != NULL);
312
_DIAGASSERT(extra != NULL);
313
MAKEEXTRALIST(flag, nextra, extra);
315
if (dlen && *dlen == 0) {
319
*dst = '\0'; /* can't create nextra, return "" */
323
dst = (*f)(dst, dlen, c, flag, nextc, nextra);
325
if (dst == NULL || (dlen && *dlen == 0)) {
223
334
svis(char *dst, int c, int flag, int nextc, const char *extra)
336
return isnvis(dst, NULL, c, flag, nextc, extra);
227
_DIAGASSERT(dst != NULL);
228
_DIAGASSERT(extra != NULL);
229
MAKEEXTRALIST(flag, nextra, extra);
231
*dst = '\0'; /* can't create nextra, return "" */
234
if (flag & VIS_HTTPSTYLE)
235
dst = do_hvis(dst, c, flag, nextc, nextra);
237
dst = do_svis(dst, c, flag, nextc, nextra);
340
snvis(char *dst, size_t dlen, int c, int flag, int nextc, const char *extra)
342
return isnvis(dst, &dlen, c, flag, nextc, extra);
256
358
* Strsvisx encodes exactly len bytes from src into dst.
257
359
* This is useful for encoding a block of data.
362
istrsnvis(char *dst, size_t *dlen, const char *csrc, int flag, const char *extra)
367
const unsigned char *src = (const unsigned char *)csrc;
370
_DIAGASSERT(dst != NULL);
371
_DIAGASSERT(src != NULL);
372
_DIAGASSERT(extra != NULL);
373
MAKEEXTRALIST(flag, nextra, extra);
375
*dst = '\0'; /* can't create nextra, return "" */
379
for (start = dst; (c = *src++) != '\0'; /* empty */) {
380
dst = (*f)(dst, dlen, c, flag, *src, nextra);
387
if (dlen && *dlen == 0) {
392
return (int)(dst - start);
260
396
strsvis(char *dst, const char *csrc, int flag, const char *extra)
265
const unsigned char *src = (const unsigned char *)csrc;
267
_DIAGASSERT(dst != NULL);
268
_DIAGASSERT(src != NULL);
269
_DIAGASSERT(extra != NULL);
270
MAKEEXTRALIST(flag, nextra, extra);
272
*dst = '\0'; /* can't create nextra, return "" */
275
if (flag & VIS_HTTPSTYLE) {
276
for (start = dst; (c = *src++) != '\0'; /* empty */)
277
dst = do_hvis(dst, c, flag, *src, nextra);
279
for (start = dst; (c = *src++) != '\0'; /* empty */)
280
dst = do_svis(dst, c, flag, *src, nextra);
284
return (dst - start);
398
return istrsnvis(dst, NULL, csrc, flag, extra);
289
strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
402
strsnvis(char *dst, size_t dlen, const char *csrc, int flag, const char *extra)
404
return istrsnvis(dst, &dlen, csrc, flag, extra);
408
istrsnvisx(char *dst, size_t *dlen, const char *csrc, size_t len, int flag,
293
413
char *nextra = NULL;
294
414
const unsigned char *src = (const unsigned char *)csrc;
296
417
_DIAGASSERT(dst != NULL);
297
418
_DIAGASSERT(src != NULL);
298
419
_DIAGASSERT(extra != NULL);
299
420
MAKEEXTRALIST(flag, nextra, extra);
422
if (dlen && *dlen == 0) {
301
426
*dst = '\0'; /* can't create nextra, return "" */
305
if (flag & VIS_HTTPSTYLE) {
306
for (start = dst; len > 0; len--) {
308
dst = do_hvis(dst, c, flag,
309
len > 1 ? *src : '\0', nextra);
312
for (start = dst; len > 0; len--) {
314
dst = do_svis(dst, c, flag,
315
len > 1 ? *src : '\0', nextra);
431
for (start = dst; len > 0; len--) {
433
dst = (*f)(dst, dlen, c, flag, len > 1 ? *src : '\0', nextra);
440
if (dlen && *dlen == 0) {
320
return (dst - start);
445
return (int)(dst - start);
449
strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
451
return istrsnvisx(dst, NULL, csrc, len, flag, extra);
455
strsnvisx(char *dst, size_t dlen, const char *csrc, size_t len, int flag,
458
return istrsnvisx(dst, &dlen, csrc, len, flag, extra);
326
464
* vis - visually encode characters
329
vis(char *dst, int c, int flag, int nextc)
467
invis(char *dst, size_t *dlen, int c, int flag, int nextc)
331
469
char *extra = NULL;
332
470
unsigned char uc = (unsigned char)c;
334
473
_DIAGASSERT(dst != NULL);
336
475
MAKEEXTRALIST(flag, extra, "");
477
if (dlen && *dlen == 0) {
338
481
*dst = '\0'; /* can't create extra, return "" */
341
if (flag & VIS_HTTPSTYLE)
342
dst = do_hvis(dst, uc, flag, nextc, extra);
344
dst = do_svis(dst, uc, flag, nextc, extra);
485
dst = (*f)(dst, dlen, uc, flag, nextc, extra);
487
if (dst == NULL || (dlen && *dlen == 0)) {
496
vis(char *dst, int c, int flag, int nextc)
498
return invis(dst, NULL, c, flag, nextc);
502
nvis(char *dst, size_t dlen, int c, int flag, int nextc)
504
return invis(dst, &dlen, c, flag, nextc);
352
509
* strvis, strvisx - visually encode characters from src into dst
358
515
* Strvisx encodes exactly len bytes from src into dst.
359
516
* This is useful for encoding a block of data.
519
istrnvis(char *dst, size_t *dlen, const char *src, int flag)
524
MAKEEXTRALIST(flag, extra, "");
526
if (dlen && *dlen == 0) {
530
*dst = '\0'; /* can't create extra, return "" */
533
rv = istrsnvis(dst, dlen, src, flag, extra);
362
539
strvis(char *dst, const char *src, int flag)
541
return istrnvis(dst, NULL, src, flag);
545
strnvis(char *dst, size_t dlen, const char *src, int flag)
547
return istrnvis(dst, &dlen, src, flag);
551
istrnvisx(char *dst, size_t *dlen, const char *src, size_t len, int flag)
364
553
char *extra = NULL;
367
556
MAKEEXTRALIST(flag, extra, "");
558
if (dlen && *dlen == 0) {
369
562
*dst = '\0'; /* can't create extra, return "" */
372
rv = strsvis(dst, src, flag, extra);
565
rv = istrsnvisx(dst, dlen, src, len, flag, extra);
379
571
strvisx(char *dst, const char *src, size_t len, int flag)
384
MAKEEXTRALIST(flag, extra, "");
386
*dst = '\0'; /* can't create extra, return "" */
389
rv = strsvisx(dst, src, len, flag, extra);
573
return istrnvisx(dst, NULL, src, len, flag);
577
strnvisx(char *dst, size_t dlen, const char *src, size_t len, int flag)
579
return istrnvisx(dst, &dlen, src, len, flag);