view rvinterf/libprint/back_esc.c @ 1010:1d144553a5d0 default tip

CHANGES: fc-host-tools-r21 about to be released
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 12 Dec 2023 07:45:56 +0000
parents 6a0aa8d36d06
children
line wrap: on
line source

/*
 * The function implemented in this module prints a potentially-dirty string
 * into a buffer with C-style backslash escapes, including doubling of any
 * already-present backslashes.  The output buffer must be sized for up to
 * 4x expansion, plus the terminating NUL.
 */

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>

void
safe_print_trace(src, srclen, dest)
	u_char *src;
	char *dest;
{
	int i, c;
	char *dp;

	dp = dest;
	for (i = 0; i < srclen; i++) {
		c = src[i];
		switch (c) {
		case '\\':
			*dp++ = '\\';
			*dp++ = '\\';
			continue;
		case '\r':
			*dp++ = '\\';
			*dp++ = 'r';
			continue;
		case '\n':
			*dp++ = '\\';
			*dp++ = 'n';
			continue;
		}
		if (c >= ' ' && c <= '~')
			*dp++ = c;
		else if (c <= 7 && (i+1 == srclen || !isdigit(src[i+1]))) {
			sprintf(dp, "\\%d", c);
			dp += 2;
		} else {
			sprintf(dp, "\\x%02X", c);
			dp += 4;
		}
	}
	*dp = '\0';
}