[Libft] 나만의 C 라이브러리 만들기

이대현·2020년 4월 11일
3

42SEOUL

목록 보기
1/24
post-thumbnail

1. 프로젝트 소개

42SEOUL에서는 이미 정의되어 있는 표준 함수들을 사용해 프로젝트를 진행하는 것이 금지되어 있다. 필요하다고 생각되는 함수라면 직접 구현해 사용해야 한다. 이 프로젝트를 통해 유용한 C 표준 함수들을 재구현하면서 함수의 작동 원리와 사용법, 그리고 C언어에서 데이터와 그에 필요한 메모리를 어떻게 효율적으로 관리하고 다룰 수 있는지 배울 수 있었다. 이 라이브러리의 함수 리스트는 42SEOUL에서 학습하는 기간 동안, 필요할 때 마다 꾸준히 업데이트 할 계획이다.

2. 몇 가지 규칙들

  • 프로젝트는 Norm 규칙에 맞춰 작성되어야 합니다. 보너스 파일/함수가 있는 경우, 해당 파일/함수들은 norm 검사에 포함되며, norm error가 있을 시, 0점을 받게 될것 입니다.
  • 함수들은 정의되지 않은 행동들과는 별개로 예기치 않게 중단되어서는 안 됩니다. (예를 들어, segmentation fault, bus error, double free 등)
  • 필요한 경우 heap에 할당된 모든 메모리 공간은 적절하게 해제되어야 합니다. 메모리 누수는 용납되지 않을 것입니다.
  • 그 과제가 필요하다면, Makefile을 제출해야 합니다. 그것은 -Wall -Wextra -Werror 플래그를 지정하여 컴파일할 것입니다. 그리고 Makefile은 relink 되어서는 안됩니다.
  • Makefile은 최소한 $(NAME), all, clean, fclean, re를 포함해야 합니다.
  • 프로젝트에 보너스를 제출하려면, Makefile에 보너스 규칙을 포함해야 합니다. 이보 너스 규칙은 프로젝트의 메인 부분에서 금지되었던 모든 다양한 헤더, 라이브러리, 또는 함수들은 추가해야 할 것입니다. 보너스는 반드시 _bonus.{c/h}라는 다른 파일 에 있어야 합니다. 의무적으로 해야 될 파트과 보너스 파트는 별도로 평가될 것입니 다.
  • 프로젝트에서 당신의 libft를 허용한다면, 소스들과 그것과 연관된 Makefile을 연관 된 Makefile과 함께 libft폴더에 복사해야 합니다. 프로젝트의 Makefile은 Makefile 을 사용하여 라이브러리를 컴파일한 다음, 프로젝트를 컴파일해야 합니다.
  • 이 과제물을 제출하지 않고 등급이 매겨지지 않을지라도, 우리는 당신의 프로젝트를 위한 테스트 프로그램을 만들 것을 권장합니다. 그것은 너의 work와 peer’s work를 쉽게 테스트할 기회를 제공할 것입니다. 너는 defence하는 동안 이 테스트 프로그램 들이 특히 유용하다는 것을 알게 될 것입니다. 사실, defence하는 동안, 너는 너의 테 스트 프로그램과 평가 받는 동료의 테스트 프로그램들을 자유롭게 사용할 수 있을것 입니다.
  • 할당된 git 저장소에 과제물을 제출하세요. 오직 git 저장소에 있는 과제물만 등급이 매겨질 것입니다. 만약 너의 과제를 평가받는데 Deepthought가 배정된다면, 그것은 동료평가 이후에 이루어질 것입니다. 만약 Deepthought 평가 중에 오류가 발생한다면, 그 즉시 평가는 중지될 것입니다.

3. Mandatory part

이 라이브러리의 함수들은 크게 세 가지 파트로 나눌 수 있다.

  • 첫 번째는 C 표준 라이브러리인 Libc의 함수들.
  • 두 번째는 문자열을 다루는 유용한 함수들.
  • 세 번째는 리스트를 다루는 유용한 함수들.

Part 1 : Libc functions

첫 번째 파트에서는, man에 정의되어 있는 대로 libc functions의 set을 재구현했다. 함수들은 원본과 같은 형식의 프로토타입을 선언한다. 함수의 이름 앞에는 ft_를 붙였다.

예를 들어 strlen은 -> ft_strlen.

재구현해야 하는 함수의 프로토타입의 일부는 restrict 한정자를 사용하지만, 이 키워드는 c99 표준의 일부분이기 때문에 restrict 한정자를 프로토타입에 포함시키고 -std=c99 플래그를 사용하여 컴파일 하는 것은 금지된다.

아래의 함수들을 구현했다. 이 함수들은 외부 함수들을 필요로 하지 않는다.

memset • bzero • memcpy • memccpy • memmove • memchr • memcmp • strlen • strlcpy • strlcat • strchr • strrchr • strnstr • strncmp • atoi • isalpha • isdigit • isalnum • isascii • isprint • toupper • tolower

그리고 아래의 함수들은 malloc함수를 사용하여 재구현 했다.

calloc • strdup

Part 2 : Additional functions

두 번째 파트에서는, libc에 포함되있지 않거나 다른 형식으로 포함된 functions의 set을 재구현했다. 이 함수 중 일부는 구현 시 part1의 함수를 사용했다.

substr • strjoin • strtrim • split • itoa • strmapi • putchar_fd • putstr_fd • putendl_fd • putnbr_fd

함수에 대한 자세한 설명은 아래 Part2 페이지에서.

4. Bonus part

메모리와 문자열을 다루는 함수를 사용하는 것도 편리하지만, 실제 프로젝트를 진행할 때는 리스트를 다루는 함수가 훨씬 필요했다.

리스트의 요소들은 다음의 구조를 갖는다. 이 구조를 libft.h 파일에 추가했다.

    typedef struct    s_list 
    { 
    		void          *content; 
    		struct s_list *next; 
    }                 t_list;

아래의 함수들을 구현해 라이브러리에 추가했다.

ft_lstnew • ft_lstadd_front • ft_lstsize • ft_lstlast • ft_lstadd_back • ft_lstdelone • ft_lstclear • ft_lstiter • ft_lstmap

함수에 대한 자세한 설명은 아래 Bonus 페이지에서.

profile
삽질의 기록들 👨‍💻

0개의 댓글