ft_printf의 기능중 csdiupxX% 만을 구현한 함수
int ft_printf(const char *str, ...)
{
va_list a; //가변인자들을 저장하기위한 저장공간
int i; //문자열을 순회하기위한 인덱스
ssize_t print_size; //지금까지 출력한 문자의 수
ssize_t past_print_size; //이전까지 출력한 문자의 수
i = 0;
print_size = 0;
va_start (a, str); //va_list를 str의 저장공간을 기점으로 초기화
while (str[i]) //str문자열에 문자가 존재하는동안
{
past_print_size = print_size; //이전의 출력값을 현재 출력값으로
if (str[i] != '%') //현재 보고있는 문자가 %가 아니라면
print_size += write(1, &str[i], 1); //현재 보고있는 문자열을 출력
else // 현재 보고있는 문자가 %라면
print_size += print_va(&str[i++], &a);
//print_va함수 호출 하고 인덱스값 증가
if (past_print_size > print_size)
//이전에 출력한 문자의 수가 현재 출력한 문자수보다 많다는것은 에러가 발생한것
{
print_size = -1;
va_end(a); //va_list를 NULL로 비워줌
return (print_size); //오류가 발생했다는 뜻인 -1 리턴
}
i++; //인덱스값을 증가시켜 다음 문자를 보게 함
}
va_end(a); // va_list를 NULL로 비워줌
return ((int)print_size); //출력한 문자의 수를 반환
}
ssize_t print_va(const char *str, va_list *a)
{
ssize_t print_size; //출력한 크기를 저장할 ssize_t
print_size = 0;
if (str[1] == 'c') //% 이후의 문자가 c라면 ft_print_c 호출
print_size = ft_print_c(&a);
else if (str[1] == 's') //% 이후의 문자가 s라면 ft_print_s 호출
print_size = ft_print_s(&a);
else if (str[1] == 'd') //% 이후의 문자가 d라면 ft_print_d 호출
print_size = ft_print_d(&a);
else if (str[1] == 'i') //...
print_size = ft_print_i(&a);
else if (str[1] == 'u')
print_size = ft_print_u(&a);
else if (str[1] == '%') //%이후 문자가 %라면 문자 %를 출력
print_size = write(1, "%%", 1);
else if (str[1] == 'x')
print_size = ft_print_sx(&a);
else if (str[1] == 'X')
print_size = ft_print_bx(&a);
else if (str[1] == 'p')
print_size = ft_print_p(&a);
return (print_size); //출력한 크기를 반환
}