ft_printf 2021

TonyHan·2021년 11월 14일
0

21) 42서울

목록 보기
6/6

https://github.com/tonyhan18/ft_printf_2021.git

va_start
https://jhnyang.tistory.com/293

가변인자 함수의 사용. 함수에 불특정 여러개의 인자를 넘기고 싶을 때 사용 -> 즉 배열이 아니라 여러 인자를 넘길 수 있게 해주겠다는 뜻

#include <stdarg.h>

가변인자 파라미터는 순서 상 가장 마지막에 위치해야한다.


파일의 구조


ft_printf_hex 분석

10진수 분석을 위해서는 하나의 몫과 무하한 나머지가 필요하다.


libft Makefile 분석
구조
1. 표본지정

NAME		=	libft.a
---주요 파일 위치들
INCLUDES	=	../include -> 헤더파일 위치 -> 위치 지정시 슬래쉬는 앞에
SRCS_DIR 	=	src/ -> 소스 되는 파일 들 위치 -> 그냥 폴더는 뒤에 슬래쉬
OBJS_DIR	=	obj/ -> obj 파일 위치
---컴파일 버전들
CC			=	gcc -> 컴파일 버전
CFLAGS		=	-Wall -Werror -Wextra -I -> 컴파일 플래그들
--- 명령어를 위한 키워드들
RM			=	rm -f
AR			=	ar rcs
  1. 커스텀 색깔
DEF_COLOR = \033[0;39m
GRAY = \033[0;90m
RED = \033[0;91m
GREEN = \033[0;92m
YELLOW = \033[0;93m
BLUE = \033[0;94m
MAGENTA = \033[0;95m
CYAN = \033[0;96m
WHITE = \033[0;97m
  1. src 들
FTIS_DIR	=	ft_is/
FTIS		=	ft_isalnum ft_isalpha ft_isascii ft_isdigit ft_isprint

FTMEM_DIR	=	ft_mem/
FTMEM		=	ft_bzero ft_calloc ft_memchr ft_memcmp ft_memmove ft_memset

FTPUT_DIR	=	ft_put/
FTPUT		=	ft_putchar_fd ft_putendl_fd ft_putnbr_fd ft_putstr_fd

FTTO_DIR	=	ft_to/
FTTO		=	ft_atoi ft_itoa ft_tolower ft_toupper

FTSTR_DIR	=	ft_str/
FTSTR		=	ft_split ft_strchr ft_strdup ft_striteri ft_strjoin \
				ft_strlcat ft_strlcpy ft_strlen ft_strmapi ft_strncmp \
				ft_strnstr ft_strrchr ft_strtrim ft_substr

FTLST_DIR	=	ft_lst/
FTLST		=	ft_lstadd_back ft_lstadd_front ft_lstclear ft_lstdelone \
				ft_lstiter ft_lstlast ft_lstmap ft_lstnew ft_lstsize

SRC_FILES+=$(addprefix $(FTIS_DIR),$(FTIS))
SRC_FILES+=$(addprefix $(FTMEM_DIR),$(FTMEM))
SRC_FILES+=$(addprefix $(FTPUT_DIR),$(FTPUT))
SRC_FILES+=$(addprefix $(FTTO_DIR),$(FTTO))
SRC_FILES+=$(addprefix $(FTSTR_DIR),$(FTSTR))
SRC_FILES+=$(addprefix $(FTLST_DIR),$(FTLST))

SRCS 		= 	$(addprefix $(SRCS_DIR), $(addsuffix .c, $(SRC_FILES)))
OBJS 		= 	$(addprefix $(OBJS_DIR), $(addsuffix .o, $(SRC_FILES)))

###

OBJSF		=	.cache_exists
  1. 명령어들

라이브러리를 만들기 위해서는 .o 파일들이 필요하다.

all:		$(NAME)

$(NAME):	$(OBJS)
			@$(AR) $(NAME) $(OBJS)
			@ranlib $(NAME)
			@echo "$(GREEN)Libft compiled!$(DEF_COLOR)"

$(OBJS_DIR)%.o : $(SRCS_DIR)%.c | $(OBJSF)
			@echo "$(YELLOW)Compiling: $< $(DEF_COLOR)"
			@$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(OBJSF):
			@mkdir -p $(OBJS_DIR)
			@mkdir -p $(OBJS_DIR)$(FTIS_DIR)
			@mkdir -p $(OBJS_DIR)$(FTMEM_DIR)
			@mkdir -p $(OBJS_DIR)$(FTPUT_DIR)
			@mkdir -p $(OBJS_DIR)$(FTTO_DIR)
			@mkdir -p $(OBJS_DIR)$(FTSTR_DIR)
			@mkdir -p $(OBJS_DIR)$(FTLST_DIR)

clean:
			@$(RM) -rf $(OBJS_DIR)
			@$(RM) -f $(OBJSF)
			@echo "$(BLUE)libft objects files cleaned!$(DEF_COLOR)"

fclean:		clean
			@$(RM) -f $(NAME)
			@echo "$(CYAN)libft executable files cleaned!$(DEF_COLOR)"

re:			fclean all
			@echo "$(GREEN)Cleaned and rebuilt everything for libft!$(DEF_COLOR)"

norm:
	@norminette $(SRCS) $(INCLUDES) | grep -v Norme -B1 || true

.PHONY:		all clean fclean re norm

ranlib : 정적 라이브러리를 성공적으로 사용하기 위해서 일부 시스템, 특히 버클리(Berkeley) 유닉스로부터 파생된 시스템에서는 라이브러리 목차를 만들 필요가 있는데, 이를 위해 ranlib을 사용한다.

별건 없고 일단 ar rcs 수행후에 나온 목적파일을 가지고 ranlib 돌려주면 된다.

중간에 (SRCSDIR)(SRCS_DIR).c | $(OBJSF) 라는 파이프라인 부분이 보인다. 이건 만들어진 파일들을 각 디렉토리로 옮기게 하는 부분이다.

특히 아래쪽에 보면 -p 플레그가 잡히어 있다. 이건 이미 폴더가 있을 경우 실행하지 말라는 명령어인데 이 방식으로 re-link 무제를 해결한 것으로 보인다.

ft_printf 구조

이렇게 구현할 것이다.
이유는 norminette를 만족하기 위해서

profile
신촌거지출신개발자(시리즈 부분에 목차가 나옵니다.)

0개의 댓글