#include <ccan/str/str.h>
#include <stdlib.h>
#include <stdio.h>
#include <ccan/tap/tap.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
	char *str = (char*)malloc(sizeof(char)*1000);
	struct {
		uint8_t u1byte;
		int8_t s1byte;
		uint16_t u2byte;
		int16_t s2byte;
		uint32_t u4byte;
		int32_t s4byte;
		uint64_t u8byte;
		int64_t s8byte;
		void *ptr;
	} types;

	(void)argc;
	(void)argv;

	assert(str);

	plan_tests(13);

	memset(&types, 0xFF, sizeof(types));

	/* Hex versions */
	sprintf(str, "0x%llx", (unsigned long long)types.u1byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u1byte));
	sprintf(str, "0x%llx", (unsigned long long)types.u2byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u2byte));
	sprintf(str, "0x%llx", (unsigned long long)types.u4byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u4byte));
	sprintf(str, "0x%llx", (unsigned long long)types.u8byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u8byte));

	/* Decimal versions */
	sprintf(str, "%u", types.u1byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u1byte));
	sprintf(str, "%d", types.s1byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.s1byte));
	sprintf(str, "%u", types.u2byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u2byte));
	sprintf(str, "%d", types.s2byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.s2byte));
	sprintf(str, "%u", types.u4byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u4byte));
	sprintf(str, "%d", types.s4byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.s4byte));
	sprintf(str, "%llu", (unsigned long long)types.u8byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.u8byte));
	sprintf(str, "%lld", (long long)types.s8byte);
	ok1(strlen(str) < STR_MAX_CHARS(types.s8byte));

	/* Pointer version. */
	sprintf(str, "%p", types.ptr);
	ok1(strlen(str) < STR_MAX_CHARS(types.ptr));

	free(str);

	return exit_status();
}				
