]> git.klezlab.it Git - klez/parrotsay-lite.git/commitdiff
refactor and bug fixes
authorFederico klez Culloca <klez@klezlab.it>
Sun, 14 Jun 2026 11:07:24 +0000 (13:07 +0200)
committerFederico klez Culloca <klez@klezlab.it>
Sun, 14 Jun 2026 11:07:24 +0000 (13:07 +0200)
parrotsay.c

index f35fa201846a8242b31bd4e3a6e3529e597d4d10..9f9c528e3ac75dba92af193fd7cc4c0521fa4c7c 100644 (file)
@@ -18,7 +18,7 @@
 #include <stdlib.h>
 #include <errno.h>
 
-char* parrot = "\
+const char* PARROT = "\
        \\\e[49m\n\
         \\     \e[38;5;16m▄▄▄\e[38;5;232m▄\e[38;5;16m▄▄▄▄\n\
          \\  ▄\e[48;5;16m \e[38;5;75m▄\e[48;5;75m      \e[48;5;232m▄\e[48;5;16m▄ \e[49m\e[38;5;16m▄\n\
@@ -36,6 +36,8 @@ char* parrot = "\
 \n\
         \e[39m\n";
 
+const int MARGIN = 1;
+
 int charcnt(char* s, char c) {
     int n = 0;
     for(int i = 0; s[i] != 0; i++) {
@@ -49,7 +51,7 @@ char* tabstospaces(char* s, int n) {
     size_t len = strlen(s);
     char *new_s = calloc((1 + len + tabscount * (n - 1)), sizeof(char)); 
     char *new_p = new_s;
-    for(;*s != 0;s++) {
+    for (;*s != 0;s++) {
         if(*s == '\t') {
             for(int k = 0; k < n; k++) {
                 *(new_p++) = ' ';
@@ -62,6 +64,69 @@ char* tabstospaces(char* s, int n) {
     return new_s;
 }
 
+void read_from_args(char** message_rows, int argc, char** argv) {
+    *message_rows = calloc(1, sizeof(char));
+    for (int i = 1; i < argc; i++) {
+        size_t message_rows_length = strlen(*message_rows) 
+                                   + strlen(*(argv+i)) 
+                                   + (i == 1 ? 0 : 1);
+        char* tmp = realloc(*message_rows, message_rows_length);
+        if (tmp == NULL) {
+            fprintf(stderr, "Error: %s", strerror(errno));
+            exit(EXIT_FAILURE);
+        }
+        *message_rows = tmp;
+        if (i != 1) {
+            strlcat(*message_rows, " ", message_rows_length + 1);
+        }
+        strlcat(*message_rows, *(argv + i), message_rows_length + 1);
+    }
+}
+
+size_t read_from_stdin(char*** message_rows, size_t* longest_line_size) {
+    size_t rows = 0; // number of rows we read, we're going to retur this
+
+    int buffer_size = 1; // needed for resizing the rows array
+
+    size_t line_length = 0; // unused, probably a bad thing?
+    char* line = NULL;
+
+    while (getline(&line, &line_length, stdin) != -1) {
+
+        if (rows + 1 >= buffer_size) {
+            buffer_size *= 2;
+            char **tmp = realloc(*message_rows, sizeof(char*) * buffer_size);
+            if (tmp == NULL) {
+                fprintf(stderr, "Error: %s", strerror(errno));
+                exit(EXIT_FAILURE);
+            }
+            *message_rows = tmp;
+        }
+
+        char *untabbed_line = tabstospaces(line, 4);
+        size_t untabbed_line_length = strlen(untabbed_line);
+
+        (*message_rows)[rows] = calloc(untabbed_line_length + 1, sizeof(char));
+        strlcpy((*message_rows)[rows], untabbed_line, untabbed_line_length + 1);
+
+        // remove trailing newline
+        (*message_rows)[rows][strcspn(untabbed_line, "\n")] = 0;
+
+        rows++;
+
+        if (untabbed_line_length > *longest_line_size) {
+            *longest_line_size = untabbed_line_length;
+        }
+
+        if (line != NULL) {
+            free(line);
+            line = NULL;
+        }
+    }
+
+    return rows;
+}
+
 void printline(int length) {
     putchar('+');
     for(int i = 0; i < length; i++) {
@@ -71,70 +136,42 @@ void printline(int length) {
     putchar('\n');
 }
 
+void printoutput(char** message_rows, size_t rows, size_t longest_line_size) {
+    printline(longest_line_size + MARGIN*2);
+
+    for (size_t i = 0; i < rows; i++) {
+        printf("| %s%*s |\n", message_rows[i], (u_int)longest_line_size - (u_int)strlen(message_rows[i]), "");
+        free(message_rows[i]);
+    }
+
+    printline(longest_line_size + MARGIN*2);
+
+
+    printf("%s", PARROT);
+}
+
 int main(int argc, char** argv) {
     char** message_rows = malloc(sizeof(char*));
+    if (message_rows == NULL) {
+        fprintf(stderr, "Error: %s", strerror(errno));
+        exit(EXIT_FAILURE);
+    }
+
     size_t rows = 0;
-    int buffer_size = 1;
-    int longest_line_size = 0;
+    size_t longest_line_size = 0;
 
     if(argc > 1) {
-        *message_rows = calloc(1, sizeof(char));
-        for(int i = 1; i < argc; i++) {
-            size_t message_rows_length = strlen(*message_rows) 
-                                       + strlen(*(argv+i)) 
-                                       + (i == 1 ? 0 : 1);
-            char* tmp = realloc(*message_rows, message_rows_length);
-            if (tmp == NULL) {
-                fprintf(stderr, "Error: %s", strerror(errno));
-                exit(EXIT_FAILURE);
-            }
-            *message_rows = tmp;
-            if(i != 1) {
-                strlcat(*message_rows, " ", message_rows_length);
-            }
-            strlcat(*message_rows, *(argv + i), message_rows_length);
-        }
+        read_from_args(message_rows, argc, argv);
         rows = 1;
         longest_line_size = strlen(*message_rows);
     } else {
-        size_t line_length = 0;
-        char* line = NULL;
-        while(getline(&line, &line_length, stdin) != -1) {
-            if(rows + 1 >= buffer_size) {
-                buffer_size *= 2;
-                char **tmp = realloc(message_rows, sizeof(char*) * buffer_size);
-                if (tmp == NULL) {
-                    fprintf(stderr, "Error: %s", strerror(errno));
-                    exit(EXIT_FAILURE);
-                }
-                message_rows = tmp;
-            }
-            char *untabbed_line = tabstospaces(line, 4);
-            size_t untabbed_line_length = strlen(untabbed_line);
-            message_rows[rows] = calloc(untabbed_line_length + 1, sizeof(char));
-            strlcpy(message_rows[rows], untabbed_line, untabbed_line_length + 1);
-            message_rows[rows][strcspn(untabbed_line, "\n")] = 0;
-            rows++;
-            if(untabbed_line_length > longest_line_size) {
-                longest_line_size = untabbed_line_length;
-            }
-        }
-        if (line != NULL) free(line);
+        rows = read_from_stdin(&message_rows, &longest_line_size);
     }
 
-    printline(longest_line_size + 2);
-
-    for (size_t i = 0; i < rows; i++) {
-        printf("| %s%*s |\n", message_rows[i], longest_line_size - (u_int)strlen(message_rows[i]), "");
-        free(message_rows[i]);
-    }
-
-    printline(longest_line_size + 2);
+    printoutput(message_rows, rows, longest_line_size);
 
     free(message_rows);
 
-    printf("%s", parrot);
-
     return EXIT_SUCCESS;
 }