Bu proje, bir dosyadan (veya standart girdi akışından) satır satır veri okumanızı sağlayan
                get_next_line fonksiyonunu içerir. Standart C fonksiyonlarından biri olan
                read ile elde edilen verileri geçici bir alanda (stash) tutarak, her satırın
                eksiksiz biçimde döndürülmesini amaçlar. Böylece tek seferde satırın tümünü yakalayabilir
                ve birden çok dosyayı aynı anda yönetebilirsiniz.
            
\n ) kadar olan
                    kısmı döndürür.BUFFER_SIZE değerleri ile kullanılabilir.get_next_line(int fd): Projenin ana fonksiyonudur. Dosyadan okur, satır sonuna
                            gelindiğinde satırı döndürür, stash yapısını günceller.ft_copy_to_stash: Okunan veriyi stash olarak adlandırdığımız
                            statik string alanına ekler.ft_have_nl: Satır sonu karakteri ( \n ) var mı, kontrol eder.ft_extract_line: stash içerisinden bir satırı koparıp
                            döndürür.ft_recreate_stash: Okunmuş satırdan kalan kısımla stash
                            yapısını yeniden oluşturur.ft_strlen, ft_strdup, ft_strjoin,
                            ft_substr,
                            ft_free_stash gibi yardımcı fonksiyonları barındırır.
                        char *get_next_line(int fd);fd: Okuma yapılacak dosyanın tanımlayıcısı (File Descriptor).
                        char *
                            döndürür. Dosyanın sonuna gelinmişse veya hata varsa NULL döner.
                        
    char    *get_next_line(int fd)
    {
        char        buf[BUFFER_SIZE + 1];
        long        bytes_read;
        static char *stash = NULL;
        char        *line;
    
        line = 0;
        bytes_read = BUFFER_SIZE;
        if (fd < 0 || BUFFER_SIZE <= 0)
            return (ft_free_stash(&stash, 0));
        while (bytes_read > 0)
        {
            bytes_read = read(fd, buf, BUFFER_SIZE);
            if ((bytes_read <= 0 && !stash) || bytes_read == -1)
                return (ft_free_stash(&stash, 0));
            buf[bytes_read] = '\0';
            stash = ft_copy_to_stash(stash, buf);
            if (ft_have_nl(stash))
            {
                line = ft_extract_line(stash);
                if (!line)
                    return (ft_free_stash(&stash, 0));
                return (stash = ft_recreate_stash(stash), line);
            }
        }
        return (ft_free_stash(&stash, 1));
    }
                  
                Açıklama: Fonksiyon, dosyadan read ile okunan verileri
                stash adlı
                statik değişkende biriktirir. Satır sonu karakterine (\n) rastlandığında,
                bu satırı kopararak döndürür ve stash kalan metinle güncellenir.
            
stash içeriğinden okunan satırı çıkarıp,
                    geriye kalan veriyi yeni bir stash olarak saklamak için kullanılır.
                    static char *ft_recreate_stash(char *stash);stash: Satır verisini geçici olarak tutan bellek alanı.
                        stash değeri. Hata
                            durumunda veya
                            verinin devamı yoksa NULL döner.
                        
    static char	*ft_recreate_stash(char *stash)
    {
        size_t	i;
        char	*res;
        i = 0;
        if (!stash)
            return (NULL);
        while (stash[i] != '\n')
            i++;
        if (stash[i + 1] == '\0')
            return (ft_free_stash(&stash, 0));
        res = ft_substr(stash, i + 1, ft_strlen(stash));
        if (!res)
        {
            ft_free_stash(&stash, 0);
            return (NULL);
        }
        ft_free_stash(&stash, 0);
        return (res);
    }
        
                Açıklama: Fonksiyon, mevcut stash içerisindeki veriyi analiz eder; satır
                sonu karakterine (\n) kadar olan kısmı okunan satır olarak ayırır ve geriye kalan kısmı
                yeni bir stash olarak yeniden oluşturur. Böylece, sonraki okuma işlemlerinde eksik veri
                kalmadan devam edilebilir. Hata durumunda veya verinin tamamı okunduğunda uygun şekilde
                NULL döner.
            
stash içerisinden okunan satırı, satır sonu
                    karakterini de dahil ederek ayırıp yeni bir string oluşturur.
                    static char *ft_extract_line(char *stash);stash: Okunan veriyi geçici olarak saklayan string.stash durumunda 0 döner.
    static char	*ft_extract_line(char *stash)
    {
        char	*line;
        size_t	i;
        size_t	j;
        i = 0;
        if (!stash)
            return (0);
        while (stash[i] != '\n')
            i++;
        line = malloc(sizeof(char) * (i + 2));
        if (!line)
            return (0);
        j = 0;
        while (j < i + 1)
        {
            line[j] = stash[j];
            j++;
        }
        line[j] = '\0';
        return (line);
    }
        
                Açıklama: Fonksiyon, stash içerisindeki veriden satır sonu karakterine
                (\n) kadar olan kısmı kopyalayarak yeni bir string oluşturur. Bu şekilde, okunan satır
                (satır sonu dahil) elde edilir. Eğer stash boşsa ya da bellek tahsisi başarısız olursa,
                0 döner.
            
\n)
                    bulunup bulunmadığını kontrol eden yardımcı fonksiyondur.
                    static int ft_have_nl(char *s);s: Kontrol edilecek string.\n bulunursa
                            1, bulunmazsa 0 döner.
                        
    static int	ft_have_nl(char *s)
    {
        size_t	i;
        if (!s)
            return (0);
        i = -1;
        while (s[++i] != '\0')
            if (s[i] == '\n')
                return (1);
        return (0);
    }
        
                Açıklama: Fonksiyon, verilen stringde satır sonu karakteri (\n) olup
                olmadığını kontrol eder. Eğer satır sonu karakteri bulunursa 1, bulunmazsa 0
                döner.
stash içerisine yeni okunan buf
                    verisini ekleyerek birleştirilmiş veriyi oluşturur.
                    static char *ft_copy_to_stash(char *stash, char *buf);
                        stash: Önceden okunan ve saklanan veriyi içeren string.buf: Yeni okunan veriyi içeren buffer.stash). Bellek
                            tahsisi hatası durumunda NULL döner.
    static char	*ft_copy_to_stash(char *stash, char *buf)
    {
        char	*res;
        res = 0;
        if (!stash && buf)
        {
            res = ft_strdup(buf);
            if (!res)
                return (NULL);
            return (res);
        }
        res = ft_strjoin(stash, buf);
        ft_free_stash(&stash, 0);
        return (res);
    }
        
                Açıklama: Fonksiyon, eğer stash boşsa doğrudan buf'u kopyalar;
                aksi halde, mevcut stash ile buf verilerini birleştirir. Eski
                stash belleği ft_free_stash fonksiyonu ile serbest bırakılır ve yeni
                oluşturulan string döndürülür.
            
stash belleğini yönetmek için kullanılır. Eğer
                    create_line parametresi 0 ise, mevcut stash belleğini serbest bırakır ve
                    NULL döner; 1 ise stash içeriğini kopyalayıp belleği serbest bırakarak
                    kopyalanan stringi döndürür.
                    void *ft_free_stash(char **stash, int create_line);
                        stash: Bellek sızıntısını önlemek için serbest bırakılması gereken stringin
                            adresini tutan pointer.create_line: Belleğin serbest bırakılmadan önce kopyalanıp kopyalanmayacağını
                            belirleyen parametre; 0 ise serbest bırakılır, 1 ise kopyalanır ve kopya döndürülür.create_line 1 ise kopyalanan string, aksi
                            halde NULL döner.
    void	*ft_free_stash(char **stash, int create_line)
    {
        char	*line;
        if (!*stash)
            return (NULL);
        if (create_line == 0)
        {
            if (*stash)
            {
                free(*stash);
                *stash = NULL;
            }
            return (NULL);
        }
        else if (create_line == 1)
        {
            line = ft_strdup(*stash);
            free(*stash);
            *stash = NULL;
            return (line);
        }
        return (NULL);
    }
        
                Açıklama: Fonksiyon, stash belleğini uygun şekilde yönetir. Eğer
                create_line 0 ise, mevcut stash serbest bırakılır ve NULL döner.
                Eğer create_line 1 ise, stash içeriğinin bir kopyası oluşturulur,
                orijinal stash belleği serbest bırakılır ve kopyalanan string döndürülür. Bu sayede bellek
                sızıntısı önlenir.
            
ft_strlen: Dizinin uzunluğunu hesaplar.ft_strdup: Verilen stringin bir kopyasını döndürür.ft_strjoin: İki stringi birleştirip yeni bir string oluşturur.ft_substr: Belirli bir aralıktaki alt stringi döndürür.ft_free_stash: stash belleğini doğru şekilde yönetmek için
                            kullanılan fonksiyondur. Okuma tamamlandığında veya hatada NULL döndürerek
                            bellek sızıntısını engeller.
                        
                Buffer, dosyadan okuma yaparken verinin geçici olarak saklandığı alandır. get_next_line
                fonksiyonu, read() sistem çağrısı ile BUFFER_SIZE kadar veri okuyup, bu veriyi
                işlemek için buffer kullanır.
            
    char buf[BUFFER_SIZE + 1];
    bytes_read = read(fd, buf, BUFFER_SIZE);
        
                
                Stash, okunan verilerin satır sonu karakterine (\n) kadar geçici olarak saklandığı dinamik
                string'tir.
                get_next_line fonksiyonu, okuma işlemleri arasında veriyi tutarak satırların eksiksiz bir
                şekilde elde edilmesini sağlar.
            
    static char *stash = NULL;
    stash = ft_copy_to_stash(stash, buf);
        
                
                Static değişkenler, fonksiyonlar arasında verinin korunmasını sağlayan, programın çalışma süresi boyunca
                varlığını sürdüren değişkenlerdir.
                get_next_line fonksiyonunda, stash static olarak tanımlanır; bu sayede
                fonksiyon çağrıları arasında okunan veriler korunur.
            
                Dinamik bellek tahsisi ve serbest bırakma, get_next_line fonksiyonunun doğru çalışması için
                kritik öneme sahiptir.
                Okunan satırlar ve stash verisi, bellek sızıntısını önlemek amacıyla uygun şekilde free
                edilmelidir.
            
                read() fonksiyonu, dosyadan veya standart girişten belirli sayıda byte okuyan bir sistem
                çağrısıdır.
                get_next_line fonksiyonu, bu sistem çağrısı ile veriyi okuyarak işlemeye başlar.
            
                BUFFER_SIZE, get_next_line fonksiyonunun her okuma işleminde kullanacağı byte
                miktarını belirleyen sabittir.
                Bu değer, okuma performansı ve bellek kullanımı açısından önem taşır.
            
    # ifndef BUFFER_SIZE
    #  define BUFFER_SIZE 5
    # endif
                    
                
                Proje hakkında tüm görüş, öneri ve sorularınız için dilediğiniz zaman iletişime geçebilirsiniz.
                daha çok yazı, bilgi ve içerik için takipte kalmayı unutmayın.
                Projenin orijinal kaynak kodlarına aşağıdaki bağlantıdan ulaşabilirsiniz:
                
                🔗 Proje GitHub Linki