V10/netfs/serv/r50.c

/*
 * ascii<>radix50
 */

#define	BADC	0100

static char r50c[128] = {
	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,
	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,
	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,
	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,
	000,	BADC,	BADC,	BADC,	033,	BADC,	BADC,	BADC,
	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,	034,	BADC,
	036,	037,	040,	041,	042,	043,	044,	045,
	046,	047,	BADC,	BADC,	BADC,	BADC,	BADC,	BADC,
	BADC,	001,	002,	003,	004,	005,	006,	007,
	010,	011,	012,	013,	014,	015,	016,	017,
	020,	021,	022,	023,	024,	025,	026,	027,
	030,	031,	032,	BADC,	BADC,	BADC,	BADC,	BADC,
	BADC,	001,	002,	003,	004,	005,	006,	007,
	010,	011,	012,	013,	014,	015,	016,	017,
	020,	021,	022,	023,	024,	025,	026,	027,
	030,	031,	032,	BADC,	BADC,	BADC,	BADC,	BADC
};

static char r50a[] = " abcdefghijklmnopqrstuvwxyz$.?0123456789";

/*
 * convert up to three characters
 * from ascii to r50
 * advances s; returns the r50
 * -1 means an error
 */
int
ator50(s)
register char **s;
{
	register char c;
	register int i;
	register unsigned short r;

	r = 0;
	for (i = 0; i < 3 && (c = **s) != 0 ; i++) {
		if (c & 0200)
			return (-1);
		if ((c = r50c[c]) == BADC)
			return (-1);
		r *= 050;
		r += c;
		(*s)++;
	}
	for (; i < 3; i++)
		r *= 050;		/* justify */
	return (r);
}

/*
 * convert r50 to ascii,
 * suppressing leading blanks
 * s is where to put the string;
 * the new s is returned.
 * s had best have at least three characters remaining
 */

char *
r50toa(s, x)
register unsigned short x;
register char *s;
{
	register unsigned char	c;

	if (x) {
		c = x % 050;
		x /= 050;
		if (x)
			s = r50toa(s, x);
		*s++ = r50a[c];
	}
	return (s);
}