/*
 *                            Author :  Vincent Hayward
 *                                      School of Electrical Engineering
 *                                      Purdue University
 *      Dir     : uti
 *      File    : bcv.c
 *      Remarks : interactive number represention convertions
 *      Usage   : cc bcv.c -o mybin/bcv
 */


main()
{
	char line[80], *c, *f, *o, *n;
	static int i;

	for (; ; ) {
		c = line;
		f = o = n = "";
		if (0 == gets(line)) {
			exit(0);
		}
		while (*c == ' ') ++c;
		if (*c != '\0') {
			f = c++;
			while(*c == ' ') ++c;
			if (*c != '\0') {
				o = c++;
				while(*c == ' ') ++c;
				if (*c != '\0') {
					n = c++;
				}
			}
		}
		switch (*f) {
		case 'b' :
			if (*n != '\0') {
				i = btoi(n);
			}
			if (*o == '\0') {
				printb(i, 1);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 1);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case 'o' :
			if (*n != '\0') {
				i = otoi(n);
			}
			if (*o == '\0') {
				printo(i);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 3);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case 'x' :
			if (*n != '\0') {
				i = xtoi(n);
			}
			if (*o == '\0') {
				printx(i);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 4);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case 'd' :
			if (*n != '\0') {
				i = dtoi(n);
			}
			if (*o == '\0') {
				printd(i);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 1);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case 'u' :
			if (*n != '\0') {
				i = utoi(n);
			}
			if (*o == '\0') {
				printu(i);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 1);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case 'c' :
			if (*n != '\0') {
				i = ctoi(n);
			}
			if (*o == '\0') {
				printc(i);
				break;
			}
			switch (*o) {
			case 'b' :
				printb(i, 1);
				break;

			case 'o' :
				printo(i);
				break;

			case 'x' :
				printx(i);
				break;

			case 'd' :
				printd(i);
				break;

			case 'u' :
				printu(i);
				break;

			case 'c' :
				printc(i);
				break;

			default :
				err();
				break;
			}
			break;

		case '<' :
			if (*o != '\0') {
				int l = dtoi(o);
				i <<= l;
			}
			else {
				err();
			}
			break;

		case '>' :
			if (*o != '\0') {
				int l = dtoi(o);
				i >>= l;
			}
			else {
				err();
			}
			break;

		case '?' :
			help();
			break;

		default :
			err();
			break;
		}
	}
}



btoi(b)
char *b;
{
	int i = 0;

	while (*b == '0' || *b == '1') {
		if (*b == '1') {
			i |= 01;
		}
		++b;
		i <<= 1;
	}
	return(i >> 1);
}


otoi(o)
char *o;
{
	int k;

	sscanf(o, "%o", &k);
	return(k);
}


xtoi(x)
char *x;
{
	int k;

	sscanf(x, "%x", &k);
	return(k);
}


dtoi(d)
char *d;
{
	int k;

	sscanf(d, "%d", &k);
	return(k);
}


utoi(d)
char *d;
{
	int k;

	sscanf(d, "%u", &k);
	return(k);
}


ctoi(d)
char *d;
{
	int k;

	sscanf(d, "%c", &k);
	return(k & 0xff);
}


printb(i, g)
int i, g;
{
	short n = 32;

	for (; n--; i <<= 1) {
		if (n != 31 && n % g == g - 1)
			putchar(' ');
		if (i < 0) {
			putchar('1');
		}
		else {
			putchar('0');
		}
	}
	putchar('\n');
}


printo(i)
int i;
{
	printf("%o\n", i);
}


printx(i)
int i;
{
	printf("%x\n", i);
}


printd(i)
int i;
{
	printf("%d\n", i);
}


printu(i)
int i;
{
	printf("%u\n", i);
}


printc(i)
int i;
{
	printf("%c\n", i);
}


err()
{
	printf("?\n");
}


static char msg[] =
"\
b/o/x/d/u/c b/o/x/d/u/c number\n\
b/o/x/d/u/c b/o/x/d/u/c\n\
b/o/x/d/u/c\n\
< n\n\
> n\n\
";

help()
{
	printf("%s", msg);
}
