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

Last change on this file since 4681 was 4681, checked in by Sam Hocevar, 10 years ago

Remove the build dependency on the getopt implementation and use libcaca
instead.

  • Property svn:keywords set to Id
File size: 6.9 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_SYS_IOCTL_H && defined HAVE_TIOCGWINSZ
23#   include <sys/ioctl.h>
24#endif
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <caca.h>
29
30#include "toilet.h"
31#include "render.h"
32#include "filter.h"
33#include "export.h"
34
35static void version(void);
36static void usage(void);
37
38int main(int argc, char *argv[])
39{
40    context_t struct_cx;
41    context_t *cx = &struct_cx;
42
43    int infocode = -1;
44
45    cx->export = "utf8";
46    cx->font = "ascii9";
47    cx->dir = FONTDIR;
48
49    cx->term_width = 80;
50
51    cx->hmode = H_DEFAULT;
52
53    cx->filters = NULL;
54    cx->nfilters = 0;
55
56    for(;;)
57    {
58#define MOREINFO "Try `%s --help' for more information.\n"
59        int option_index = 0;
60        static struct caca_option long_options[] =
61        {
62            /* Long option, needs arg, flag, short option */
63            { "font", 1, NULL, 'f' },
64            { "directory", 1, NULL, 'd' },
65            { "width", 1, NULL, 'w' },
66            { "termwidth", 0, NULL, 't' },
67            { "filter", 1, NULL, 'F' },
68            { "gay", 0, NULL, 130 },
69            { "metal", 0, NULL, 131 },
70            { "export", 1, NULL, 'E' },
71            { "irc", 0, NULL, 140 },
72            { "html", 0, NULL, 141 },
73            { "help", 0, NULL, 'h' },
74            { "infocode", 1, NULL, 'I' },
75            { "version", 0, NULL, 'v' },
76            { NULL, 0, NULL, 0 }
77        };
78
79        int c = caca_getopt(argc, argv, "f:d:w:tsSkWoF:E:hI:v",
80                            long_options, &option_index);
81        if(c == -1)
82            break;
83
84        switch(c)
85        {
86        case 'h': /* --help */
87            usage();
88            return 0;
89        case 'I': /* --infocode */
90            infocode = atoi(caca_optarg);
91            break;
92        case 'v': /* --version */
93            version();
94            return 0;
95        case 'f': /* --font */
96            cx->font = caca_optarg;
97            break;
98        case 'd': /* --directory */
99            cx->dir = caca_optarg;
100            break;
101        case 'F': /* --filter */
102            if(!strcmp(caca_optarg, "list"))
103                return filter_list();
104            if(filter_add(cx, caca_optarg) < 0)
105                return -1;
106            break;
107        case 130: /* --gay */
108            filter_add(cx, "gay");
109            break;
110        case 131: /* --metal */
111            filter_add(cx, "metal");
112            break;
113        case 'w': /* --width */
114            cx->term_width = atoi(caca_optarg);
115            break;
116        case 't': /* --termwidth */
117        {
118#if defined HAVE_SYS_IOCTL_H && defined HAVE_TIOCGWINSZ
119            struct winsize ws;
120
121            if((ioctl(1, TIOCGWINSZ, &ws) != -1 ||
122                ioctl(2, TIOCGWINSZ, &ws) != -1 ||
123                ioctl(0, TIOCGWINSZ, &ws) != -1) && ws.ws_col != 0)
124                cx->term_width = ws.ws_col;
125#endif
126            break;
127        }
128        case 's':
129            cx->hmode = H_DEFAULT;
130            break;
131        case 'S':
132            cx->hmode = H_SMUSH;
133            break;
134        case 'k':
135            cx->hmode = H_KERN;
136            break;
137        case 'W':
138            cx->hmode = H_NONE;
139            break;
140        case 'o':
141            cx->hmode = H_OVERLAP;
142            break;
143        case 'E': /* --export */
144            if(!strcmp(caca_optarg, "list"))
145                return export_list();
146            if(export_set(cx, caca_optarg) < 0)
147                return -1;
148            break;
149        case 140: /* --irc */
150            export_set(cx, "irc");
151            break;
152        case 141: /* --html */
153            export_set(cx, "html");
154            break;
155        case '?':
156            printf(MOREINFO, argv[0]);
157            return 1;
158        default:
159            printf("%s: invalid option -- %i\n", argv[0], c);
160            printf(MOREINFO, argv[0]);
161            return 1;
162        }
163    }
164
165    switch(infocode)
166    {
167        case -1:
168            break;
169        case 0:
170            version();
171            return 0;
172        case 1:
173            printf("20201\n");
174            return 0;
175        case 2:
176            printf("%s\n", cx->dir);
177            return 0;
178        case 3:
179            printf("%s\n", cx->font);
180            return 0;
181        case 4:
182            printf("%u\n", cx->term_width);
183            return 0;
184        default:
185            return 0;
186    }
187
188    if(render_init(cx) < 0)
189        return -1;
190
191    if(caca_optind >= argc)
192        render_stdin(cx);
193    else
194        render_list(cx, argc - caca_optind, argv + caca_optind);
195
196    render_end(cx);
197    filter_end(cx);
198
199    return 0;
200}
201
202#define USAGE \
203    "Usage: toilet [ -hkostvSW ] [ -d fontdirectory ]\n" \
204    "              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]\n" \
205    "              [ -I infocode ] [ -E format ] [ message ]\n"
206
207#define HELP \
208    "  -f, --font <name>        select the font\n" \
209    "  -d, --directory <dir>    specify font directory\n" \
210    "  -s, -S, -k, -W, -o       render mode (default, force smushing,\n" \
211    "                           kerning, full width, overlap)\n" \
212    "  -w, --width <width>      set output width\n" \
213    "  -t, --termwidth          adapt to terminal's width\n" \
214    "  -F, --filter <filters>   apply one or several filters to the text\n" \
215    "  -F, --filter list        list available filters\n" \
216    "      --gay                rainbow filter (same as -F gay)\n" \
217    "      --metal              metal filter (same as -F metal)\n" \
218    "  -E, --export <format>    select export format\n" \
219    "  -E, --export list        list available export formats\n" \
220    "      --irc                output IRC colour codes (same as -E irc)\n" \
221    "      --html               output an HTML document (same as -E html)\n" \
222    "  -h, --help               display this help and exit\n" \
223    "  -I, --infocode <code>    print FIGlet-compatible infocode\n" \
224    "  -v, --version            output version information and exit\n"
225
226static void version(void)
227{
228    printf(
229    "TOIlet Copyright 2006 Sam Hocevar\n"
230    "Internet: <sam@hocevar.net> Version: %s, date: %s\n"
231    "\n"
232    "TOIlet, along with the various TOIlet fonts and documentation, may be\n"
233    "freely copied and distributed.\n"
234    "\n"
235    "If you use TOIlet, please send an e-mail message to <sam@hocevar.net>.\n"
236    "\n"
237    "The latest version of TOIlet is available from the web site,\n"
238    "        http://libcaca.zoy.org/toilet.html\n"
239    "\n"
240    "%s", VERSION, DATE, USAGE);
241}
242
243static void usage(void)
244{
245    printf("%s%s", HELP, USAGE);
246}
247
Note: See TracBrowser for help on using the repository browser.