우선 mandatory part를 구조체로 구현하게 되면 bonus part를 구현할 때 변경하기 편리하다.
typedef struct s_list
{
char *line;
} t_list
//mandatory part
typedef struct s_list
{
char *line;
int fd;
struct s_list *next;
}
//bonus part
본 과제는 libft를 사용하지 않고 10개의 함수로 file을 한 번에BUFFER_SIZE만큼 읽어들여 개행 단위로 리턴해주고 개행 이후의 부분을 정적 변수에 담아두었다가 다음 호출 때 다음 개행을 리턴하는 방식이다.
ex) a.txt "a\nbbb\ncccccccc\n", BUFFER_SIZE가 5일 때
gnl은 a\nbbb를 한 번 읽고 개행이 존재하는지 검사 후
a\n은 리턴 bbb는 정적 변수에 보관해둔다.
다음 호출시 bbb를 담고 있는 정적 변수에 개행이 존재하는 지 검사 후 존재하지 않기 때문에 BUFFER_SIZE만큼 다시 읽어 bbb\ncccc를
가지고 bbb\n을 리턴 한 후 cccc를 정적 변수에 보관해둔다.
여러 개의 fd를 동시에 열어 gnl을 수행하는 함수를 만들면 된다.
정적 변수를 하나만 가져야 한다는 제한이 있다.
read의 에러 발생 시, memory 할당 오류, realloc 시 memory leak 발생 등 나타날 수 있는 에러들을 잘 제어 해야한다.
정적 배열 구현 : 구현, 메모리 관리 쉽고 성능도 좋지만 fd를 제한한다는 점에서 디펜스에 심혈을 기울일 필요가 있다.
리스트 구현 : 가변적인 데이터 구조를 사용하기 때문에 fd에 제한을 두지 않지만 성능이 조금 안좋고 메모리 관리에 주의를 기울여야한다.
해시맵 구현 : key로 fd를 사용하여 배열과 같은 성능을 보여줄 수 있지만 함수 10개 * 25줄로 구현하긴 어렵다고 생각한다.
물론 괴물들은 존재하겠지만