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;
}