Mandatory & Bonus

  1. libft 라이브러리 사용 안 됨

  2. gcc -Wall -Wextra -Werror 외에 -D (매크로 정의 옵션)을 이용하여 BUFFER_SIZE를 정할 수 있어야 함

    → BUFFER_SIZE 인자로 받지 않은 경우, 헤더의 BUFFER_SIZE 이용 (ifndef endif)

  3. 컴파일 옵션으로 들어간 BUFFER_SIZE를 이용하여 입출력을 해야 함

  4. BUFFER_SIZE → 1, 9999, 10000000 에도 되는지?

    → static 변수 활용

  5. 파일에서 개행 문자를 읽을 때마다 반환할 것 (파일 전체를 읽고 처리하지 말 것)

    → read로 BUFFER_SIZE만큼 읽어 가면서 확인

  6. 파일로도 읽을 수 있어야하고, STDIN으로도 읽을 수 있어야 함

    → 주어진 fd를 모두 이용하면 됨 (동시에 처리를 위한 OPEN_MAX를 고려)

  7. lseek 함수는 이용하지 말 것

  8. 바이너리 파일을 읽는 행위 금지 (가능하게 할 수는 있는 것 같음)

  9. 전역 변수는 이용할 수 없음

  10. 파일이 EOF를 만나기 전에 파일 디스크럽터가 다른 파일을 가리키도록 바꾸는 행위는 금지

처리 전반 생각

  1. 파일을 main에서 열었다 가정하여 int fd와 char * line의 주소를 get_next_line에 넘김

    → gnl 함수는 int fd, char **line을 받게됨

  2. fd 값에 대한 검증 및 기타 검증 필요

    → fd는 0 미만 값인 경우, line의 주소가 존재하지 않는 경우, BUFFER_SIZE가 0 이하 값인 경우 (OPEN_MAX는 BUFFER_SIZE와 달리 입력을 직접 받지 않는 것으로 보여 검증을 할 필요 없어 보임) 에는 -1 리턴

  3. read로 fd에 해당하는 파일을 BUFFER_SIZE만큼 buf에 받았을 때 개행 검사

    → 이 때 read의 상태는 EOF를 만나는 0, 에러의 -1의 경우가 있음 (예외 처리 필요)

    → read 상태 뿐만 아니라 개행 처리후 남은 애들에 대한 처리가 가능하려면 처리 함수를 따로 만들어야 함

  4. 반복문을 돌려서 BUFFER_SIZE만큼 입력을 받고, static 변수에 append...

    → 이러고 끝이 아니라 반복문 돌 때마다 append된 사항에 대해 개행이 있는지 static 변수 확인이 필요 (만일 개행이 있다면 해당 인덱스를 기록하여, static 변수에서부터 잘라서 line에 할당한 후 끝내면 됨)

  5. 3번 사항에 대해서 gnl 함수 안의 길이가 너무 길어지면 read 상태가 잘 맞지 않는 것에 대해선 함수로 따로 빼서 처리 가능

    → 이 경우엔 리턴을 gnl의 리턴 값인 -1, 0, 1 중의 상태 값을 상황에 맞게 리턴하면 됨

  6. 4번 사항에 대해서 개행이 있는지 확인하는 함수, 개행이 있다면 static 변수의 몇 번째 인덱스에 존재하는지 확인하는 함수, 잘라내어 line에 할당하는 함수가 필요한 것을 알 수 있다.

    → 개행이 있는지 확인하는 함수 (static 변수 인자 필요), 개행이 있을 시 static 변수의 몇 번째 인덱스에 존재하는지 확인하는 함수 (static 변수 인자 필요)에 대해서는 두 함수를 합칠 수 있음 (개행이 있는지 확인 후 있다면 해당 인덱스를 리턴해주는 식)

    → 개행이 있다면 잘라내어 line에 할당하는 함수의 경우 char **line, static 변수, 자를 인덱스를 넘기면 됨 (이 함수는 리턴이 없도록 void로 줘도 되겠지만, gnl에서 자르는 함수 호출 시 바로 리턴할 수 있도록 gnl 리턴 값인 상태 값 1을 리턴할 수 있는 int로 두는 것도 좋아보임)

  7. 관련 util 함수들

    → static 변수에서 개행을 찾아 잘라낸 값에 대해서 strdup가 필요하고 (free 잘해주기), 5번 관련 read 상태 이상 값에서도 strdup로 빈 문자열을 리턴하도록 할 수 있음

    → read로 읽어낸 임시 값을 static 변수에 append를 위해 strappend가 있어야 함

    → strappend를 위해 strlcpy, strlen이 필요함