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

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