コード例 #1
0
ファイル: unvis.c プロジェクト: edgar-pek/PerspicuOS
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);
}
コード例 #2
0
ファイル: unvis.c プロジェクト: cyrilmagsuci/freebsd
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);
}
コード例 #3
0
ファイル: unvis.c プロジェクト: Leon555/Mac-src-essentials
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);
}
コード例 #4
0
ファイル: unvis.c プロジェクト: AhmadTux/DragonFlyBSD
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);
}
コード例 #5
0
ファイル: unvis-compat.c プロジェクト: hmatyschok/MeshBSD
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);
}
コード例 #6
0
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);
}