From 6f6e702fbe8b11a969bfb800165d0cca6ae51fe0 Mon Sep 17 00:00:00 2001 From: qorg11 Date: Tue, 19 Jan 2021 13:51:03 +0100 Subject: [PATCH] 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 --- src/wc.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/wc.c b/src/wc.c index e39b425..e5582f7 100644 --- a/src/wc.c +++ b/src/wc.c @@ -5,14 +5,6 @@ #include #include -/* 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