diff --git a/.gitignore b/.gitignore index e3dd7f6..cd68208 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,4 @@ $RECYCLE.BIN/ # End of https://www.toptal.com/developers/gitignore/api/c,macos,windows,linux,c +build/ diff --git a/Makefile b/Makefile index 149c2ac..eaa3393 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,11 @@ ODIR:=obj BINDIR:=build CC:=cc -CFLAGS:=-I$(IDIR) -Wall -Wextra -pedantic -Ofast +# OMG SO FAST (see https://www.shlomifish.org/humour/by-others/funroll-loops/Gentoo-is-Rice.html) +# CFLAGS:=-I$(IDIR) -Wall -Wextra -pedantic -Ofast -faggressive-loop-optimizations -funroll-all-loops -march=native +# For a stable experience +CFLAGS:=-I$(IDIR) -Wall -Wextra -pedantic -O2 -march=native + LIB:= DEPS:=$($(IDIR)/%.h) diff --git a/include/arg.h b/include/arg.h index 0774ef2..0a0bc3f 100644 --- a/include/arg.h +++ b/include/arg.h @@ -2,7 +2,7 @@ #define ARG_H #include -#define LAT_VERSION "0.12.1" +#define LAT_VERSION "0.12.2" struct config { bool stdin; diff --git a/src/lib/file.c b/src/lib/file.c index 1f2372a..6dba950 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -42,7 +42,6 @@ struct filedata readfile(FILE *fp, bool isstdin) { while (fread(&c, 1, 1, fp) > 0) { if (f.buflen == bufsize - 1) { bufsize *= 2; - char *new_buf = realloc(f.buf, bufsize); if (new_buf == NULL) die("realloc"); diff --git a/src/lib/process.c b/src/lib/process.c index e927bd3..4eb5908 100644 --- a/src/lib/process.c +++ b/src/lib/process.c @@ -1,11 +1,15 @@ #include #include +#include + #include "types.h" #include "util.h" void appendline(struct filedata *f, char *data, size_t len) { f->lines = realloc(f->lines, sizeof(struct line) * (f->lc + 1)); + if (f->lines == NULL) + die("realloc"); size_t loc = f->lc; @@ -19,7 +23,7 @@ void loadlines(struct filedata *f) { f->lc = 0; size_t offset = 0; - size_t linelen = 4096; + size_t linelen = 1024; char *line = malloc(linelen); if (line == NULL) die("malloc"); @@ -27,10 +31,11 @@ void loadlines(struct filedata *f) { for (size_t i = 0; i < f->buflen; i++) { char c = f->buf[i]; if (c == '\n') { - if (offset < linelen) { // shrink + if (offset >= 1 && offset < linelen) { // shrink to fit char *new_line = realloc(line, offset); if (new_line == NULL) die("realloc"); + line = new_line; } @@ -58,7 +63,7 @@ void loadlines(struct filedata *f) { } // capture last line - if (offset < linelen) { // shrink + if (offset >= 1 && offset < linelen) { // shrink char *new_line = realloc(line, offset); if (new_line == NULL) die("realloc"); diff --git a/src/main.c b/src/main.c index fffdce5..eb9a2aa 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,11 @@ -#include -#include -#include - #include "arg.h" #include "file.h" #include "process.h" #include "types.h" #include "util.h" +#include +#include +#include #define INVERT_T "\x1b[7m" #define UINVERT_T "\x1b[27m" @@ -77,6 +76,7 @@ void run(FILE *fp, char *filename, bool tty) { fwrite("\n", 1, 1, err); } free(f.buf); + free(f.lines); fflush(st); // prevent timing inconsistencies between st and err fflush(err);