Как я могу разбить функцию get_next_line, а также вы можете помочь удалить избыточный код - PullRequest
0 голосов
/ 10 июля 2019

мой код продолжает давать мне segfauls, когда я пытаюсь разбить его на три меньшие функции

Я пытался передать значения по ссылке.

программа читает каждую строкувремя, когда функция get_next_line вызывается и возвращает 1, если строка найдена, 0, если строка не найдена, и -1 для других ошибок, таких как неудачное выделение памяти.

код утечек, но сейчас моя главная проблема заключается вотключение функции get_next_line.

#include "get_next_line.h"

char        *ft_strnew(size_t size) {
    char *str;

    str = (char *)malloc(size + 1);
    if (!str)
        return (NULL);
    str[strlen(str) + 1] = '\0';
    return (str); }

void            *ft_memset(void *start, int init, size_t size) {
    unsigned char *ptr;

    ptr = (unsigned char*)start;
    while (size > 0)
    {
        *ptr++ = (unsigned char)init;
        size--;
    }
    return (start); }

void        ft_bzero(void *s, size_t size) {
    ft_memset(s, '\0', size); }

char            *ft_strjoin(char const *s1, char const *s2) {
    char    *new;
    size_t  len;

    if (!s1 || !s2)
        return (NULL);
    len = strlen((char *)s1) + strlen((char *)s2);
    new = (char *)malloc(len + 1);
    if (!new)
        return (NULL);
    while (*s1 != '\0')
        *new++ = *s1++;
    while (*s2 != '\0')
        *new++ = *s2++;
    *new = '\0';
    return (new - len); }

char            *ft_strdup(const char *str) {
    char    *strdup;
    int     i;

    strdup = (char *)malloc(strlen(str) + 1);
    if (strdup == NULL)
        return (NULL);
    i = 0;
    while (str[i] != '\0')
    {
        strdup[i] = str[i];
        i++;
    }
    strdup[i] = '\0';
    return (strdup); }

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //################################################################################################

static char      *read_line(int f, int fd, char *buff, char *temp) {
    int i;

    i = 0;
    while (f > 0)
    {
        if (buff[i] == '\n'){
            break;
        }
        else if (i == BUFF_SIZE)
        {
            f = read(fd, buff, BUFF_SIZE);
            if (f == 0)
            {
                if (BUFF_SIZE == 1)
                    return (temp);      
                return ((char *)LINE_NOT_FOUND);
            }
            temp = ft_strjoin(temp, buff);
            i = -1;
        }
        i++;
    }
    return (temp); }

int         get_next_line(const int fd, char **line) {
    static t_var var;
    char buff[BUFF_SIZE + 1];
    char *new;
    int i;
    int f = 0;
    int s = 0;
    int w = 0;
    i = 0;

    if (fd <  0 || line == NULL)
        return (INVALID);
    ft_bzero(buff, BUFF_SIZE + 1);
    if (var.j > 0)
    {
        new = (char *)malloc(sizeof(char) * (var.j + 1));
        if (!new)
            return (INVALID);
        s = strlen(var.temp) - var.j;
        f = s;
        w = var.j;
        while (var.temp[s] != '\0')
        {
            new[i] = var.temp[s];
            if (var.temp[s] == '\n')
            {
                if(!(*line = (char *)malloc(sizeof(char) * (i + 1))))
                    return (INVALID);
                *line = strncpy(*line, new, i);
                var.j--;
                return (LINE_FOUND);
            }
            s++;
            var.j--;
            i++;
        }
        s = f;
        var.temp = ft_strdup(new);
    }//first read after this if statement
    if (w == 0)
        var.temp = ft_strnew(BUFF_SIZE);
    f = read(fd, buff, BUFF_SIZE);
    if (f == 0)
        return (LINE_NOT_FOUND);
    var.temp = ft_strjoin(var.temp, buff);
    var.temp = read_line(f, fd, buff, var.temp);//function call 
    if (var.temp == (char *)LINE_NOT_FOUND)
        return (0);
    s = 0;
    if (var.temp[s])
    {
        while (var.temp[s] != '\n')
            s++;
    }
    s++;
    if(var.j == 0)
        *line = (char *)malloc(sizeof(char) * (s + 1));
    *line = strncat(*line, var.temp, s - 1);
    var.j = strlen(var.temp) - s;
    return (LINE_FOUND); }

#include <fcntl.h> int     main(int argc, char **argv) {
    int     fd;
    char    *line;
    int     x = 1;

    if (argc > 1)
    {
        fd = open(argv[1], O_RDONLY);
        while (x == 1)
        {
            x = get_next_line(fd, &line);
            if (x > 0)
                printf("%s\n", line);
        }
        close(fd);
    }
    return (0); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...