gnl함수는 파일이나 표준 입력으로부터 한 줄씩 읽어오는 함수다.
이 함수의 프로토타입은 아래와 같이 작성 되어 있다.
char *get_next_line(int fd);
-D BUFFER_SIZE=00 플래그를 추가하여 BUFFER_SIZE를 지정할 수 있다.GNL 함수의 반환값은 파일에서 읽어온 한 줄의 문자열이다.
아래 코드는 함수를 구성하는 메인 코드이다.
char *get_next_line(int fd) { static char *saved_buffer; char *result; if (fd < 0 || fd > OPEN_MAX || BUFFER_SIZE <= 0) return (NULL); saved_buffer = read_line(fd, saved_buffer); if (!saved_buffer) { free(saved_buffer); return (NULL); } result = result_line(saved_buffer); saved_buffer = separate_line(saved_buffer); return (result); }
기능
핵심 동작
saved_buffer에 저장된 문자열에서 개행 문자까지 한 줄을 찾아 저장하여 반환한다.char *read_line(int fd, char *saved_buffer) { char *buffer; int result; buffer = (char *)malloc(sizeof(char) * BUFFER_SIZE + 1); if (!buffer) return (NULL); result = 1; while (ft_strchr(saved_buffer, '\n') == NULL && result > 0) { result = read(fd, buffer, BUFFER_SIZE); if (result == -1) { free(buffer); if (saved_buffer) free(saved_buffer); return (NULL); } buffer[result] = '\0'; saved_buffer = ft_strjoin(saved_buffer, buffer); } free(buffer); return (saved_buffer); }
read 함수
\n문자 혹은 EOF를 만날때까지의 한줄의 문자열을 찾아 반환한다.\0문자를 추가하는 코드가 작성 되어있다.\n이 있는지 확인하여 read를 반복하게 while문 종료조건을 작성했다.NULL을 반환한다.char *result_line(char *saved_buffer) { char *line; int i; i = 0; if (saved_buffer == NULL || saved_buffer[i] == '\0') return (NULL); while (saved_buffer[i] != '\n' && saved_buffer[i] != '\0') i++; line = (char *)malloc(sizeof(char) * (i + 2)); if (!line) return (NULL); i = 0; while (saved_buffer[i] != '\n' && saved_buffer[i] != '\0') { line[i] = saved_buffer[i]; i++; } if (saved_buffer[i] == '\n') { line[i] = saved_buffer[i]; i++; } line[i] = '\0'; return (line); }
result 함수
\n을 찾고 없으면 \0을 찾아 반환할 line을 동적할당 해준다.line에 내용을 붙여 넣고 반환한다.char *separate_line(char *saved_buffer) { char *rear_line; int i; int j; i = 0; j = 0; while (saved_buffer[i] != '\n' && saved_buffer[i] != '\0') i++; if (saved_buffer[i] == '\0') { free(saved_buffer); return (NULL); } i++; rear_line = (char *)malloc((int)ft_strlen(saved_buffer) - i + 1); if (!rear_line) return (NULL); while (saved_buffer[i] != '\0') rear_line[j++] = saved_buffer[i++]; rear_line[j] = '\0'; free(saved_buffer); return (rear_line); }
separate 함수
\n까지의 길이를 빼서 rear_line에 동적할당 한다.