From 4cf3b920a7adadabbc5ebdc316f3e9749709da38 Mon Sep 17 00:00:00 2001
From: Lieuwe Rooijakkers <lieuwerooijakkers@gmail.com>
Date: Sat, 20 Jul 2024 17:16:21 +0200
Subject: wist niet dat toiletten zo ingewikkeld waren

---
 src/toilet.c | 45 ++++++++++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/toilet.c b/src/toilet.c
index aeb98f0..0f4d66f 100644
--- a/src/toilet.c
+++ b/src/toilet.c
@@ -1,7 +1,9 @@
 #include <assert.h>
 #include <ctype.h>
 #include <getopt.h>
+#include <limits.h>
 #include <pwd.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
@@ -25,26 +27,26 @@ static void usage(FILE *f) {
 }
 
 enum MODE {
-  M_BYTES,
-  M_WORDS,
-  M_LINES,
+  M_LINES = 1 << 0,
+  M_WORDS = 1 << 1,
+  M_BYTES = 1 << 2,
 };
 
 // Returns pointer to argument array containing the file names
-static char** parse_options(int argc, char **argv, enum MODE *mode) {
+static char** parse_options(int argc, char **argv, int *modeMap) {
   int opt;
   while ((opt = getopt(argc, argv, "cwlhV")) != -1) {
     switch (opt) {
       case 'c':
-        *mode = M_BYTES;
+        *modeMap |= M_BYTES;
         break;
 
       case 'w':
-        *mode = M_WORDS;
+        *modeMap |= M_WORDS;
         break;
 
       case 'l':
-        *mode = M_LINES;
+        *modeMap |= M_LINES;
         break;
 
       case 'h':
@@ -86,25 +88,32 @@ size_t get_count(enum MODE mode, struct map *map) {
 
     case M_LINES: {
       size_t lines = 0;
+      char *ptr = map->addr;
 
-      while (map->addr != map->end) {
-        if (*map->addr == '\n') lines++;
-        map->addr++;
+      while (ptr != map->end) {
+        if (*ptr == '\n') lines++;
+        ptr++;
       }
 
       // handle case if file does not have trailing newline
-      if (*(map->addr - 1) != '\n') {
+      if (*(ptr - 1) != '\n') {
         lines++;
       }
 
       return lines;
     }
+
+    default:
+      assert(false);
   }
 }
 
 int entry_toilet(int argc, char **argv) {
-  enum MODE mode;
-  char **args = parse_options(argc, argv, &mode);
+  int modeMap = 0;
+  char **args = parse_options(argc, argv, &modeMap);
+  if (modeMap == 0) {
+    modeMap = INT_MAX;
+  }
 
   while (*args != NULL) {
     struct map *map = open_map(*args);
@@ -113,8 +122,14 @@ int entry_toilet(int argc, char **argv) {
       return 1;
     }
 
-    size_t count = get_count(mode, map);
-    printf("%li %s\n", count, *args);
+    for (enum MODE mode = 1; mode <= M_BYTES; mode <<= 1) {
+      if (mode & modeMap) {
+        const size_t count = get_count(mode, map);
+        printf("%li ", count);
+      }
+    }
+
+    printf("%s\n", *args);
 
     close_map(map);
     args++;
-- 
cgit v1.2.3-70-g09d2