#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\
\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++) {
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++) = ' ';
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++) {
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;
}