#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

static void printval(const char *prefix, long val, int base)
{
	char *s = NULL;
	size_t sz = 0, tmp;

	if (!val) {
		printf("%s: 0\n", prefix);
		return;
	}

	while (val) {
		long rem;

		rem = val % base;
		val /= base;

		assert((s = realloc(s, sz + 1)));
		s[sz++] = rem < 10 ? rem + '0' : rem - 10 + 'A';
	}

	for (tmp = 0; tmp < sz / 2; tmp++) {
		char stmp = s[tmp];
		size_t tmp2 = sz - tmp - 1;

		s[tmp] = s[tmp2];
		s[tmp2] = stmp;
//		s[tmp] ^= s[tmp2] ^= s[tmp] ^= s[tmp2];
	}

	assert((s = realloc(s, sz + 1)));
	s[sz] = 0;
	printf("%s: %s\n", prefix, s);
	free(s);
}

static void dhb(const char *what)
{
	long val;
	int base = 10;
	size_t len;

	assert((len = strlen(what)) > 0);

	len--;
	if (what[len] == 'o')
		base = 8;
	else if (what[len] == 'h')
		base = 16;
	else if (what[len] == 'b')
		base = 2;
	else if (what[len] != 'd')
		len++;

	val = strtol(what, NULL, base);

	if (val < 0) {
		printf("%s: must be >= 0\n", what);
		return;
	}

	printval("dec", val, 10);
	printval("hex", val, 16);
	printval("bin", val, 2);
	printval("oct", val, 8);
}

int main(int ac, char * const av[])
{
	int i;

	if (ac < 2) {
		fprintf(stderr, "dec-hex-bin (C) 2006 Adam Wysocki <gophi at chmurka.net>\n");
		fprintf(stderr, "Newest version: http://www.chmurka.net/p/dhb.c\n");
		fprintf(stderr, "Syntax: dhb number [number...]\n");
		fprintf(stderr, "Number optionally suffixed with o (oct), d (default - dec), h (hex), b (bin)\n");
		exit(EXIT_FAILURE);
	}

	for (i = 1; i < ac; i++)
		dhb(av[i]);

	exit(EXIT_SUCCESS);
}
