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

Last change on this file since 4350 was 4350, checked in by Sam Hocevar, 11 years ago

Get rid of $Id$ keywords.

  • Property svn:keywords set to Id
File size: 7.2 KB
Line 
1/*
2 *  TOIlet        The Other Implementation’s letters
3 *  Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
4 *                All Rights Reserved
5 *
6 *  This program is free software. It comes without any warranty, to
7 *  the extent permitted by applicable law. You can redistribute it
8 *  and/or modify it under the terms of the Do What The Fuck You Want
9 *  To Public License, Version 2, as published by Sam Hocevar. See
10 *  http://sam.zoy.org/wtfpl/COPYING for more details.
11 */
12
13/*
14 * This is the main program entry point.
15 */
16
17#include "config.h"
18
19#if defined HAVE_INTTYPES_H
20#   include <inttypes.h>
21#endif
22#if !defined HAVE_GETOPT_LONG
23#   include "mygetopt.h"
24#elif defined HAVE_GETOPT_H
25#   include <getopt.h>
26#endif
27#if defined HAVE_SYS_IOCTL_H && defined HAVE_TIOCGWINSZ
28#   include <sys/ioctl.h>
29#endif
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <caca.h>
34
35#include "toilet.h"
36#include "render.h"
37#include "filter.h"
38#include "export.h"
39
40#if defined HAVE_GETOPT_LONG
41#   define mygetopt getopt_long
42#   define myoptind optind
43#   define myoptarg optarg
44#   define myoption option
45#endif
46
47static void version(void);
48static void usage(void);
49
50int main(int argc, char *argv[])
51{
52    context_t struct_cx;
53    context_t *cx = &struct_cx;
54
55    int infocode = -1;
56
57    cx->export = "utf8";
58    cx->font = "ascii9";
59    cx->dir = FONTDIR;
60
61    cx->term_width = 80;
62
63    cx->hmode = H_DEFAULT;
64
65    cx->filters = NULL;
66    cx->nfilters = 0;
67
68    for(;;)
69    {
70#define MOREINFO "Try `%s --help' for more information.\n"
71        int option_index = 0;
72        static struct myoption long_options[] =
73        {
74            /* Long option, needs arg, flag, short option */
75            { "font", 1, NULL, 'f' },
76            { "directory", 1, NULL, 'd' },
77            { "width", 1, NULL, 'w' },
78            { "termwidth", 0, NULL, 't' },
79            { "filter", 1, NULL, 'F' },
80            { "gay", 0, NULL, 130 },
81            { "metal", 0, NULL, 131 },
82            { "export", 1, NULL, 'E' },
83            { "irc", 0, NULL, 140 },
84            { "html", 0, NULL, 141 },
85            { "help", 0, NULL, 'h' },
86            { "infocode", 1, NULL, 'I' },
87            { "version", 0, NULL, 'v' },
88            { NULL, 0, NULL, 0 }
89        };
90
91        int c = mygetopt(argc, argv, "f:d:w:tsSkWoF:E:hI:v",
92                         long_options, &option_index);
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(myoptarg);
103            break;
104        case 'v': /* --version */
105            version();
106            return 0;
107        case 'f': /* --font */
108            cx->font = myoptarg;
109            break;
110        case 'd': /* --directory */
111            cx->dir = myoptarg;
112            break;
113        case 'F': /* --filter */
114            if(!strcmp(myoptarg, "list"))
115                return filter_list();
116            if(filter_add(cx, myoptarg) < 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(myoptarg);
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->hmode = H_DEFAULT;
142            break;
143        case 'S':
144            cx->hmode = H_SMUSH;
145            break;
146        case 'k':
147            cx->hmode = H_KERN;
148            break;
149        case 'W':
150            cx->hmode = H_NONE;
151            break;
152        case 'o':
153            cx->hmode = H_OVERLAP;
154            break;
155        case 'E': /* --export */
156            if(!strcmp(myoptarg, "list"))
157                return export_list();
158            if(export_set(cx, myoptarg) < 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
177    switch(infocode)
178    {
179        case -1:
180            break;
181        case 0:
182            version();
183            return 0;
184        case 1:
185            printf("20201\n");
186            return 0;
187        case 2:
188            printf("%s\n", cx->dir);
189            return 0;
190        case 3:
191            printf("%s\n", cx->font);
192            return 0;
193        case 4:
194            printf("%u\n", cx->term_width);
195            return 0;
196        default:
197            return 0;
198    }
199
200    if(render_init(cx) < 0)
201        return -1;
202
203    if(myoptind >= argc)
204        render_stdin(cx);
205    else
206        render_list(cx, argc - myoptind, argv + myoptind);
207
208    render_end(cx);
209    filter_end(cx);
210
211    return 0;
212}
213
214#define USAGE \
215    "Usage: toilet [ -hkostvSW ] [ -d fontdirectory ]\n" \
216    "              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]\n" \
217    "              [ -I infocode ] [ -E format ] [ message ]\n"
218
219#define HELP \
220    "  -f, --font <name>        select the font\n" \
221    "  -d, --directory <dir>    specify font directory\n" \
222    "  -s, -S, -k, -W, -o       render mode (default, force smushing,\n" \
223    "                           kerning, full width, overlap)\n" \
224    "  -w, --width <width>      set output width\n" \
225    "  -t, --termwidth          adapt to terminal's width\n" \
226    "  -F, --filter <filters>   apply one or several filters to the text\n" \
227    "  -F, --filter list        list available filters\n" \
228    "      --gay                rainbow filter (same as -F gay)\n" \
229    "      --metal              metal filter (same as -F metal)\n" \
230    "  -E, --export <format>    select export format\n" \
231    "  -E, --export list        list available export formats\n" \
232    "      --irc                output IRC colour codes (same as -E irc)\n" \
233    "      --html               output an HTML document (same as -E html)\n" \
234    "  -h, --help               display this help and exit\n" \
235    "  -I, --infocode <code>    print FIGlet-compatible infocode\n" \
236    "  -v, --version            output version information and exit\n"
237
238static void version(void)
239{
240    printf(
241    "TOIlet Copyright 2006 Sam Hocevar\n"
242    "Internet: <sam@hocevar.net> Version: %s, date: %s\n"
243    "\n"
244    "TOIlet, along with the various TOIlet fonts and documentation, may be\n"
245    "freely copied and distributed.\n"
246    "\n"
247    "If you use TOIlet, please send an e-mail message to <sam@hocevar.net>.\n"
248    "\n"
249    "The latest version of TOIlet is available from the web site,\n"
250    "        http://libcaca.zoy.org/toilet.html\n"
251    "\n"
252    "%s", VERSION, DATE, USAGE);
253}
254
255static void usage(void)
256{
257    printf("%s%s", HELP, USAGE);
258}
259
Note: See TracBrowser for help on using the repository browser.