URI: 
       tAdd tail queue to load the file - sex - libtermbox based text editor
  HTML git clone git://z3bra.org/sex
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit 9e6662fa43f6c1c6620b72a70a6e7e670beb56e8
   DIR parent b5eeba8daea9d3976388f46981fcb5aa20d3db28
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Thu, 19 Nov 2015 14:29:42 +0100
       
       Add tail queue to load the file
       
       Diffstat:
         M sex.c                               |      41 +++++++++++++++++++++++++------
       
       1 file changed, 33 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/sex.c b/sex.c
       t@@ -1,6 +1,7 @@
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <sys/mman.h>
       +#include <sys/queue.h>
        #include <termbox.h>
        #include <unistd.h>
        #include <string.h>
       t@@ -15,8 +16,7 @@
        struct ln_s {
                char  *p;
                size_t len;
       -        struct ln_s *prev;
       -        struct ln_s *next;
       +        TAILQ_ENTRY(ln_s) entries;
        };
        
        struct file_s {
       t@@ -29,6 +29,7 @@ struct file_s {
        };
        
        static struct file_s f;
       +TAILQ_HEAD(ln_s_head, ln_s) head;
        
        void
        cleanup(void) {
       t@@ -50,9 +51,10 @@ init_termbox(void)
        void
        open_file(char *path)
        {
       -        size_t i;
       +        size_t i, last_eol;
                int d;
                struct stat s;
       +        struct ln_s *tmp;
        
                f.path = path;
        
       t@@ -69,13 +71,23 @@ open_file(char *path)
                if (f.map == MAP_FAILED)
                        err(1, "mmap()");
        
       -        i = f.size;
                f.p = f.map;
        
       -        while (--i)
       -                if (*++f.map == '\n') {
       -                        *f.map = '\0';
       +        TAILQ_INIT(&head);
       +
       +        for (i = last_eol = 0; i < f.size; ++i) {
       +                if (*(f.map + i) == '\n') {
       +                        tmp = malloc(sizeof(*tmp));
       +                        if (tmp == NULL) {
       +                                perror("malloc failed");
       +                                exit(1);
       +                        }
       +                        tmp->p = f.map + last_eol;
       +                        tmp->len = i - last_eol + 1;
       +                        last_eol = i + 1;
       +                        TAILQ_INSERT_TAIL(&head, tmp, entries);
                        }
       +        }
        }
        
        void
       t@@ -83,6 +95,17 @@ edit(char *path) {
                open_file(path);
        }
        
       +ssize_t
       +write_file(int d)
       +{
       +        ssize_t s = 0;
       +        struct ln_s *tmp;
       +        TAILQ_FOREACH(tmp, &head, entries)
       +                s += write(d, tmp->p, tmp->len);
       +
       +        return s;
       +}
       +
        int
        main(int argc, char **argv)
        {
       t@@ -99,8 +122,10 @@ main(int argc, char **argv)
                /* init_termbox();  */
                atexit(cleanup);
        
       -        while (*argv)
       +        while (*argv) {
                        edit(*argv++);
       +                write_file(1);
       +        }
        
                return 0;
        }