Tiger: A Stylish Cat
Okay, this is one of the stupidest programs I've written, but once I had the idea I couldn't not do it.
Here's what it does:
$ xxd tiger | ./tiger -i | head -n96
0000 0: 7f45 4 6 0201 010 000 000 00 0000 .ELF..... ...
0000 0: 0300 3 0 0100 000 007 000 0 0000 ..>....... ...
0000 0: 4000 00 0 0000 0000 24 000 0 0000 @ .......$. ...
000 30: 0000 0000 4000 3800 00 400 0 1c00 . .@.8...@ ..
000 40: 0600 0000 0400 0000 00 000 0000 . .....@... ..
000 50: 4000 0000 0000 0000 00 000 0000 @. ....@... .
00 060: f801 0000 0000 0000 f 1 0000 0000 .. ........ .
00 070: 0800 00 0 0000 0000 0 0 0000 000 ... .......
00 080: 3802 00 0 0000 0000 3 2 0000 0 000 8... ..8....
00 0090: 3802 00 0000 0000 1 0 0000 0 000 8... .......
00 00a0: 1c00 00 0000 0000 0 0000 0 0000 .... .......
00 00b0: 0100 0 0500 0000 0 0000 0000 .... ........
00 00c0: 0000 0 0000 000 00 0000 0 0000 .... .........
00 000d0: 480d 0000 00 0d 000 00 0000 H... ..H......
000000e0: 000 0 0000 00 100 000 00 0000 .. . .........
000000f0: 800 0 0000 0 00d 20 00 0000 ... .... .....
00000100: 80 00 0000 a00b 00 000 000 .. . ..........
00000110: b0 00 0000 0000 2 000 00 ... ..... .....
00000120: 0 00 060 0 900d 0 0000 00 .. ............
00000130: 9 000 00 0 900d 0000 00 .. ..... .....
00 00140: 000 00 00 f001 0 0000 00 .. ............
00 00150: 0000 0 00 0400 0 0400 00 . ............
00 00160: 0000 0 000 540 00 0000 00 T ...T. ....
00 00170: 0000 0 000 440 00 000 00 T ...D. ....
00 00180: 0 0000 0 000 040 00 000 00 D ..... ....
00 0190 5 7464 0 0000 dc 000 000 000 P ...... ...
0 01a0 0b 0000 0 0000 dc 000 000 000 . ...... ...
0 01b0 00 0000 0 0000 44 000 00 000 D ....D. ...
0 01c0 00 0000 0 0000 5 464 06 000 . ....Q. ...
0 01d0 00 0000 0000 0 0000 00 0000 . ...... ...
0 01e0 00 0000 0 0000 0 0000 0 0000 . ....... ...
01f0 00 000 0 0000 0 0000 0 0 0000 . ........ ..
0200: e5 746 00 0000 0d 0000 0 0000 R d....... ..
0210: 0d 200 00 000 0d 2000 0 0000 ...... ..
0220: 02 00 000 00 002 0000 0 0000 ........ .
0 0230: 0 00 0000 2f6c 6962 34 2f6c ...../lib l
0 0240: d 6c 6e75 d 783 62d 34 2e7 inux-x86- s
0 0250: e 32 0 040 0 100 000 00 000 .........
00 0260: 4e 5 0 00 00 03 0000 00 000 .........
00 0270: 00 0 0 04 000 14 0000 0 00 00 ........
00 0280 4e 5 00 7 d9e0 d 9e7f 4 2 be .p......
000 0290 8e8 5f 2 e 6a70 0 0000 0 0 00 _%.jp..
000 0 a0 100 00 00 000 00 2000 80 0 00 ........
00000 b0 000 00 e00 00 755 6110 0000 00 ......gU
0000 c0 000 00 000 00 0000 0000 0000 00 .........
0000 d0: 000 00 0000 0 1500 0000 1200 00 .........
0000 e0: 000 00 0000 0 0 0000 0000 0000 0 ......... .
0000 f0: 860 000 2000 0 0 0000 0000 0000 0 .. .......
0000 00: 000 000 0000 0 0 1000 0000 1200 0 ......... .
0000 10: 000 000 0000 0 0000 0000 0000 0 ......... ..
0000 20: 230 000 1200 00 000 0000 0000 0 ........ ..
0000 0: 000 00 0000 000 0 0000 1200 0 ......^. ...
0000 0: 000 00 0000 0000 000 0000 0 ....... ....
00000 0: a20 00 2000 0000 0 00 0000 0 .. ..... ...
00000 0: 0000 00 00 0 0000 55 0 1200 00 ...... ....
000003 : 0000 0 00 000 000 0 0000 00 ...... .....
000003 3100 0 120 0 0000 0000 00 .... .....
0000039 0000 0 0 0000 0b00 0 200 000 .... .....
00 003a0 0000 0 0 0000 0 000 00 00 000 .... .....
00 03b0 100 0 0 2000 00 000 000 00 000 ... ....
000 c0: 0000 0 0 0000 000 600 0000 0 0000 ... ."...
000 0: 0000 0 0 0000 0000 00 0000 0 0000 ... .....
0000 0: 2a00 0 0 1200 0000 00 0000 0000 * .. .....
00000 : 0000 0 0000 0000 00 0000 1 000 . ..8 ....
000004 : 0000 00 0000 0000 0 0 0000 00 00 .. ... ....
0000041 1d00 00 1100 1800 2 9 2000 000 00 .. .. . ...
0000042 0800 00 000 0000 0 c 6962 632 f .. ...l bc.s
000 0430 e36 006 69 7400 70 5 7473 0070 .6. t.pu s.pu
000 440 68 617 73 7464 69 e 0070 7269 6 ha tdin prin
0000 450: 0 7374 3 7472 00 7 6574 6f70 7 .s r.getopt
0000 60: 5 6374 7 655f 62 f 6c6f 6300 5f _ct _b_loc._
00000 0: 63 15f 66 e61 6c69 7a65 005f 494 xa_ lize._I
00000 : 5f6 574 63 f5f 6c69 6263 5f73 746 get libc_st
00000 : 7274 6d 616 00 474c 4942 435f 322 _ma GLIBC_2.
000004 3300 c 4942 f 322e 3 3500 5f49 GLI 2.2.5._I
000004 544d 5 4 6572 7 6973 74 254 4d43 _de isterTMC
000004 6c6f 6e 5461 6 6500 5f5 6d 6f6e eT e.__gmon
000004 5f73 746 274 5f 05f 4954 f 7265 _ ar ._ITM_re
000004 6769 7374 572 54 36c 6f6e 6 6162 g te CloneTab
000004 6c65 0000 0000 020 00 0200 02 200 l .. ........
000005 0000 0200 0200 020 0 0200 020 00 .. .. ........
000005 : 0200 00 0 0000 0000 0200 010 0 .. .. . .......
000005 : 1000 00 0000 0000 1 90d 0000 0 ..... . i.....
000005 : 7000 00 1000 0000 7 09 0000 0 p.... . i.....
00000 : 7a00 00 0000 0000 80 0 0000 0 z..... . .....
00000 : 0800 00 000 0000 a00 0 0000 0 ........ .....
00000 : 880d 20 0000 0000 080 0000 00 . ...... ....
00000 : 6008 00 0000 0000 0810 0000 00 ........ ....
00000 : 0800 0 0000 0000 0810 0000 000 ....... ....
00000 : d80f 2 0000 0000 0600 0 0200 000 ....... ....
00000 : 0000 0 0000 0000 e00f 2 0000 0000 ...... ....
00000 : 0600 0500 000 0000 00 000 0000 . ...... .....
00000 : e80f 0000 000 0600 00 600 0000 .. ..... ....
00000 : 0000 0 0 0000 000 f00f 20 000 0000 ... ..... ...
00000 : 0600 0 0 0a00 000 000 00 00 0000 ......... ....
0000 : f80f 2 0 0000 000 600 00 00 0000 .. ....... ...
Here's the source (tiger.c):
/* tiger -- Tiger print standard input to standard output. Copyright (C) 2022 Remington Furman This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <getopt.h> #include "tiger.h" #include "leopard.h" void usage(char *name) { printf("usage: cat file | %s [-i] [-h] \n", name); printf(" -i invert pattern\n"); printf(" -h print this help\n"); } int main(int argc, char **argv) { int width = tiger_width; int height = tiger_height; unsigned char *image = tiger_bits; int opt_invert = 0; if (strstr(argv[0], "tiger") != NULL) { width = tiger_width; height = tiger_height; image = tiger_bits; } else if (strstr(argv[0], "leopard") != NULL) { width = leopard_width; height = leopard_height; image = leopard_bits; } int opt; while ((opt = getopt(argc, argv, "ih")) != -1) { switch (opt) { case 'i': opt_invert = 0x1; break; case 'h': usage(argv[0]); exit(EXIT_SUCCESS); break; default: usage(argv[0]); exit(EXIT_FAILURE); } } int x = 0; int y = 0; char c; while ((c = getc(stdin)) != EOF) { if (c == '\n') { x = 0; y = (y+1) % height; } else if (c == '\t') { x = (x+8) % width; } else if (isgraph(c)) { x = (x+1) % width; unsigned char byte = image[y*width + x>>3]; unsigned char pixel = (byte >> (x&7)) & 1; pixel ^= opt_invert; c = pixel ? c : ' '; } putchar(c); } }
All the code (including a Makefile and even a manpage) can be found here: