#include #include #include #include #include #include #define COLOR_BG(C) printf("\x1b[48;2;%i;%i;%im", C.r, C.g, C.b) #define COLOR_FG(C) printf("\x1b[38;2;%i;%i;%im", C.r, C.g, C.b) #define COLOR_RESET printf("\x1b[00m") typedef struct { uint8_t r; uint8_t g; uint8_t b; }color; typedef struct { int stripes; int bars; const char *name; const char *description; const color colors[]; }flag_t; /* common 6-striped pride flag */ flag_t pride_6 = { .stripes = 6, .bars = 1, .name = "pride", .colors = {{.r=0xe7, .g=0x00 ,.b=0x00}, {.r=0xff, .g=0x8c ,.b=0x00}, {.r=0xff, .g=0xef ,.b=0x00}, {.r=0x00, .g=0x81 ,.b=0x1F}, {.r=0x00, .g=0x44 ,.b=0xFF}, {.r=0x76, .g=0x00 ,.b=0x98} } }; /* an ugly attempt at the progress-pride flag */ flag_t pride_progress_pixel = { .stripes = 6, .bars = 9, .name = "progress-pixel", .colors = {{.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00},{.r=0xe7, .g=0x00 ,.b=0x00}, {.r=0xf7, .g=0xa8 ,.b=0xb8},{.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0xff, .g=0x8c ,.b=0x00},{.r=0xff, .g=0x8c ,.b=0x00},{.r=0xff, .g=0x8c ,.b=0x00},{.r=0xff, .g=0x8c ,.b=0x00},{.r=0xff, .g=0x8c ,.b=0x00}, {.r=0xff, .g=0xff ,.b=0xff},{.r=0xf7, .g=0xa8 ,.b=0xb8},{.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0xff, .g=0xef ,.b=0x00},{.r=0xff, .g=0xef ,.b=0x00},{.r=0xff, .g=0xef ,.b=0x00},{.r=0xff, .g=0xef ,.b=0x00}, {.r=0xff, .g=0xff ,.b=0xff},{.r=0xf7, .g=0xa8 ,.b=0xb8},{.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0x00, .g=0x81 ,.b=0x1F},{.r=0x00, .g=0x81 ,.b=0x1F},{.r=0x00, .g=0x81 ,.b=0x1F},{.r=0x00, .g=0x81 ,.b=0x1F}, {.r=0xf7, .g=0xa8 ,.b=0xb8},{.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0x00, .g=0x44 ,.b=0xff},{.r=0x00, .g=0x44 ,.b=0xFF},{.r=0x00, .g=0x44 ,.b=0xFF},{.r=0x00, .g=0x44 ,.b=0xFF},{.r=0x00, .g=0x44 ,.b=0xFF}, {.r=0x55, .g=0xcd ,.b=0xfc},{.r=0x64, .g=0x32 ,.b=0x00},{.r=0x00, .g=0x00 ,.b=0x00},{.r=0x76, .g=0x00 ,.b=0x98},{.r=0x76, .g=0x00 ,.b=0x98},{.r=0x76, .g=0x00 ,.b=0x98},{.r=0x76, .g=0x00 ,.b=0x98},{.r=0x76, .g=0x00 ,.b=0x98},{.r=0x76, .g=0x00 ,.b=0x98} } }; /* 7-striped pride flag */ flag_t pride_7 = { .stripes = 7, .bars = 1, .name = "pride-7", .colors = {{.r=0xff, .g=0x00 ,.b=0x00}, {.r=0xff, .g=0x7f ,.b=0x00}, {.r=0xff, .g=0xff ,.b=0x00}, {.r=0x00, .g=0xff ,.b=0x00}, {.r=0x00, .g=0x00 ,.b=0xff}, {.r=0x00, .g=0x4b ,.b=0x82}, {.r=0x94, .g=0x00 ,.b=0xd3} } }; /* harvey milk pride flag (the original pride flag as made by Gilbert Baker) */ flag_t pride_harvey_milk = { .stripes = 8, .bars = 1, .name = "harvey-milk", .colors = {{.r=0xff, .g=0x69 ,.b=0xb4}, {.r=0xff, .g=0x00 ,.b=0x00}, {.r=0xff, .g=0x8e ,.b=0x00}, {.r=0xf0, .g=0xf0 ,.b=0x00}, {.r=0x00, .g=0x8e ,.b=0x00}, {.r=0x00, .g=0xc0 ,.b=0xc0}, {.r=0x40, .g=0x4b ,.b=0x98}, {.r=0x8e, .g=0x00 ,.b=0x8e} } }; /* New pride flag made by Gilbert Baker in 2017 */ flag_t pride_gilbert_baker_2017 = { .stripes = 9, .bars = 1, .name = "gilbert-baker-2017", .colors = {{.r=0xce, .g=0x66 ,.b=0xff}, {.r=0xff, .g=0x65 ,.b=0x99}, {.r=0xff, .g=0x00 ,.b=0x00}, {.r=0xff, .g=0x99 ,.b=0x00}, {.r=0xff, .g=0xff ,.b=0x01}, {.r=0x00, .g=0x9a ,.b=0x00}, {.r=0x00, .g=0x99 ,.b=0xcc}, {.r=0x34, .g=0x00 ,.b=0x99}, {.r=0x99, .g=0x00 ,.b=0x99} } }; /* philly pride flag */ flag_t pride_philly = { .stripes = 8, .bars = 1, .name = "philly", .colors = {{.r=0x02, .g=0x02 ,.b=0x02}, {.r=0x78, .g=0x4f ,.b=0x17}, {.r=0xe7, .g=0x00 ,.b=0x00}, {.r=0xff, .g=0x8c ,.b=0x00}, {.r=0xff, .g=0xef ,.b=0x00}, {.r=0x00, .g=0x81 ,.b=0x1F}, {.r=0x00, .g=0x44 ,.b=0xFF}, {.r=0x76, .g=0x00 ,.b=0x98} } }; /* (new) lesbian pride flag */ flag_t pride_lesbian = { .stripes = 5, .bars = 1, .name = "lesbian", .colors = {{.r=0xd6, .g=0x29 ,.b=0x00}, {.r=0xff, .g=0x9b ,.b=0x55}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xd4, .g=0x61 ,.b=0xa6}, {.r=0xa5, .g=0x00 ,.b=0x62} } }; /* older (lipstick) lesbian pride flag */ flag_t pride_lesbian_7 = { .stripes = 7, .bars = 1, .name = "lesbian-7", .colors = {{.r=0xd5, .g=0x2d ,.b=0x00}, {.r=0xef, .g=0x76 ,.b=0x27}, {.r=0xff, .g=0x9b ,.b=0x55}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xd4, .g=0x62 ,.b=0xa5}, {.r=0xb5, .g=0x56 ,.b=0x90}, {.r=0xa3, .g=0x02 ,.b=0x62} } }; /* ceterosexual pride flag */ flag_t pride_cetero = { .stripes = 5, .bars = 1, .name = "cetero", .colors = {{.r=0xff, .g=0xfd ,.b=0x01}, {.r=0x21, .g=0x8e ,.b=0x02}, {.r=0xf4, .g=0x56 ,.b=0xe9}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* bisexual pride flag */ flag_t pride_bi = { .stripes = 5, .bars = 1, .name = "bisexual", .colors = {{.r=0xd6, .g=0x02 ,.b=0x70}, {.r=0xd6, .g=0x02 ,.b=0x70}, {.r=0x9b, .g=0x4f ,.b=0x96}, {.r=0x00, .g=0x38 ,.b=0xa8}, {.r=0x00, .g=0x38 ,.b=0xa8} } }; /* pansexual pride flag */ flag_t pride_pan = { .stripes = 3, .bars = 1, .name = "pansexual", .colors = {{.r=0xd6, .g=0x02 ,.b=0x70}, {.r=0xff, .g=0xd8 ,.b=0x00}, {.r=0x00, .g=0x38 ,.b=0xa8} } }; /* polysexual pride flag */ flag_t pride_poly = { .stripes = 3, .bars = 1, .name = "polysexual", .colors = {{.r=0xd6, .g=0x02 ,.b=0x70}, {.r=0x4b, .g=0xb1 ,.b=0x66}, {.r=0x00, .g=0x38 ,.b=0xa8} } }; /* asexual flag */ flag_t pride_ace = { .stripes = 4, .bars = 1, .name = "asexual", .colors = {{.r=0x00, .g=0x00 ,.b=0x00}, {.r=0xc3, .g=0xc3 ,.b=0xc3}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x84, .g=0x06 ,.b=0x7c} } }; /* flag for aromanticism */ flag_t pride_aro = { .stripes = 5, .bars = 1, .name = "aromantic", .colors = {{.r=0x3d, .g=0xa5 ,.b=0x43}, {.r=0xaa, .g=0xce ,.b=0x79}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xa8, .g=0xa8 ,.b=0xa8}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* trans* pride flag */ flag_t pride_trans = { .stripes = 5, .bars = 1, .name = "trans", .colors = {{.r=0x55, .g=0xcd ,.b=0xfc}, {.r=0xf7, .g=0xa8 ,.b=0xb8}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xf7, .g=0xa8 ,.b=0xb8}, {.r=0x55, .g=0xcd ,.b=0xfc} } }; /* flag of the black trans*-community */ flag_t pride_black_trans = { .stripes = 5, .bars = 1, .name = "black-trans", .colors = {{.r=0x55, .g=0xcd ,.b=0xfc}, {.r=0xf7, .g=0xa8 ,.b=0xb8}, {.r=0x00, .g=0x00 ,.b=0x00}, {.r=0xf7, .g=0xa8 ,.b=0xb8}, {.r=0x55, .g=0xcd ,.b=0xfc} } }; /* nonbinary flag */ flag_t pride_nonbinary = { .stripes = 4, .bars = 1, .name = "nonbinary", .colors = {{.r=0xfc, .g=0xf4 ,.b=0x34}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x9c, .g=0x5c ,.b=0xd4}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* genderqueer flag */ flag_t pride_genderqueer = { .stripes = 3, .bars = 1, .name = "genderqueer", .colors = {{.r=0xb5, .g=0x7e ,.b=0xdc}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x4a, .g=0x81 ,.b=0x23} } }; /* neutrois flag */ flag_t pride_neutrois = { .stripes = 3, .bars = 1, .name = "neutrois", .colors = {{.r=0xff, .g=0xff ,.b=0xff}, {.r=0x36, .g=0xab ,.b=0x4f}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* androgyne flag */ flag_t pride_androgyne = { .stripes = 1, .bars = 3, .name = "androgyne", .colors = {{.r=0xfd, .g=0x00 ,.b=0x7e}, {.r=0x98, .g=0x33 ,.b=0xff}, {.r=0x00, .g=0xb6 ,.b=0xe8} } }; /* flag for genderfluidity */ flag_t pride_genderfluid = { .stripes = 5, .bars = 1, .name = "genderfluid", .colors = {{.r=0xee, .g=0x75 ,.b=0xa1}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x8a, .g=0x44 ,.b=0x93}, {.r=0x00, .g=0x00 ,.b=0x00}, {.r=0x37, .g=0x4a ,.b=0x99} } }; /* agender flag */ flag_t pride_agender = { .stripes = 7, .bars = 1, .name = "agender", .colors = {{.r=0x00, .g=0x00 ,.b=0x00}, {.r=0xba, .g=0xba ,.b=0xba}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xb9, .g=0xd4 ,.b=0x7d}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xba, .g=0xba ,.b=0xba}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* demiboy flag */ flag_t pride_demiboy = { .stripes = 7, .bars = 1, .name = "demiboy", .colors = {{.r=0x7f, .g=0x7f ,.b=0x7f}, {.r=0xc3, .g=0xc5 ,.b=0xc4}, {.r=0x9b, .g=0xd5 ,.b=0xe6}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x9b, .g=0xd5 ,.b=0xe6}, {.r=0xc3, .g=0xc5 ,.b=0xc4}, {.r=0x7f, .g=0x7f ,.b=0x7f} } }; /* demigirl flag */ flag_t pride_demigirl = { .stripes = 7, .bars = 1, .name = "demigirl", .colors = {{.r=0x7f, .g=0x7f ,.b=0x7f}, {.r=0xc3, .g=0xc5 ,.b=0xc4}, {.r=0xf7, .g=0xae ,.b=0xc9}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xf7, .g=0xae ,.b=0xc9}, {.r=0xc3, .g=0xc5 ,.b=0xc4}, {.r=0x7f, .g=0x7f ,.b=0x7f} } }; /* bigender flag */ flag_t pride_bigender = { .stripes = 7, .bars = 1, .name = "bigender", .colors = {{.r=0xc4, .g=0x79 ,.b=0xa0}, {.r=0xec, .g=0xa6 ,.b=0xcb}, {.r=0xd6, .g=0xc7 ,.b=0xe7}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xd6, .g=0xc7 ,.b=0xe7}, {.r=0x9b, .g=0xc7 ,.b=0xe8}, {.r=0x6b, .g=0x83 ,.b=0xcf} } }; #define Yellow {.r=0xfe, .g=0xd9, .b=0x05} #define Purple {.r=0x67, .g=0x32, .b=0x8a} flag_t pride_inter = { .stripes = 9, .bars = 15, .name = "inter", .colors = { Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Purple,Purple,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Purple,Yellow,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Purple,Purple,Purple,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow, Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow,Yellow } }; #undef Yellow #undef Purple flag_t test_flag = { .stripes = 4, .bars = 3, .name = "test", .colors = { {0,0,255},{0,255,0},{255,0,0}, {0,255,255},{255,0,255},{255,255,0}, {0,0,0},{128,128,128},{255,255,255}, {255,0,0},{128,0,0},{0,0,0} } }; /* ----- flags end here ----- */ /* index of flags */ flag_t *flags[] = { &pride_6, &pride_progress_pixel, &pride_7, &pride_harvey_milk, &pride_gilbert_baker_2017, &pride_philly, &pride_lesbian, &pride_lesbian_7, &pride_cetero, &pride_bi, &pride_pan, &pride_poly, &pride_ace, &pride_aro, &pride_black_trans, &pride_trans, &pride_nonbinary, &pride_genderfluid, &pride_genderqueer, &pride_neutrois, &pride_androgyne, &pride_agender, &pride_demiboy, &pride_demigirl, &pride_bigender, &pride_inter, &test_flag, NULL}; /* prints bars of a defined length using the unicode 1/8th block characters */ /* width: Width of the bar in characters. */ /* height: position of the division between FG and BG colors. */ /* upper: BG color, acts as the top color of the bar */ /* lower: FG color, acts as the bottom color. */ /* bg_top: Don't show the upper color, instead use an empty (reset) background. */ void print_bar(int width, int height, color upper, color lower, bool bg_top) { if(bg_top){ COLOR_RESET; }else{ COLOR_BG(upper); } COLOR_FG(lower); for(; width; width--){ switch(height){ case 0: fputs(" ",stdout); break; case 1: fputs("▁",stdout); break; case 2: fputs("▂",stdout); break; case 3: fputs("▃",stdout); break; case 4: fputs("▄",stdout); break; case 5: fputs("▅",stdout); break; case 6: fputs("▆",stdout); break; case 7: fputs("▇",stdout); break; default: fputs("█",stdout); } } COLOR_RESET; return; } /* prints scaled flags */ /* if scaling isn't possible, the function returns '1', otherwise it returns '0'. */ /* Scaling fails if the size is smaller than the amount of (horizontal) stripes */ /* *flag: The flag to be printed. */ /* size: The desired size (in lines). */ int flag_sized(flag_t *flag, int size) { if(flag->stripes <= size){ int stripewidth = (size * 8) / flag->stripes; int rest = (size * 8) % flag->stripes; bool transparent = rest?true:false; int breadth = (4 * size) / flag->bars; for(int line = 1; line <= size; line++){ int stripe = (line * 8 - rest) / stripewidth; int offset = (line * 8 - rest) % stripewidth; for(int bar = 1; bar <= flag->bars; bar++){ color fg = flag->colors[stripe * flag->bars + (bar - 1)]; color bg = flag->colors[((stripe)? (stripe - 1): (stripe)) * flag->bars + (bar - 1)]; print_bar(breadth, offset, bg, fg, transparent); } putchar('\n'); transparent = false; } return 0; } return 1; } void flag(flag_t *flag) { flag_sized(flag, 12); return; } /* show available flags with name and description*/ void option_show() { printf("Available flags:\n"); for(int i = 0; flags[i]!=NULL; i++){ printf(" %s\n", flags[i]->name); flag_sized(flags[i], 9); } exit(EXIT_SUCCESS); return; } /* list available flags */ void option_list() { for(int i = 0; flags[i]!=NULL; i++){ printf(" %s\n", flags[i]->name); } exit(EXIT_SUCCESS); return; } void option_help() { printf("pride\n\tPrints pride flags.\n\n"); printf("Format: pride [options] FLAG\n\n"); printf("Options:\n"); printf("\t--help -h : Display this message.\n"); printf("\t--list : Show a list of the available flags.\n"); printf("\t--show : Like --list, but also displays the flags alongside their names.\n"); printf("\t--size -s : Adjusts the size of the flag in lines. Default is 12.\n"); printf("\t example: pride -s 10 lesbian\n"); exit(EXIT_SUCCESS); return; } int main(int argc, char *argv[]) { int size = 0; /* size of the flag, defaults to 12 */ if(argc >= 2){ const int max_option_length = 30; for(int arg = 1; arg < argc; arg++){ if(!strncmp("--list",argv[arg],max_option_length)){ option_list(); }else if(!strncmp("--show",argv[arg],max_option_length)){ option_show(); }else if(!strncmp("-h",argv[arg],max_option_length)|| !strncmp("--help",argv[arg],max_option_length)){ option_help(); }else if(!strncmp("-s",argv[arg],max_option_length)|| !strncmp("--size",argv[arg],max_option_length)){ /* --size, -s : Change the size of the flag in lines.*/ if((arg + 1) < argc){ arg++; size = atoi(argv[arg]); if(size <= 0){ exit(EXIT_FAILURE); } } }else{ /* search for flag */ for(int i = 0; flags[i]!=NULL; i++){ if(!strncmp(flags[i]->name,argv[arg],max_option_length)){ if(size != 0){ flag_sized(flags[i], size); }else{ flag_sized(flags[i], flags[i]->stripes); } exit(EXIT_SUCCESS); } } /* if argument unknown, complain loudly */ fprintf(stderr,"ERROR: invalid option:\t%s\n",argv[arg]); exit(EXIT_FAILURE); } } }else{ /* if no option given, print 6-stripe pride-flag */ flag_sized(&pride_6, 6); } exit(EXIT_SUCCESS); }