diff --git a/test/toilet.c b/test/toilet.c index 19ebb62..0591db1 100644 --- a/test/toilet.c +++ b/test/toilet.c @@ -30,8 +30,8 @@ #include "caca.h" /* String to canvas transformations */ -static cucul_canvas_t *cuculize_big(char const *); -static cucul_canvas_t *cuculize_tiny(char const *); +static cucul_canvas_t *cuculize_big(uint32_t const *, unsigned int); +static cucul_canvas_t *cuculize_tiny(uint32_t const *, unsigned int); /* Canvas special effects */ static void make_gay(cucul_canvas_t *); @@ -41,10 +41,12 @@ int main(int argc, char *argv[]) cucul_canvas_t *cv; cucul_buffer_t *buffer; - char *string = NULL; - unsigned int n; + uint32_t *string = NULL; + unsigned int length; + int i; + char const *export = "utf8"; unsigned flag_gay = 0; #if defined(HAVE_GETOPT_H) @@ -57,15 +59,16 @@ int main(int argc, char *argv[]) { /* Long option, needs arg, flag, short option */ { "gay", 0, NULL, 'g' }, + { "irc", 0, NULL, 'i' }, { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'v' }, { NULL, 0, NULL, 0 } }; - int c = getopt_long(argc, argv, "ghv", long_options, &option_index); + int c = getopt_long(argc, argv, "gihv", long_options, &option_index); # else # define MOREINFO "Try `%s -h' for more information.\n" - int c = getopt(argc, argv, "ghv"); + int c = getopt(argc, argv, "gihv"); # endif if(c == -1) break; @@ -73,20 +76,25 @@ int main(int argc, char *argv[]) switch(c) { case 'h': /* --help */ - printf("Usage: %s [ -ghv ] [ message ]\n", argv[0]); -#ifdef HAVE_GETOPT_LONG + printf("Usage: %s [ -gihv ] [ message ]\n", argv[0]); +# ifdef HAVE_GETOPT_LONG printf(" -g, --gay add a rainbow effect to the text\n"); + printf(" -i, --irc output IRC colour codes\n"); printf(" -h, --help display this help and exit\n"); printf(" -v, --version output version information and exit\n"); -#else +# else printf(" -g add a rainbow effect to the text\n"); + printf(" -i output IRC colour codes\n"); printf(" -h display this help and exit\n"); printf(" -v output version information and exit\n"); -#endif +# endif return 0; case 'g': /* --gay */ flag_gay = 1; break; + case 'i': /* --irc */ + export = "irc"; + break; case 'v': /* --version */ printf("TOIlet Copyright 2006 Sam Hocevar %s\n", VERSION); printf("Internet: Version: 0, date: 21 Sep 2006\n"); @@ -113,23 +121,38 @@ int main(int argc, char *argv[]) return 1; } - for(i = optind, n = 0; i < argc; i++) + /* Load rest of commandline into a UTF-32 string */ + for(i = optind, length = 0; i < argc; i++) { - unsigned int l = strlen(argv[i]); + unsigned int k, guessed_len, real_len; + + guessed_len = strlen(argv[i]); + if(i > optind) - string[n++] = ' '; - string = realloc(string, n + l + 1); - strcpy(string + n, argv[i]); - n += l; + string[length++] = (uint32_t)' '; + + string = realloc(string, (length + guessed_len + 1) * 4); + + for(k = 0, real_len = 0; k < guessed_len; real_len++) + { + unsigned int char_len; + + string[length + real_len] = + cucul_utf8_to_utf32(argv[i] + k, &char_len); + + k += char_len; + } + + length += real_len; } /* Do gay stuff with our string (léopard) */ - cv = cuculize_big(string); + cv = cuculize_big(string, length); if(flag_gay) make_gay(cv); /* Output char */ - buffer = cucul_export_canvas(cv, "utf8"); + buffer = cucul_export_canvas(cv, export); fwrite(cucul_get_buffer_data(buffer), cucul_get_buffer_size(buffer), 1, stdout); cucul_free_buffer(buffer); @@ -139,17 +162,18 @@ int main(int argc, char *argv[]) return 0; } -static cucul_canvas_t *cuculize_big(char const *string) +static cucul_canvas_t *cuculize_big(uint32_t const *string, + unsigned int length) { cucul_canvas_t *cv; cucul_font_t *f; char const * const * fonts; unsigned char *buf; - unsigned int n, w, h, x, y, miny, maxy; + unsigned int w, h, x, y, miny, maxy; - n = strlen(string); - cv = cucul_create_canvas(n, 1); - cucul_putstr(cv, 0, 0, string); + cv = cucul_create_canvas(length, 1); + for(x = 0; x < length; x++) + cucul_putchar(cv, x, 0, string[x]); fonts = cucul_get_font_list(); f = cucul_load_font(fonts[0], 0); @@ -193,12 +217,14 @@ static cucul_canvas_t *cuculize_big(char const *string) return cv; } -static cucul_canvas_t *cuculize_tiny(char const *string) +static cucul_canvas_t *cuculize_tiny(uint32_t const *string, + unsigned int length) { - unsigned int n = strlen(string); - cucul_canvas_t *cv = cucul_create_canvas(n, 1); + unsigned int x; + cucul_canvas_t *cv = cucul_create_canvas(length, 1); - cucul_putstr(cv, 0, 0, string); + for(x = 0; x < length; x++) + cucul_putchar(cv, x, 0, string[x]); return cv; }