getlines.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       getlines.c (928B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 #include <string.h>
            5 
            6 #include "../text.h"
            7 #include "../util.h"
            8 
            9 void
           10 getlines(FILE *fp, struct linebuf *b)
           11 {
           12         char *line = NULL;
           13         size_t size = 0, linelen = 0;
           14         ssize_t len;
           15 
           16         while ((len = getline(&line, &size, fp)) > 0) {
           17                 if (++b->nlines > b->capacity) {
           18                         b->capacity += 512;
           19                         b->lines = ereallocarray(b->lines, b->capacity, sizeof(*b->lines));
           20                 }
           21                 linelen = len;
           22                 b->lines[b->nlines - 1].data = memcpy(emalloc(linelen + 1), line, linelen + 1);
           23                 b->lines[b->nlines - 1].len = linelen;
           24         }
           25         free(line);
           26         if (b->lines && b->nlines && linelen && b->lines[b->nlines - 1].data[linelen - 1] != '\n') {
           27                 b->lines[b->nlines - 1].data = erealloc(b->lines[b->nlines - 1].data, linelen + 2);
           28                 b->lines[b->nlines - 1].data[linelen] = '\n';
           29                 b->lines[b->nlines - 1].data[linelen + 1] = '\0';
           30                 b->lines[b->nlines - 1].len++;
           31         }
           32 }