void scsipi_strvis(u_char *dst, int dlen, const u_char *src, int slen) { /* Trim leading and trailing blanks and NULs. */ while (slen > 0 && STRVIS_ISWHITE(src[0])) ++src, --slen; while (slen > 0 && STRVIS_ISWHITE(src[slen - 1])) --slen; while (slen > 0) { if (*src < 0x20 || *src >= 0x80) { /* non-printable characters */ dlen -= 4; if (dlen < 1) break; *dst++ = '\\'; *dst++ = ((*src & 0300) >> 6) + '0'; *dst++ = ((*src & 0070) >> 3) + '0'; *dst++ = ((*src & 0007) >> 0) + '0'; } else if (*src == '\\') {
int strnvisx(char *dst, size_t dlen, const char *src, size_t slen, int flags) { if (dlen == 0) return -1; if (flags & VIS_TRIM) { /* Trim leading and trailing blanks and NULs. */ while (slen > 0 && STRVIS_ISWHITE(src[0])) ++src, --slen; while (slen > 0 && STRVIS_ISWHITE(src[slen - 1])) --slen; } while (slen > 0) { if ((flags & VIS_SAFE) && (*src < 0x20 || (*src & 0x80))) { /* non-printable characters */ if (dlen < 4) goto out; dlen -= 4; *dst++ = '\\'; *dst++ = ((*src & 0300) >> 6) + '0'; *dst++ = ((*src & 0070) >> 3) + '0'; *dst++ = ((*src & 0007) >> 0) + '0'; } else if (*src == '\\') { /* quote characters */ if (dlen < 2) goto out; dlen -= 2; *dst++ = '\\'; *dst++ = '\\'; } else { /* normal characters */ if (dlen < 1) goto out; *dst++ = *src; } ++src, --slen; }