From 97450cb0481080496b15e0a05eb9d2c2b09c5fe0 Mon Sep 17 00:00:00 2001 From: Federico klez Culloca Date: Sun, 14 Jun 2026 13:07:24 +0200 Subject: [PATCH] refactor and bug fixes --- parrotsay.c | 143 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 53 deletions(-) diff --git a/parrotsay.c b/parrotsay.c index f35fa20..9f9c528 100644 --- a/parrotsay.c +++ b/parrotsay.c @@ -18,7 +18,7 @@ #include #include -char* parrot = "\ +const char* PARROT = "\ \\\n\ \\ ▄▄▄▄▄▄▄▄\n\ \\ ▄ ▄ ▄▄ ▄\n\ @@ -36,6 +36,8 @@ char* parrot = "\ \n\ \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; } -- 2.47.3