From 14b47df4525a53d21c1d88d605f66ffe486e7e75 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Oct 2014 16:31:26 +0200 Subject: Fixed --help, also added some randomness. --- lolcat.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 18 deletions(-) (limited to 'lolcat.c') diff --git a/lolcat.c b/lolcat.c index caf83df..87eaeb9 100644 --- a/lolcat.c +++ b/lolcat.c @@ -13,6 +13,9 @@ * 0. You just DO WHAT THE FUCK YOU WANT TO. */ +#define _GNU_SOURCE //for fmemopen + +#include #include #include #include @@ -21,9 +24,35 @@ #include #include #include +#include +#include + +#include "fgetwc_fix.h" + + +static char helpstr[] = "\n" +"Usage: lolcat [-h horizontal_speed] [-v vertical_speed] [--] [FILES...]\n" +"\n" +"Concatenate FILE(s), or standard input, to standard output.\n" +"With no FILE, or when FILE is -, read standard input.\n" +"\n" +" -h : Horizontal rainbow frequency (default: 0.23)\n" +" -v : Vertical rainbow frequency (default: 0.1)\n" +" -f: Force color even when stdout is not a tty\n" +" --version: Print version and exit\n" +" --help: Show this message\n" +"\n" +"Examples:\n" +" lolcat f - g Output f's contents, then stdin, then g's contents.\n" +" lolcat Copy standard input to standard output.\n" +" fortune | lolcat Display a rainbow cookie.\n" +"\n" +"Report lolcat bugs to \n" +"lolcat home page: \n" +"Original idea: \n"; #define ARRAY_SIZE(foo) (sizeof(foo)/sizeof(foo[0])) -char codes[] = {39,38,44,43,49,48,84,83,119,118,154,148,184,178,214,208,209,203,204,198,199,163,164,128,129,93,99,63,69,33}; +const char codes[] = {39,38,44,43,49,48,84,83,119,118,154,148,184,178,214,208,209,203,204,198,199,163,164,128,129,93,99,63,69,33}; /* CAUTION! this function uses a function-static variable! */ void find_escape_sequences(int c, int *state){ @@ -43,10 +72,20 @@ void usage(){ exit(1); } +void version(){ + printf("lolcat version 0.1, (c) 2014 jaseg\n"); + exit(0); +} + int main(int argc, char **argv){ int c, cc=-1, i, l=0; + int colors=(isatty(1) == 1); double freq_h = 0.23, freq_v = 0.1; + struct timeval tv; + gettimeofday(&tv, NULL); + double offx = (tv.tv_sec%300)/300.0; + for(i=1;i 0){ - find_escape_sequences(c, &escape_state); - - if(!escape_state){ - if(c == '\n'){ - l++; - i = 0; - }else if(!iscntrl(c)){ - int ncc = (int)((i++)*freq_h + l*freq_v); - if(cc != ncc) - printf("\033[38;5;%hhum", codes[(cc = ncc) % ARRAY_SIZE(codes)]); + + if(!f){ + fprintf(stderr, "Cannot open input file \"%s\": %s\n", *filename, strerror(errno)); + return 2; + } + + while((c = _fgetwc_fixed(f)) > 0){ + if(colors){ + find_escape_sequences(c, &escape_state); + + if(!escape_state){ + if(c == '\n'){ + l++; + i = 0; + }else if(!iscntrl(c)){ + int ncc = offx*ARRAY_SIZE(codes) + (int)((i++)*freq_h + l*freq_v); + if(cc != ncc) + printf("\033[38;5;%hhum", codes[(cc = ncc) % ARRAY_SIZE(codes)]); + } } } @@ -110,11 +162,11 @@ int main(int argc, char **argv){ printf("\033[38;5;%hhum", codes[cc % ARRAY_SIZE(codes)]); } - if(c != WEOF){ - fprintf(stderr, "Error reading input file \"%s\": %s (%d)\n", *filename, strerror(errno), errno); + fclose(f); + + if(c != WEOF && c != 0){ + fprintf(stderr, "Error reading input file \"%s\": %s\n", *filename, strerror(errno)); return 2; } - - fclose(f); } } -- cgit