k9core

Unnamed repository
Log | Files | Refs | LICENSE

commit 6f6e702fbe8b11a969bfb800165d0cca6ae51fe0
parent 84715bc3d4181b836da85f1c28952e95ada52701
Author: qorg11 <qorg@vxempire.xyz>
Date:   Tue, 19 Jan 2021 13:51:03 +0100

Don't take file as stdin if you passed a flag after optind

In good c libraries, the argv[] array is not resorted with the flags
at the beginning, then normal argvs, for example in glibc if you run

./wc file -l -c, argv will be ./wc -l -c file

Diffstat:
Msrc/wc.c | 20+++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/src/wc.c b/src/wc.c @@ -5,14 +5,6 @@ #include <errno.h> #include <string.h> -/* TODO: fucking make this thing read binary data -* Possible solutions: -* fread() -* fgets() -* rewrite this entire thing using read() (not a good idea -* because it's slow as shit) -*/ - int show_lines, show_words, show_bytes; struct wc_values data; @@ -33,14 +25,13 @@ wc(const char *filename, struct wc_values *data) strerror(errno)); return -1; } - char c; - char a; + size_t c; char buf; int newlines, spaces, bytes = 0; newlines = spaces = bytes = 0; while((c = fread(&buf,1,1, file)) > 0) { if(!isascii(buf)) - a = toascii(buf); + buf = toascii(buf); bytes++; if(buf == '\n') newlines++; @@ -54,6 +45,7 @@ wc(const char *filename, struct wc_values *data) fclose(file); return 0; } + void print_values(const char *filename, struct wc_values data) { @@ -72,6 +64,7 @@ print_values(const char *filename, struct wc_values data) } printf(" %s\n",filename); } + int main(int argc, char *argv[]) { @@ -100,8 +93,9 @@ main(int argc, char *argv[]) wc("/dev/stdin",&data); /* lol */ print_values("stdin",data); } - else for(int i = optind; i<argc; i++) { - if(argv[i][0] == '-') + else + for(int i = optind; i<argc; i++) { + if(argv[i][0] == '-' && argv[i][1] == '\0') return_value = wc("/dev/stdin",&data); else return_value = wc(argv[i],&data);