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

Last change on this file since 1326 was 1326, checked in by Sam Hocevar, 13 years ago
  • Allow setting the font directory using --datadir / --datarootdir.
  • Property svn:keywords set to Id
File size: 7.5 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 1326 2006-11-10 14:30:22Z 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->filters = NULL;
58    cx->nfilters = 0;
59
60#if defined(HAVE_GETOPT_H)
61    for(;;)
62    {
63#   ifdef HAVE_GETOPT_LONG
64#       define MOREINFO "Try `%s --help' for more information.\n"
65        int option_index = 0;
66        static struct option long_options[] =
67        {
68            /* Long option, needs arg, flag, short option */
69            { "font", 1, NULL, 'f' },
70            { "directory", 1, NULL, 'd' },
71            { "width", 1, NULL, 'w' },
72            { "termwidth", 0, NULL, 't' },
73            { "filter", 1, NULL, 'F' },
74            { "gay", 0, NULL, 130 },
75            { "metal", 0, NULL, 131 },
76            { "export", 1, NULL, 'E' },
77            { "irc", 0, NULL, 140 },
78            { "html", 0, NULL, 141 },
79            { "help", 0, NULL, 'h' },
80            { "infocode", 1, NULL, 'I' },
81            { "version", 0, NULL, 'v' },
82            { NULL, 0, NULL, 0 }
83        };
84
85        int c = getopt_long(argc, argv, "f:d:w:tF:E:hI:v",
86                            long_options, &option_index);
87#   else
88#       define MOREINFO "Try `%s -h' for more information.\n"
89        int c = getopt(argc, argv, "f:d:w:tF:E:hI:v");
90#   endif
91        if(c == -1)
92            break;
93
94        switch(c)
95        {
96        case 'h': /* --help */
97            usage();
98            return 0;
99        case 'I': /* --infocode */
100            infocode = atoi(optarg);
101            break;
102        case 'v': /* --version */
103            version();
104            return 0;
105        case 'f': /* --font */
106            cx->font = optarg;
107            break;
108        case 'd': /* --directory */
109            cx->dir = optarg;
110            break;
111        case 'F': /* --filter */
112            if(!strcmp(optarg, "list"))
113                return filter_list();
114            if(filter_add(cx, optarg) < 0)
115                return -1;
116            break;
117        case 130: /* --gay */
118            filter_add(cx, "gay");
119            break;
120        case 131: /* --metal */
121            filter_add(cx, "metal");
122            break;
123        case 'w': /* --width */
124            cx->term_width = atoi(optarg);
125            break;
126        case 't': /* --termwidth */
127        {
128#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TIOCGWINSZ)
129            struct winsize ws;
130
131            if((ioctl(1, TIOCGWINSZ, &ws) != -1 ||
132                ioctl(2, TIOCGWINSZ, &ws) != -1 ||
133                ioctl(0, TIOCGWINSZ, &ws) != -1) && ws.ws_col != 0)
134                cx->term_width = ws.ws_col;
135#endif
136            break;
137        }
138        case 'E': /* --export */
139            if(!strcmp(optarg, "list"))
140                return export_list();
141            if(export_set(cx, optarg) < 0)
142                return -1;
143            break;
144        case 140: /* --irc */
145            export_set(cx, "irc");
146            break;
147        case 141: /* --html */
148            export_set(cx, "html");
149            break;
150        case '?':
151            printf(MOREINFO, argv[0]);
152            return 1;
153        default:
154            printf("%s: invalid option -- %i\n", argv[0], c);
155            printf(MOREINFO, argv[0]);
156            return 1;
157        }
158    }
159#else
160#   define MOREINFO "Usage: %s message...\n"
161    int optind = 1;
162#endif
163
164    switch(infocode)
165    {
166        case -1:
167            break;
168        case 0:
169            version();
170            return 0;
171        case 1:
172            printf("20201\n");
173            return 0;
174        case 2:
175            printf("%s\n", cx->dir);
176            return 0;
177        case 3:
178            printf("%s\n", cx->font);
179            return 0;
180        case 4:
181            printf("%u\n", cx->term_width);
182            return 0;
183        default:
184            return 0;
185    }
186
187    if(render_init(cx) < 0)
188        return -1;
189
190    if(optind >= argc)
191        render_stdin(cx);
192    else
193        render_list(cx, argc - optind, argv + optind);
194
195    render_end(cx);
196    filter_end(cx);
197
198    return 0;
199}
200
201#if defined(HAVE_GETOPT_H)
202#   define USAGE \
203    "Usage: toilet [ -htv ] [ -d fontdirectory ]\n" \
204    "              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]\n" \
205    "              [ -I infocode ] [ -E format ] [ message ]\n"
206#else
207#   define USAGE ""
208#endif
209
210static void version(void)
211{
212    printf(
213    "TOIlet Copyright 2006 Sam Hocevar\n"
214    "Internet: <sam@zoy.org> Version: %s, date: %s\n"
215    "\n"
216    "TOIlet, along with the various TOIlet fonts and documentation, may be\n"
217    "freely copied and distributed.\n"
218    "\n"
219    "If you use TOIlet, please send an e-mail message to <sam@zoy.org>.\n"
220    "\n"
221    "The latest version of TOIlet is available from the web site,\n"
222    "        http://libcaca.zoy.org/toilet.html\n"
223    "\n"
224    USAGE,
225    VERSION, DATE);
226}
227
228#if defined(HAVE_GETOPT_H)
229static void usage(void)
230{
231    printf(USAGE);
232#   ifdef HAVE_GETOPT_LONG
233    printf("  -f, --font <name>        select the font\n");
234    printf("  -d, --directory <dir>    specify font directory\n");
235    printf("  -w, --width <width>      set output width\n");
236    printf("  -t, --termwidth          adapt to terminal's width\n");
237    printf("  -F, --filter <filters>   apply one or several filters to the text\n");
238    printf("  -F, --filter list        list available filters\n");
239    printf("      --gay                rainbow filter (same as -F gay)\n");
240    printf("      --metal              metal filter (same as -F metal)\n");
241    printf("  -E, --export <format>    select export format\n");
242    printf("  -E, --export list        list available export formats\n");
243    printf("      --irc                output IRC colour codes (same as -E irc)\n");
244    printf("      --html               output an HTML document (same as -E html)\n");
245    printf("  -h, --help               display this help and exit\n");
246    printf("  -I, --infocode <code>    print FIGlet-compatible infocode\n");
247    printf("  -v, --version            output version information and exit\n");
248#   else
249    printf("  -f <name>        select the font\n");
250    printf("  -d <dir>         specify font directory\n");
251    printf("  -w <width>       set output width\n");
252    printf("  -t               adapt to terminal's width\n");
253    printf("  -F <filters>     apply one or several filters to the text\n");
254    printf("  -F list          list available filters\n");
255    printf("  -E <format>      select export format\n");
256    printf("  -E list          list available export formats\n");
257    printf("  -h               display this help and exit\n");
258    printf("  -I <code>        print FIGlet-compatible infocode\n");
259    printf("  -v               output version information and exit\n");
260#   endif
261}
262#endif
263
Note: See TracBrowser for help on using the repository browser.