From: Sergey Matveev Date: Wed, 14 May 2025 08:11:56 +0000 (+0300) Subject: Use stdin where appropriate X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0403b1f3cf96e01ef9434481a014d0f98c51c0b7c388b2555318ed689ef0e7de;p=keks.git Use stdin where appropriate --- diff --git a/c/cmd/deatomiser/deatomiser.c b/c/cmd/deatomiser/deatomiser.c index 0a0e522..9e89f6f 100644 --- a/c/cmd/deatomiser/deatomiser.c +++ b/c/cmd/deatomiser/deatomiser.c @@ -14,6 +14,7 @@ // License along with this program. If not, see . #include +#include #include #include #include @@ -23,20 +24,18 @@ #include #include "../lib/hex.h" -#include "../lib/mmap.h" #include "../lib/printai.h" +#include "../lib/stdinread.h" #include "../lib/uuid.h" int -main(int argc, char **argv) +main(void) { - if (argc < 2) { - fputs("Usage: deatomiser FILE\n", stderr); - return EXIT_FAILURE; - } size_t len = 0; + size_t cap = (size_t)1 << (size_t)10; unsigned char *buf = NULL; - if (!Mmap(&buf, &len, argv[1])) { + if (!stdinread(&buf, &len, &cap)) { + fprintf(stderr, "stdinread(): %s\n", strerror(errno)); exit(EXIT_FAILURE); } struct KEKSAtom atom; diff --git a/c/cmd/deatomiser/deatomiser.do b/c/cmd/deatomiser/deatomiser.do index cb6ed26..f6c18f7 100644 --- a/c/cmd/deatomiser/deatomiser.do +++ b/c/cmd/deatomiser/deatomiser.do @@ -1,4 +1,4 @@ -deps="../lib/hex.o ../lib/mmap.o ../lib/printai.o ../lib/uuid.o" +deps="../lib/hex.o ../lib/printai.o ../lib/stdinread.o ../lib/uuid.o" redo-ifchange $1.c $deps \ ../../conf/cc ../../conf/cflags ../../conf/ldflags ../../conf/prefix read CC <../../conf/cc diff --git a/c/cmd/lib/stdinread.c b/c/cmd/lib/stdinread.c new file mode 100644 index 0000000..4fb4ad5 --- /dev/null +++ b/c/cmd/lib/stdinread.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include + +#include "stdinread.h" + +bool +stdinread(unsigned char **buf, size_t *len, size_t *cap) +{ + *buf = malloc(*cap); + if (*buf == NULL) { + return false; + } + *len = 0; + ssize_t n = 0; + for (;;) { + errno = 0; + n = read(STDIN_FILENO, *buf + *len, *cap - *len); + if (n == -1) { + return false; + } + if (n == 0) { + break; + } + *len += (size_t)n; + if (*len == *cap) { + unsigned char *new = realloc(*buf, *cap * 2); + if (new == NULL) { + free(*buf); + *buf = NULL; + *len = 0; + return false; + } + *buf = new; + *cap *= 2; + } + } + memset(*buf + *len, 0, *cap - *len); + return true; +} diff --git a/c/cmd/lib/stdinread.h b/c/cmd/lib/stdinread.h new file mode 100644 index 0000000..fad8cae --- /dev/null +++ b/c/cmd/lib/stdinread.h @@ -0,0 +1,5 @@ +#include +#include + +bool +stdinread(unsigned char **buf, size_t *len, size_t *cap); diff --git a/c/cmd/pp/pp.c b/c/cmd/pp/pp.c index c30d1f1..bbd8286 100644 --- a/c/cmd/pp/pp.c +++ b/c/cmd/pp/pp.c @@ -39,8 +39,8 @@ #include #include "../lib/hex.h" -#include "../lib/mmap.h" #include "../lib/printai.h" +#include "../lib/stdinread.h" #include "../lib/uuid.h" static char *ColourRed = "\x1b[31m"; @@ -69,7 +69,7 @@ static void usage(void) { fputs( - "Usage: pp [OPTIONS] FILE\n" + "Usage: pp [OPTIONS] . +#include #include #include #include @@ -22,18 +23,15 @@ #include #include #include +#include #include "../lib/mmap.h" +#include "../lib/stdinread.h" static bool -parse(struct KEKSItems *items, const char *fn) +parse(struct KEKSItems *items, const unsigned char *buf, const size_t len) { const ptrdiff_t itemsInitialLen = 2048; - size_t len = 0; - unsigned char *buf = NULL; - if (!Mmap(&buf, &len, fn)) { - return false; - } enum KEKSErr err = KEKSErrInvalid; size_t off = 0; RetryAfterMagic: @@ -59,18 +57,33 @@ RetryAfterMagic: int main(int argc, char **argv) { - if (argc < 4) { - fputs("Usage: schema-validate SCHEMA.keks SCHEMA-NAME DATA.keks\n", stderr); + if (argc < 3) { + fputs("Usage: schema-validate SCHEMA.keks SCHEMA-NAME