int strunvisx(char *dst, const char *src, int flag) { char c; char *start = dst; int state = 0; while ( (c = *src++) ) { again: switch (unvis(dst, c, &state, flag)) { case UNVIS_VALID: dst++; break; case UNVIS_VALIDPUSH: dst++; goto again; case 0: case UNVIS_NOCHAR: break; default: return (-1); } } if (unvis(dst, c, &state, UNVIS_END) == UNVIS_VALID) dst++; *dst = '\0'; return (dst - start); }
static void process(FILE *fp, const char *filename, int eflags) { int offset = 0, c, ret; int state = 0; char outc; while ((c = getc(fp)) != EOF) { offset++; again: switch(ret = unvis(&outc, (char)c, &state, eflags)) { case UNVIS_VALID: (void)putchar(outc); break; case UNVIS_VALIDPUSH: (void)putchar(outc); goto again; case UNVIS_SYNBAD: warnx("%s: offset: %d: can't decode", filename, offset); state = 0; break; case 0: case UNVIS_NOCHAR: break; default: errx(1, "bad return value (%d), can't happen", ret); /* NOTREACHED */ } } if (unvis(&outc, (char)0, &state, eflags | UNVIS_END) == UNVIS_VALID) (void)putchar(outc); }
void process(FILE *fp, const char *filename) { int offset = 0, c, ret; int state = 0; char outc; while ((c = getc(fp)) != EOF) { offset++; again: switch(ret = unvis(&outc, (char)c, &state, 0)) { case UNVIS_VALID: putchar(outc); break; case UNVIS_VALIDPUSH: putchar(outc); goto again; case UNVIS_SYNBAD: warnx("%s: offset: %d: can't decode", filename, offset); state = 0; break; case 0: case UNVIS_NOCHAR: break; default: errx(1, "bad return value (%d), can't happen", ret); } } if (unvis(&outc, (char)0, &state, UNVIS_END) == UNVIS_VALID) putchar(outc); if (ferror(fp)) errx(EX_IOERR, "Error reading %s", fp); }
int strnunvisx(char *dst, size_t dlen, const char *src, int flag) { char c; char t = '\0', *start = dst; int state = 0; _DIAGASSERT(src != NULL); _DIAGASSERT(dst != NULL); #define CHECKSPACE() \ do { \ if (dlen-- == 0) { \ errno = ENOSPC; \ return -1; \ } \ } while (/*CONSTCOND*/0) while ((c = *src++) != '\0') { again: switch (unvis(&t, c, &state, flag)) { case UNVIS_VALID: CHECKSPACE(); *dst++ = t; break; case UNVIS_VALIDPUSH: CHECKSPACE(); *dst++ = t; goto again; case 0: case UNVIS_NOCHAR: break; case UNVIS_SYNBAD: errno = EINVAL; return -1; default: _DIAGASSERT(0); errno = EINVAL; return -1; } } if (unvis(&t, c, &state, UNVIS_END) == UNVIS_VALID) { CHECKSPACE(); *dst++ = t; } CHECKSPACE(); *dst = '\0'; return (int)(dst - start); }
int __unvis_44bsd(char *cp, int c, int *astate, int flag) { if (flag & _UNVIS_END) flag = (flag & ~_UNVIS_END) ^ UNVIS_END; return unvis(cp, c, astate, flag); }
ssize_t strnunvis(char *dst, const char *src, size_t sz) { char c, p; char *start = dst, *end = dst + sz - 1; int state = 0; if (sz > 0) *end = '\0'; while ((c = *src++)) { again: switch (unvis(&p, c, &state, 0)) { case UNVIS_VALID: if (dst < end) *dst = p; dst++; break; case UNVIS_VALIDPUSH: if (dst < end) *dst = p; dst++; goto again; case 0: case UNVIS_NOCHAR: break; default: if (dst <= end) *dst = '\0'; return (-1); } } if (unvis(&p, c, &state, UNVIS_END) == UNVIS_VALID) { if (dst < end) *dst = p; dst++; } if (dst <= end) *dst = '\0'; return (dst - start); }