diff --git a/src/figlet.c b/src/figlet.c index e977203..7c7c119 100644 --- a/src/figlet.c +++ b/src/figlet.c @@ -25,6 +25,7 @@ #include #include +#include "toilet.h" #include "figlet.h" struct figfont @@ -40,17 +41,19 @@ struct figfont unsigned int *lookup; }; -static struct figfont *open_font(char const *); +static struct figfont *open_font(void); static void free_font(struct figfont *); -cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length, - char const *fontname) +cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length) { cucul_canvas_t *cv; struct figfont *font; unsigned int x, i, c; - font = open_font(fontname); + font = open_font(); + + if(!font) + return NULL; cv = cucul_create_canvas(length * font->max_length, font->height); @@ -75,7 +78,7 @@ cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length, return cv; } -static struct figfont *open_font(char const *fontname) +static struct figfont *open_font(void) { char *data = NULL; char path[2048]; @@ -84,14 +87,20 @@ static struct figfont *open_font(char const *fontname) FILE *f; unsigned int i, j, size, comment_lines; - /* Open font */ - snprintf(path, 2047, "/usr/share/figlet/%s.flf", fontname); + /* Open font: try .tlf, then .flf */ + snprintf(path, 2047, "%s/%s.tlf", toilet_dir, toilet_font); path[2047] = '\0'; f = fopen(path, "r"); if(!f) { - fprintf(stderr, "font `%s' not found\n", path); - return NULL; + snprintf(path, 2047, "%s/%s.flf", toilet_dir, toilet_font); + path[2047] = '\0'; + f = fopen(path, "r"); + if(!f) + { + fprintf(stderr, "font `%s' not found\n", path); + return NULL; + } } font = malloc(sizeof(struct figfont)); @@ -100,7 +109,7 @@ static struct figfont *open_font(char const *fontname) font->print_direction = 0; font->full_layout = 0; font->codetag_count = 0; - if(fscanf(f, "flf2a%c %u %u %u %i %u %u %u %u\n", &font->hardblank, + if(fscanf(f, "%*[ft]lf2a%c %u %u %u %i %u %u %u %u\n", &font->hardblank, &font->height, &font->baseline, &font->max_length, &font->old_layout, &comment_lines, &font->print_direction, &font->full_layout, &font->codetag_count) < 6) @@ -168,7 +177,7 @@ static struct figfont *open_font(char const *fontname) /* Import buffer into canvas */ b = cucul_load_memory(data, i); - font->image = cucul_import_canvas(b, "ansi"); + font->image = cucul_import_canvas(b, "utf8"); cucul_free_buffer(b); free(data); diff --git a/src/figlet.h b/src/figlet.h index cf84840..aab93f0 100644 --- a/src/figlet.h +++ b/src/figlet.h @@ -14,6 +14,5 @@ /* * This header defines functions for handling FIGlet fonts. */ -extern cucul_canvas_t *render_figlet(uint32_t const *, unsigned int, - char const *); +extern cucul_canvas_t *render_figlet(uint32_t const *, unsigned int); diff --git a/src/main.c b/src/main.c index d92885d..f0ca5b1 100644 --- a/src/main.c +++ b/src/main.c @@ -31,10 +31,15 @@ #include #include +#include "toilet.h" #include "render.h" #include "figlet.h" #include "filters.h" +char const *toilet_export = "utf8"; +char const *toilet_font = "mono9"; +char const *toilet_dir = "/usr/share/figlet/"; + static void version(void); #if defined(HAVE_GETOPT_H) static void usage(void); @@ -50,9 +55,6 @@ int main(int argc, char *argv[]) int i; - char const *export = "utf8"; - char const *font = "mono9"; - char const *dir = "/usr/share/figlet/"; unsigned int flag_gay = 0; unsigned int flag_metal = 0; unsigned int term_width = 80; @@ -101,10 +103,10 @@ int main(int argc, char *argv[]) version(); return 0; case 'f': /* --font */ - font = optarg; + toilet_font = optarg; break; case 'd': /* --directory */ - dir = optarg; + toilet_dir = optarg; break; case 'g': /* --gay */ flag_gay = 1; @@ -128,7 +130,7 @@ int main(int argc, char *argv[]) break; } case 'i': /* --irc */ - export = "irc"; + toilet_export = "irc"; break; case '?': printf(MOREINFO, argv[0]); @@ -155,10 +157,10 @@ int main(int argc, char *argv[]) printf("20201\n"); return 0; case 2: - printf("%s\n", dir); + printf("%s\n", toilet_dir); return 0; case 3: - printf("%s\n", font); + printf("%s\n", toilet_font); return 0; case 4: printf("%u\n", term_width); @@ -200,15 +202,18 @@ int main(int argc, char *argv[]) } /* Render string to canvas */ - if(!strcasecmp(font, "mono9")) + if(!strcasecmp(toilet_font, "mono9")) { cv = render_big(string, length); filter_autocrop(cv); } - else if(!strcasecmp(font, "term")) + else if(!strcasecmp(toilet_font, "term")) cv = render_tiny(string, length); else - cv = render_figlet(string, length, font); + cv = render_figlet(string, length); + + if(!cv) + return -1; /* Do gay stuff with our string (léopard) */ if(flag_metal) @@ -217,7 +222,7 @@ int main(int argc, char *argv[]) filter_gay(cv); /* Output char */ - buffer = cucul_export_canvas(cv, export); + buffer = cucul_export_canvas(cv, toilet_export); fwrite(cucul_get_buffer_data(buffer), cucul_get_buffer_size(buffer), 1, stdout); cucul_free_buffer(buffer); diff --git a/src/toilet.h b/src/toilet.h new file mode 100644 index 0000000..a585f31 --- /dev/null +++ b/src/toilet.h @@ -0,0 +1,21 @@ +/* + * TOIlet The Other Implementation’s letters + * Copyright (c) 2006 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Do What The Fuck You Want To + * Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * This header defines global variables. + */ + +extern char const *toilet_export; +extern char const *toilet_font; +extern char const *toilet_dir; +