#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; const char *name; const char *description; const color colors[]; }flag_horizontal_t; /* common 6-striped pride flag */ flag_horizontal_t pride_6 = { .stripes = 6, .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} } }; /* 7-striped pride flag */ flag_horizontal_t pride_7 = { .stripes = 7, .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) */ flag_horizontal_t pride_harvey_milk = { .stripes = 8, .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} } }; /* philly pride flag */ flag_horizontal_t pride_philly = { .stripes = 8, .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_horizontal_t pride_lesbian = { .stripes = 5, .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_horizontal_t pride_lesbian_7 = { .stripes = 7, .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} } }; /* bisexual pride flag */ flag_horizontal_t pride_bi = { .stripes = 5, .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_horizontal_t pride_pan = { .stripes = 3, .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_horizontal_t pride_poly = { .stripes = 3, .name = "polysexual", .colors = {{.r=0xd6, .g=0x02 ,.b=0x70}, {.r=0x4b, .g=0xb1 ,.b=0x66}, {.r=0x00, .g=0x38 ,.b=0xa8} } }; /* asexual flag */ flag_horizontal_t pride_ace = { .stripes = 4, .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_horizontal_t pride_aro = { .stripes = 5, .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_horizontal_t pride_trans = { .stripes = 5, .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_horizontal_t pride_black_trans = { .stripes = 5, .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_horizontal_t pride_nonbinary = { .stripes = 4, .name = "nonbinary", .colors = {{.r=0x9c, .g=0x5c ,.b=0xd4}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0xfc, .g=0xf4 ,.b=0x34}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* genderqueer flag */ flag_horizontal_t pride_genderqueer = { .stripes = 3, .name = "genderqueer", .colors = {{.r=0xb5, .g=0x7e ,.b=0xdc}, {.r=0xff, .g=0xff ,.b=0xff}, {.r=0x4a, .g=0x81 ,.b=0x23} } }; /* neutrois flag */ flag_horizontal_t pride_neutrois = { .stripes = 3, .name = "neutrois", .colors = {{.r=0xff, .g=0xff ,.b=0xff}, {.r=0x36, .g=0xab ,.b=0x4f}, {.r=0x00, .g=0x00 ,.b=0x00} } }; /* flag for genderfluidity */ flag_horizontal_t pride_genderfluid = { .stripes = 5, .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_horizontal_t pride_agender = { .stripes = 7, .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_horizontal_t pride_demiboy = { .stripes = 7, .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_horizontal_t pride_demigirl = { .stripes = 7, .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_horizontal_t pride_bigender = { .stripes = 7, .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} } }; /* ----- flags end here ----- */ /* index of flags */ flag_horizontal_t *flags[] = { &pride_6, &pride_7, &pride_harvey_milk, &pride_philly, &pride_lesbian, &pride_lesbian_7, &pride_bi, &pride_pan, &pride_poly, &pride_ace, &pride_aro, &pride_black_trans, &pride_trans, &pride_nonbinary, &pride_genderfluid, &pride_genderqueer, &pride_neutrois, &pride_agender, &pride_demiboy, &pride_demigirl, &pride_bigender, NULL}; /* prints flags made solely made from horizontal bars */ void flag_horizontal(flag_horizontal_t *flag) { for(int i=0; istripes; i++){ COLOR_BG(flag->colors[i]); /* aspect ratio is hardcoded here */ for(int spaces=flag->stripes*3; spaces>0; spaces--){ putchar(' '); } COLOR_RESET; putchar('\n'); } return; } int main(int argc, char *argv[]) { if(argc >= 2){ const int max_option_length = 30; for(int arg = 1; arg <= argc; arg++){ if(!strncmp("--list",argv[arg],max_option_length)){ /* list available flags */ for(int i = 0; flags[i]!=NULL; i++){ printf(" %s\n", flags[i]->name); } exit(EXIT_SUCCESS); }else if(!strncmp("--show",argv[arg],max_option_length)){ /* show available flags with name and description*/ for(int i = 0; flags[i]!=NULL; i++){ printf(" %s\n", flags[i]->name); flag_horizontal(flags[i]); } exit(EXIT_SUCCESS); }else{ /* search for flag */ for(int i = 0; flags[i]!=NULL; i++){ if(!strncmp(flags[i]->name,argv[arg],max_option_length)){ flag_horizontal(flags[i]); 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_horizontal(&pride_6); } exit(EXIT_SUCCESS); }