source: toilet/trunk/src/main.c @ 1401

Last change on this file since 1401 was 1401, checked in by Sam Hocevar, 14 years ago
  • Smushing support. Yeah baby.
  • Property svn:keywords set to Id
File size: 7.9 KB
Line 
1/*
2 *  TOIlet        The Other Implementation’s letters
3 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id: main.c 1401 2006-11-15 03:29:34Z sam $
7 *
8 *  This program is free software; you can redistribute it and/or
9 *  modify it under the terms of the Do What The Fuck You Want To
10 *  Public License, Version 2, as published by Sam Hocevar. See
11 *  http://sam.zoy.org/wtfpl/COPYING for more details.
12 */
13
14/*
15 * This is the main program entry point.
16 */
17
18#include "config.h"
19
20#if defined(HAVE_INTTYPES_H)
21#   include <inttypes.h>
22#endif
23#if defined(HAVE_GETOPT_H)
24#   include <getopt.h>
25#endif
26#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TIOCGWINSZ)
27#   include <sys/ioctl.h>
28#endif
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <cucul.h>
33
34#include "toilet.h"
35#include "render.h"
36#include "filter.h"
37#include "export.h"
38
39static void version(void);
40#if defined(HAVE_GETOPT_H)
41static void usage(void);
42#endif
43
44int main(int argc, char *argv[])
45{
46    context_t struct_cx;
47    context_t *cx = &struct_cx;
48
49    int infocode = -1;
50
51    cx->export = "utf8";
52    cx->font = "smblock";
53    cx->dir = FONTDIR;
54
55    cx->term_width = 80;
56
57    cx->hlayout = H_DEFAULT;
58
59    cx->filters = NULL;
60    cx->nfilters = 0;
61
62#if defined(HAVE_GETOPT_H)
63    for(;;)
64    {
65#   ifdef HAVE_GETOPT_LONG
66#       define MOREINFO "Try `%s --help' for more information.\n"
67        int option_index = 0;
68        static struct option long_options[] =
69        {
70            /* Long option, needs arg, flag, short option */
71            { "font", 1, NULL, 'f' },
72            { "directory", 1, NULL, 'd' },
73            { "width", 1, NULL, 'w' },
74            { "termwidth", 0, NULL, 't' },
75            { "filter", 1, NULL, 'F' },
76            { "gay", 0, NULL, 130 },
77            { "metal", 0, NULL, 131 },
78            { "export", 1, NULL, 'E' },
79            { "irc", 0, NULL, 140 },
80            { "html", 0, NULL, 141 },
81            { "help", 0, NULL, 'h' },
82            { "infocode", 1, NULL, 'I' },
83            { "version", 0, NULL, 'v' },
84            { NULL, 0, NULL, 0 }
85        };
86
87        int c = getopt_long(argc, argv, "f:d:w:tsSkWoF:E:hI:v",
88                            long_options, &option_index);
89#   else
90#       define MOREINFO "Try `%s -h' for more information.\n"
91        int c = getopt(argc, argv, "f:d:w:tsSkWoF:E:hI:v");
92#   endif
93        if(c == -1)
94            break;
95
96        switch(c)
97        {
98        case 'h': /* --help */
99            usage();
100            return 0;
101        case 'I': /* --infocode */
102            infocode = atoi(optarg);
103            break;
104        case 'v': /* --version */
105            version();
106            return 0;
107        case 'f': /* --font */
108            cx->font = optarg;
109            break;
110        case 'd': /* --directory */
111            cx->dir = optarg;
112            break;
113        case 'F': /* --filter */
114            if(!strcmp(optarg, "list"))
115                return filter_list();
116            if(filter_add(cx, optarg) < 0)
117                return -1;
118            break;
119        case 130: /* --gay */
120            filter_add(cx, "gay");
121            break;
122        case 131: /* --metal */
123            filter_add(cx, "metal");
124            break;
125        case 'w': /* --width */
126            cx->term_width = atoi(optarg);
127            break;
128        case 't': /* --termwidth */
129        {
130#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TIOCGWINSZ)
131            struct winsize ws;
132
133            if((ioctl(1, TIOCGWINSZ, &ws) != -1 ||
134                ioctl(2, TIOCGWINSZ, &ws) != -1 ||
135                ioctl(0, TIOCGWINSZ, &ws) != -1) && ws.ws_col != 0)
136                cx->term_width = ws.ws_col;
137#endif
138            break;
139        }
140        case 's':
141            cx->hlayout = H_DEFAULT;
142            break;
143        case 'S':
144            cx->hlayout = H_SMUSH;
145            break;
146        case 'k':
147            cx->hlayout = H_KERN;
148            break;
149        case 'W':
150            cx->hlayout = H_NONE;
151            break;
152        case 'o':
153            cx->hlayout = H_OVERLAP;
154            break;
155        case 'E': /* --export */
156            if(!strcmp(optarg, "list"))
157                return export_list();
158            if(export_set(cx, optarg) < 0)
159                return -1;
160            break;
161        case 140: /* --irc */
162            export_set(cx, "irc");
163            break;
164        case 141: /* --html */
165            export_set(cx, "html");
166            break;
167        case '?':
168            printf(MOREINFO, argv[0]);
169            return 1;
170        default:
171            printf("%s: invalid option -- %i\n", argv[0], c);
172            printf(MOREINFO, argv[0]);
173            return 1;
174        }
175    }
176#else
177#   define MOREINFO "Usage: %s message...\n"
178    int optind = 1;
179#endif
180
181    switch(infocode)
182    {
183        case -1:
184            break;
185        case 0:
186            version();
187            return 0;
188        case 1:
189            printf("20201\n");
190            return 0;
191        case 2:
192            printf("%s\n", cx->dir);
193            return 0;
194        case 3:
195            printf("%s\n", cx->font);
196            return 0;
197        case 4:
198            printf("%u\n", cx->term_width);
199            return 0;
200        default:
201            return 0;
202    }
203
204    if(render_init(cx) < 0)
205        return -1;
206
207    if(optind >= argc)
208        render_stdin(cx);
209    else
210        render_list(cx, argc - optind, argv + optind);
211
212    render_end(cx);
213    filter_end(cx);
214
215    return 0;
216}
217
218#if defined(HAVE_GETOPT_H)
219#   define USAGE \
220    "Usage: toilet [ -htv ] [ -d fontdirectory ]\n" \
221    "              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]\n" \
222    "              [ -I infocode ] [ -E format ] [ message ]\n"
223#else
224#   define USAGE ""
225#endif
226
227static void version(void)
228{
229    printf(
230    "TOIlet Copyright 2006 Sam Hocevar\n"
231    "Internet: <sam@zoy.org> Version: %s, date: %s\n"
232    "\n"
233    "TOIlet, along with the various TOIlet fonts and documentation, may be\n"
234    "freely copied and distributed.\n"
235    "\n"
236    "If you use TOIlet, please send an e-mail message to <sam@zoy.org>.\n"
237    "\n"
238    "The latest version of TOIlet is available from the web site,\n"
239    "        http://libcaca.zoy.org/toilet.html\n"
240    "\n"
241    USAGE,
242    VERSION, DATE);
243}
244
245#if defined(HAVE_GETOPT_H)
246static void usage(void)
247{
248    printf(USAGE);
249#   ifdef HAVE_GETOPT_LONG
250    printf("  -f, --font <name>        select the font\n");
251    printf("  -d, --directory <dir>    specify font directory\n");
252    printf("  -w, --width <width>      set output width\n");
253    printf("  -t, --termwidth          adapt to terminal's width\n");
254    printf("  -F, --filter <filters>   apply one or several filters to the text\n");
255    printf("  -F, --filter list        list available filters\n");
256    printf("      --gay                rainbow filter (same as -F gay)\n");
257    printf("      --metal              metal filter (same as -F metal)\n");
258    printf("  -E, --export <format>    select export format\n");
259    printf("  -E, --export list        list available export formats\n");
260    printf("      --irc                output IRC colour codes (same as -E irc)\n");
261    printf("      --html               output an HTML document (same as -E html)\n");
262    printf("  -h, --help               display this help and exit\n");
263    printf("  -I, --infocode <code>    print FIGlet-compatible infocode\n");
264    printf("  -v, --version            output version information and exit\n");
265#   else
266    printf("  -f <name>        select the font\n");
267    printf("  -d <dir>         specify font directory\n");
268    printf("  -w <width>       set output width\n");
269    printf("  -t               adapt to terminal's width\n");
270    printf("  -F <filters>     apply one or several filters to the text\n");
271    printf("  -F list          list available filters\n");
272    printf("  -E <format>      select export format\n");
273    printf("  -E list          list available export formats\n");
274    printf("  -h               display this help and exit\n");
275    printf("  -I <code>        print FIGlet-compatible infocode\n");
276    printf("  -v               output version information and exit\n");
277#   endif
278}
279#endif
280
Note: See TracBrowser for help on using the repository browser.