From: Federico klez Culloca Date: Sat, 1 Sep 2018 16:16:44 +0000 (+0200) Subject: source code X-Git-Url: https://git.klezlab.it/?a=commitdiff_plain;h=781beffeb61533f45c8754dfa5530e6ba2e3500f;p=klez%2Fparrotsay-lite.git source code --- diff --git a/parrotsay.c b/parrotsay.c new file mode 100644 index 0000000..2d0f206 --- /dev/null +++ b/parrotsay.c @@ -0,0 +1,115 @@ +#include +#include +#include + +char* parrot = "\ + \\\n\ + \\ ▄▄▄▄▄▄▄▄\n\ + \\ ▄ ▄ ▄▄ ▄\n\ + ▄ ▄  ▄\n\ +  ▄   ▄▄▄▄▄    \n\ +  ▄     ▄ ▄\n\ +  ▄      \n\ +    ▄    \n\ +    ▄ ▄   \n\ +  ▄ ▄ ▄ ▄▄ ▄\n\ +  ▄ ▄▄ ▄\n\ +   ▄ ▄▄▄▄ ▄▄ ▄\n\ +   ▄▄▄▄ ▄▄ \n\ + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\ +\n\ + \n"; + +int charcnt(char* s, char c) { + int n = 0; + for(int i = 0; s[i] != 0; i++) { + if(s[i] == c) n++; + } + return n; +} + +char* tabstospaces(char* s, int n) { + int tabscount = charcnt(s, '\t'); + 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++) { + if(*s == '\t') { + for(int k = 0; k < n; k++) { + *(new_p++) = ' '; + } + } else { + *(new_p++) = *s; + } + } + + return new_s; +} + +void printline(int length) { + putchar('+'); + for(int i = 0; i < length; i++) { + putchar('-'); + } + putchar('+'); + putchar('\n'); +} + +int main(int argc, char** argv) { + char** message_rows = malloc(sizeof(char*)); + size_t rows = 0; + int buffer_size = 1; + int longest_line_size = 0; + + if(argc > 1) { + *message_rows = calloc(1, sizeof(char)); + for(int i = 1; i < argc; i++) { + *message_rows = realloc(*message_rows, sizeof(char) * ( strlen(*message_rows) + + strlen(*(argv + i)) + + (i == 1 ? 0 : 1))); + if(i != 1) { + *message_rows = strcat(*message_rows, " "); + } + *message_rows = strcat(*message_rows, *(argv + i)); + } + rows = 1; + longest_line_size = strlen(*message_rows); + } else { + size_t line_length = 0; + ssize_t nread; + char* line = NULL; + while((nread = getline(&line, &line_length, stdin)) != -1) { + if(rows + 1 >= buffer_size) { + buffer_size *= 2; + message_rows = realloc(message_rows, sizeof(char*) * buffer_size); + } + char *untabbed_line = tabstospaces(line, 4); + size_t untabbed_line_length = strlen(untabbed_line); + message_rows[rows] = calloc(1 + untabbed_line_length, sizeof(char)); + strcpy(message_rows[rows], untabbed_line); + 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); + } + + printline(longest_line_size + 2); + + for (size_t i = 0; i < rows; i++) { + printf("| %s%*s |\n", message_rows[i], longest_line_size - strlen(message_rows[i]), ""); + free(message_rows[i]); + } + + printline(longest_line_size + 2); + + free(message_rows); + + printf("%s", parrot); + + return 0; +} + +