parrotsay.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. char* parrot = "\
  5. \\\n\
  6. \\ ▄▄▄▄▄▄▄▄\n\
  7. \\ ▄ ▄ ▄▄ ▄\n\
  8. ▄ ▄  ▄\n\
  9.  ▄   ▄▄▄▄▄    \n\
  10.  ▄     ▄ ▄\n\
  11.  ▄      \n\
  12.    ▄    \n\
  13.    ▄ ▄   \n\
  14.  ▄ ▄ ▄ ▄▄ ▄\n\
  15.  ▄ ▄▄ ▄\n\
  16.   ▄ ▄▄▄▄ ▄▄ ▄\n\
  17.   ▄▄▄▄ ▄▄ \n\
  18. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\
  19. \n\
  20. \n";
  21. int charcnt(char* s, char c) {
  22. int n = 0;
  23. for(int i = 0; s[i] != 0; i++) {
  24. if(s[i] == c) n++;
  25. }
  26. return n;
  27. }
  28. char* tabstospaces(char* s, int n) {
  29. int tabscount = charcnt(s, '\t');
  30. size_t len = strlen(s);
  31. char *new_s = calloc((1 + len + tabscount * (n - 1)), sizeof(char));
  32. char *new_p = new_s;
  33. for(;*s != 0;s++) {
  34. if(*s == '\t') {
  35. for(int k = 0; k < n; k++) {
  36. *(new_p++) = ' ';
  37. }
  38. } else {
  39. *(new_p++) = *s;
  40. }
  41. }
  42. return new_s;
  43. }
  44. void printline(int length) {
  45. putchar('+');
  46. for(int i = 0; i < length; i++) {
  47. putchar('-');
  48. }
  49. putchar('+');
  50. putchar('\n');
  51. }
  52. int main(int argc, char** argv) {
  53. char** message_rows = malloc(sizeof(char*));
  54. size_t rows = 0;
  55. int buffer_size = 1;
  56. int longest_line_size = 0;
  57. if(argc > 1) {
  58. *message_rows = calloc(1, sizeof(char));
  59. for(int i = 1; i < argc; i++) {
  60. *message_rows = realloc(*message_rows, sizeof(char) * ( strlen(*message_rows)
  61. + strlen(*(argv + i))
  62. + (i == 1 ? 0 : 1)));
  63. if(i != 1) {
  64. *message_rows = strcat(*message_rows, " ");
  65. }
  66. *message_rows = strcat(*message_rows, *(argv + i));
  67. }
  68. rows = 1;
  69. longest_line_size = strlen(*message_rows);
  70. } else {
  71. size_t line_length = 0;
  72. ssize_t nread;
  73. char* line = NULL;
  74. while((nread = getline(&line, &line_length, stdin)) != -1) {
  75. if(rows + 1 >= buffer_size) {
  76. buffer_size *= 2;
  77. message_rows = realloc(message_rows, sizeof(char*) * buffer_size);
  78. }
  79. char *untabbed_line = tabstospaces(line, 4);
  80. size_t untabbed_line_length = strlen(untabbed_line);
  81. message_rows[rows] = calloc(1 + untabbed_line_length, sizeof(char));
  82. strcpy(message_rows[rows], untabbed_line);
  83. message_rows[rows][strcspn(untabbed_line, "\n")] = 0;
  84. rows++;
  85. if(untabbed_line_length > longest_line_size) {
  86. longest_line_size = untabbed_line_length;
  87. }
  88. }
  89. if (line != NULL) free(line);
  90. }
  91. printline(longest_line_size + 2);
  92. for (size_t i = 0; i < rows; i++) {
  93. printf("| %s%*s |\n", message_rows[i], longest_line_size - strlen(message_rows[i]), "");
  94. free(message_rows[i]);
  95. }
  96. printline(longest_line_size + 2);
  97. free(message_rows);
  98. printf("%s", parrot);
  99. return 0;
  100. }