#include <unistd.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER  1024 //yuna_printf가 출력할 수 있는 버퍼의 크기

void yuna_printf(char *, ...);
int  yuna_vsprintf(char *, char*, va_list);
char *itoa(long, char *, unsigned);

void yuna_printf(char *format, ...)
{
	va_list	args;
	char	str[BUFFER] = {0};

	va_start(args, format);
	yuna_vsprintf(str, format, args);
	va_end(args);

	write(1, str, BUFFER);
}

int yuna_vsprintf(char *str, char *format, va_list args)
{
	char *pformat;
	pformat = format;

	for( ; *pformat ; pformat++, str++) {
		if(*pformat == '%') {
			switch( *(++pformat) )
			{
			case 'c':
				*str = (char)va_arg(args, int);
				break;
			case 'd':
				str += strlen(itoa(va_arg(args, int), str, 10))-1;
				break;
			case 'o':
				str += strlen(itoa(va_arg(args, unsigned int), str, 8))-1;
				break;
			case 'x':
				str += strlen(itoa(va_arg(args, unsigned int), str, 16))-1;
				break;
			case 's': {
				char *p = va_arg(args, char*);
				for( ; *p ; p++ , str++)
					*str = *p;
				break;
				  }
			}
		} else {
			*str = *pformat;
		}
	}

	return 0;
}

char *itoa (long val, char *buf, unsigned radix)
{
	char *p;
	char *firstdig;
	char temp;
	unsigned digval;

	p = buf;

	if (radix == 10 && val < 0) {
		*p++ = '-';
		val = (unsigned long)(-(long)val);
	}

	firstdig = p;

	do {
		digval = (unsigned) (val % radix);
		val /= radix;

		if (digval > 9)
			*p++ = (char) (digval - 10 + 'a');
		else
			*p++ = (char) (digval + '0');
	} while (val > 0);

	*p-- = '\0';

	do {
		temp = *p;
		*p = *firstdig;
		*firstdig = temp;
		--p;
		++firstdig;
	} while (firstdig < p);

	return buf;
}

