/* * 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 is the main program entry point. */ #include "config.h" #if defined(HAVE_INTTYPES_H) # include #endif #if defined(HAVE_GETOPT_H) # include #endif #if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TIOCGWINSZ) # include #endif #include #include #include #include #include "toilet.h" #include "render.h" #include "filter.h" #include "export.h" static void version(void); #if defined(HAVE_GETOPT_H) static void usage(void); #endif int main(int argc, char *argv[]) { context_t struct_cx; context_t *cx = &struct_cx; int infocode = -1; cx->export = "utf8"; cx->font = "smblock"; cx->dir = "/usr/share/figlet/"; cx->term_width = 80; cx->filters = NULL; cx->nfilters = 0; #if defined(HAVE_GETOPT_H) for(;;) { # ifdef HAVE_GETOPT_LONG # define MOREINFO "Try `%s --help' for more information.\n" int option_index = 0; static struct option long_options[] = { /* Long option, needs arg, flag, short option */ { "font", 1, NULL, 'f' }, { "directory", 1, NULL, 'd' }, { "width", 1, NULL, 'w' }, { "termwidth", 0, NULL, 't' }, { "filter", 1, NULL, 'F' }, { "gay", 0, NULL, 130 }, { "metal", 0, NULL, 131 }, { "export", 1, NULL, 'E' }, { "irc", 0, NULL, 140 }, { "html", 0, NULL, 141 }, { "help", 0, NULL, 'h' }, { "infocode", 1, NULL, 'I' }, { "version", 0, NULL, 'v' }, { NULL, 0, NULL, 0 } }; int c = getopt_long(argc, argv, "f:d:w:tF:E:hI:v", long_options, &option_index); # else # define MOREINFO "Try `%s -h' for more information.\n" int c = getopt(argc, argv, "f:d:w:tF:E:hI:v"); # endif if(c == -1) break; switch(c) { case 'h': /* --help */ usage(); return 0; case 'I': /* --infocode */ infocode = atoi(optarg); break; case 'v': /* --version */ version(); return 0; case 'f': /* --font */ cx->font = optarg; break; case 'd': /* --directory */ cx->dir = optarg; break; case 'F': /* --filter */ if(!strcmp(optarg, "list")) return filter_list(); if(filter_add(cx, optarg) < 0) return -1; break; case 130: /* --gay */ filter_add(cx, "gay"); break; case 131: /* --metal */ filter_add(cx, "metal"); break; case 'w': /* --width */ cx->term_width = atoi(optarg); break; case 't': /* --termwidth */ { #if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TIOCGWINSZ) struct winsize ws; if((ioctl(1, TIOCGWINSZ, &ws) != -1 || ioctl(2, TIOCGWINSZ, &ws) != -1 || ioctl(0, TIOCGWINSZ, &ws) != -1) && ws.ws_col != 0) cx->term_width = ws.ws_col; #endif break; } case 'E': /* --export */ if(!strcmp(optarg, "list")) return export_list(); if(export_set(cx, optarg) < 0) return -1; break; case 140: /* --irc */ export_set(cx, "irc"); break; case 141: /* --html */ export_set(cx, "html"); break; case '?': printf(MOREINFO, argv[0]); return 1; default: printf("%s: invalid option -- %i\n", argv[0], c); printf(MOREINFO, argv[0]); return 1; } } #else # define MOREINFO "Usage: %s message...\n" int optind = 1; #endif switch(infocode) { case -1: break; case 0: version(); return 0; case 1: printf("20201\n"); return 0; case 2: printf("%s\n", cx->dir); return 0; case 3: printf("%s\n", cx->font); return 0; case 4: printf("%u\n", cx->term_width); return 0; default: return 0; } if(render_init(cx) < 0) return -1; if(optind >= argc) render_stdin(cx); else render_list(cx, argc - optind, argv + optind); render_end(cx); filter_end(cx); return 0; } #if defined(HAVE_GETOPT_H) # define USAGE \ "Usage: toilet [ -htv ] [ -d fontdirectory ]\n" \ " [ -f fontfile ] [ -F filter ] [ -w outputwidth ]\n" \ " [ -I infocode ] [ -E format ] [ message ]\n" #else # define USAGE "" #endif static void version(void) { printf( "TOIlet Copyright 2006 Sam Hocevar\n" "Internet: Version: %s, date: %s\n" "\n" "TOIlet, along with the various TOIlet fonts and documentation, may be\n" "freely copied and distributed.\n" "\n" "If you use TOIlet, please send an e-mail message to .\n" "\n" "The latest version of TOIlet is available from the web site,\n" " http://libcaca.zoy.org/toilet.html\n" "\n" USAGE, VERSION, DATE); } #if defined(HAVE_GETOPT_H) static void usage(void) { printf(USAGE); # ifdef HAVE_GETOPT_LONG printf(" -f, --font select the font\n"); printf(" -d, --directory specify font directory\n"); printf(" -w, --width set output width\n"); printf(" -t, --termwidth adapt to terminal's width\n"); printf(" -F, --filter apply one or several filters to the text\n"); printf(" -F, --filter list list available filters\n"); printf(" --gay rainbow filter (same as -F gay)\n"); printf(" --metal metal filter (same as -F metal)\n"); printf(" -E, --export select export format\n"); printf(" -E, --export list list available export formats\n"); printf(" --irc output IRC colour codes (same as -E irc)\n"); printf(" --html output an HTML document (same as -E html)\n"); printf(" -h, --help display this help and exit\n"); printf(" -I, --infocode print FIGlet-compatible infocode\n"); printf(" -v, --version output version information and exit\n"); # else printf(" -f select the font\n"); printf(" -d specify font directory\n"); printf(" -w set output width\n"); printf(" -t adapt to terminal's width\n"); printf(" -F apply one or several filters to the text\n"); printf(" -F list list available filters\n"); printf(" -E select export format\n"); printf(" -E list list available export formats\n"); printf(" -h display this help and exit\n"); printf(" -I print FIGlet-compatible infocode\n"); printf(" -v output version information and exit\n"); # endif } #endif