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

Last change on this file since 1115 was 1115, checked in by Sam Hocevar, 13 years ago
  • Added -d and completed -I options.
  • Property svn:keywords set to Id
File size: 6.7 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 1115 2006-09-26 23:13:01Z 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#include <stdio.h>
27#include <string.h>
28#include <stdlib.h>
29#include <cucul.h>
30
31#include "render.h"
32#include "figlet.h"
33#include "filters.h"
34
35static void version(void);
36#if defined(HAVE_GETOPT_H)
37static void usage(void);
38#endif
39
40int main(int argc, char *argv[])
41{
42    cucul_canvas_t *cv;
43    cucul_buffer_t *buffer;
44
45    uint32_t *string = NULL;
46    unsigned int length;
47
48    int i;
49
50    char const *export = "utf8";
51    char const *font = "mono9";
52    char const *dir = "/usr/share/figlet/";
53    unsigned int flag_gay = 0;
54    unsigned int flag_metal = 0;
55    unsigned int term_width = 80;
56    int infocode = -1;
57
58#if defined(HAVE_GETOPT_H)
59    for(;;)
60    {
61#   ifdef HAVE_GETOPT_LONG
62#       define MOREINFO "Try `%s --help' for more information.\n"
63        int option_index = 0;
64        static struct option long_options[] =
65        {
66            /* Long option, needs arg, flag, short option */
67            { "font", 1, NULL, 'f' },
68            { "directory", 1, NULL, 'd' },
69            { "width", 1, NULL, 'w' },
70            { "gay", 0, NULL, 'g' },
71            { "metal", 0, NULL, 'm' },
72            { "irc", 0, NULL, 'i' },
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 = getopt_long(argc, argv, "d:f:I:w:ghimv",
80                            long_options, &option_index);
81#   else
82#       define MOREINFO "Try `%s -h' for more information.\n"
83        int c = getopt(argc, argv, "d:f:I:w:ghimv");
84#   endif
85        if(c == -1)
86            break;
87
88        switch(c)
89        {
90        case 'h': /* --help */
91            usage();
92            return 0;
93        case 'I': /* --infocode */
94            infocode = atoi(optarg);
95            break;
96        case 'v': /* --version */
97            version();
98            return 0;
99        case 'f': /* --font */
100            font = optarg;
101            break;
102        case 'd': /* --directory */
103            dir = optarg;
104            break;
105        case 'g': /* --gay */
106            flag_gay = 1;
107            break;
108        case 'm': /* --metal */
109            flag_metal = 1;
110            break;
111        case 'w': /* --width */
112            term_width = atoi(optarg);
113            break;
114        case 'i': /* --irc */
115            export = "irc";
116            break;
117        case '?':
118            printf(MOREINFO, argv[0]);
119            return 1;
120        default:
121            printf("%s: invalid option -- %i\n", argv[0], c);
122            printf(MOREINFO, argv[0]);
123            return 1;
124        }
125    }
126#else
127#   define MOREINFO "Usage: %s message...\n"
128    int optind = 1;
129#endif
130
131    switch(infocode)
132    {
133        case -1:
134            break;
135        case 0:
136            version();
137            return 0;
138        case 1:
139            printf("20201\n");
140            return 0;
141        case 2:
142            printf("%s\n", dir);
143            return 0;
144        case 3:
145            printf("%s\n", font);
146            return 0;
147        case 4:
148            printf("%u\n", term_width);
149            return 0;
150        default:
151            return 0;
152    }
153
154    if(optind >= argc)
155    {
156        printf("%s: too few arguments\n", argv[0]);
157        printf(MOREINFO, argv[0]);
158        return 1;
159    }
160
161    /* Load rest of commandline into a UTF-32 string */
162    for(i = optind, length = 0; i < argc; i++)
163    {
164        unsigned int k, guessed_len, real_len;
165
166        guessed_len = strlen(argv[i]);
167
168        if(i > optind)
169            string[length++] = (uint32_t)' ';
170
171        string = realloc(string, (length + guessed_len + 1) * 4);
172
173        for(k = 0, real_len = 0; k < guessed_len; real_len++)
174        {
175            unsigned int char_len;
176
177            string[length + real_len] =
178                cucul_utf8_to_utf32(argv[i] + k, &char_len);
179
180            k += char_len;
181        }
182
183        length += real_len;
184    }
185
186    /* Render string to canvas */
187    if(!strcasecmp(font, "mono9"))
188    {
189        cv = render_big(string, length);
190        filter_autocrop(cv);
191    }
192    else if(!strcasecmp(font, "term"))
193        cv = render_tiny(string, length);
194    else
195        cv = render_figlet(string, length, font);
196
197    /* Do gay stuff with our string (léopard) */
198    if(flag_metal)
199        filter_metal(cv);
200    if(flag_gay)
201        filter_gay(cv);
202
203    /* Output char */
204    buffer = cucul_export_canvas(cv, export);
205    fwrite(cucul_get_buffer_data(buffer),
206           cucul_get_buffer_size(buffer), 1, stdout);
207    cucul_free_buffer(buffer);
208
209    cucul_free_canvas(cv);
210
211    return 0;
212}
213
214static void version(void)
215{
216    printf("TOIlet Copyright 2006 Sam Hocevar %s\n", VERSION);
217    printf("Internet: <sam@zoy.org> Version: 0, date: 21 Sep 2006\n");
218    printf("\n");
219}
220
221#if defined(HAVE_GETOPT_H)
222static void usage(void)
223{
224    printf("Usage: toilet [ -ghimv ] [ -d fontdirectory ]\n");
225    printf("              [ -f fontfile ] [ -w outputwidth ]\n");
226    printf("              [ -I infocode ] [ message ]\n");
227#   ifdef HAVE_GETOPT_LONG
228    printf("  -f, --font <fontfile>    select the font\n");
229    printf("  -d, --directory <dir>    specify font directory\n");
230    printf("  -w, --width <width>      set output width\n");
231    printf("  -g, --gay                add a rainbow effect to the text\n");
232    printf("  -m, --metal              add a metal effect to the text\n");
233    printf("  -i, --irc                output IRC colour codes\n");
234    printf("  -h, --help               display this help and exit\n");
235    printf("  -I, --infocode           print FIGlet-compatible infocode\n");
236    printf("  -v, --version            output version information and exit\n");
237#   else
238    printf("  -f <fontfile>    select the font\n");
239    printf("  -d <dir>         specify font directory\n");
240    printf("  -w <width>       set output width\n");
241    printf("  -g               add a rainbow effect to the text\n");
242    printf("  -m               add a metal effect to the text\n");
243    printf("  -i               output IRC colour codes\n");
244    printf("  -h               display this help and exit\n");
245    printf("  -I               print FIGlet-compatible infocode\n");
246    printf("  -v               output version information and exit\n");
247#   endif
248}
249#endif
250
Note: See TracBrowser for help on using the repository browser.