source: libcaca/trunk/caca/caca_conio.c @ 3592

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

Add sound(), nosound() and delay() to the conio.h emulation. Even though
they're not actually from that header, they're often used together.

  • Property svn:keywords set to Id
File size: 7.8 KB
Line 
1/*
2 *  libcaca       Colour ASCII-Art library
3 *  Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net>
4 *                All Rights Reserved
5 *
6 *  $Id: caca_conio.c 3592 2009-07-30 20:10:57Z sam $
7 *
8 *  This library is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15/*
16 *  This file contains a full conio.h reimplementation. More information
17 *  on conio.h can be found on http://poli.cs.vsb.cz/c/help/conio.htm
18 */
19
20#include "config.h"
21
22#if !defined(__KERNEL__)
23#   include <stdio.h>
24#   include <stdlib.h>
25#endif
26
27#include "caca.h"
28#include "caca_internals.h"
29#include "caca_conio.h"
30
31static caca_canvas_t *cv;
32static caca_display_t *dp;
33
34static int unget_ch = -1;
35static char pass_buffer[BUFSIZ];
36static char cgets_buffer[BUFSIZ];
37
38static void conio_init(void);
39static void conio_refresh(void);
40static void conio_fini(void);
41
42/** \brief DOS conio.h cgets() equivalent */
43char * caca_conio_cgets(char *str)
44{
45    conio_init();
46
47    /* TODO: implement this function */
48    cgets_buffer[0] = '\0';
49
50    return cgets_buffer;
51}
52
53/** \brief DOS conio.h clreol() equivalent */
54void caca_conio_clreol(void)
55{
56    conio_init();
57
58    /* TODO: implement this function */
59}
60
61/** \brief DOS conio.h clrscr() equivalent */
62void caca_conio_clrscr(void)
63{
64    conio_init();
65
66    caca_clear_canvas(cv);
67
68    conio_refresh();
69}
70
71/** \brief DOS conio.h cprintf() equivalent */
72int caca_conio_cprintf(const char *format, ...)
73{
74    va_list args;
75
76    conio_init();
77
78    va_start(args, format);
79    caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args);
80    va_end(args);
81
82    conio_refresh();
83
84    /* FIXME: we should fix caca_vprintf so that it returns the number of
85     * characters that were printed. */
86    return 0;
87}
88
89/** \brief DOS conio.h cputs() equivalent */
90int caca_conio_cputs(const char *str)
91{
92    conio_init();
93
94    /* TODO: implement this function */
95
96    return 0;
97}
98
99/** \brief DOS conio.h cscanf() equivalent */
100int caca_conio_cscanf(char *format, ...)
101{
102    conio_init();
103
104    /* TODO: implement this function */
105
106    return 0;
107}
108
109/** \brief DOS conio.h delay() equivalent */
110void caca_conio_delay(int i)
111{
112    conio_init();
113
114    /* TODO: implement this function */
115}
116
117/** \brief DOS conio.h delline() equivalent */
118void caca_conio_delline(void)
119{
120    conio_init();
121
122    /* TODO: implement this function */
123}
124
125/** \brief DOS conio.h getch() equivalent */
126int caca_conio_getch(void)
127{
128    caca_event_t ev;
129    int ch;
130
131    conio_init();
132
133    if(unget_ch >= 0)
134    {
135        int tmp = unget_ch;
136        unget_ch = -1;
137        return tmp;
138    }
139
140    caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1);
141    ch = caca_get_event_key_ch(&ev);
142
143    switch(ch)
144    {
145        case CACA_KEY_LEFT: ch = 75; break;
146        case CACA_KEY_RIGHT: ch = 77; break;
147        default: break;
148    }
149
150    return ch;
151}
152
153/** \brief DOS conio.h getche() equivalent */
154int caca_conio_getche(void)
155{
156    conio_init();
157
158    /* TODO: implement this function */
159
160    return 0;
161}
162
163/** \brief DOS conio.h getpass() equivalent */
164char * caca_conio_getpass(const char *prompt)
165{
166    conio_init();
167
168    /* TODO: implement this function */
169    pass_buffer[0] = '\0';
170
171    return pass_buffer;
172}
173
174/** \brief DOS conio.h gettext() equivalent */
175int caca_conio_gettext(int left, int top, int right, int bottom, void *destin)
176{
177    conio_init();
178
179    /* TODO: implement this function */
180
181    return 0;
182}
183
184/** \brief DOS conio.h gettextinfo() equivalent */
185void caca_conio_gettextinfo(struct caca_conio_text_info *r)
186{
187    conio_init();
188
189    /* TODO: implement this function */
190}
191
192/** \brief DOS conio.h gotoxy() equivalent */
193void caca_conio_gotoxy(int x, int y)
194{
195    conio_init();
196
197    caca_gotoxy(cv, x - 1, y - 1);
198
199    conio_refresh();
200}
201
202/** \brief DOS conio.h highvideo() equivalent */
203void caca_conio_highvideo(void)
204{
205    conio_init();
206
207    /* TODO: implement this function */
208}
209
210/** \brief DOS conio.h insline() equivalent */
211void caca_conio_insline(void)
212{
213    conio_init();
214
215    /* TODO: implement this function */
216}
217
218/** \brief DOS conio.h kbhit() equivalent */
219int caca_conio_kbhit(void)
220{
221    conio_init();
222
223    /* TODO: implement this function */
224
225    return 0;
226}
227
228/** \brief DOS conio.h lowvideo() equivalent */
229void caca_conio_lowvideo(void)
230{
231    conio_init();
232
233    /* TODO: implement this function */
234}
235
236/** \brief DOS conio.h movetext() equivalent */
237int caca_conio_movetext(int left, int top, int right, int bottom,
238                        int destleft, int desttop)
239{
240    conio_init();
241
242    /* TODO: implement this function */
243
244    return 0;
245}
246
247/** \brief DOS conio.h normvideo() equivalent */
248void caca_conio_normvideo(void)
249{
250    conio_init();
251
252    /* TODO: implement this function */
253}
254
255/** \brief DOS conio.h nosound() equivalent */
256void caca_conio_nosound(void)
257{
258    conio_init();
259
260    /* TODO: implement this function */
261}
262
263/** \brief DOS stdio.h printf() equivalent */
264int caca_conio_printf(const char *format, ...)
265{
266    va_list args;
267
268    conio_init();
269
270    va_start(args, format);
271    caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args);
272    va_end(args);
273
274    conio_refresh();
275
276    /* FIXME: we should fix caca_vprintf so that it returns the number of
277     * characters that were printed. */
278    return 0;
279}
280
281/** \brief DOS conio.h putch() equivalent */
282int caca_conio_putch(int ch)
283{
284    conio_init();
285
286    /* TODO: implement this function */
287
288    return 0;
289}
290
291/** \brief DOS conio.h puttext() equivalent */
292int caca_conio_puttext(int left, int top, int right, int bottom, void *destin)
293{
294    conio_init();
295
296    /* TODO: implement this function */
297
298    return 0;
299}
300
301/** \brief DOS conio.h _setcursortype() equivalent */
302void caca_conio__setcursortype(int cur_t)
303{
304    conio_init();
305
306    /* TODO: implement this function */
307}
308
309/** \brief DOS conio.h sound() equivalent */
310void caca_conio_sound(int i)
311{
312    conio_init();
313
314    /* TODO: implement this function */
315}
316
317/** \brief DOS conio.h textattr() equivalent */
318void caca_conio_textattr(int newattr)
319{
320    conio_init();
321
322    /* TODO: implement this function */
323}
324
325/** \brief DOS conio.h textbackground() equivalent */
326void caca_conio_textbackground(int newcolor)
327{
328    conio_init();
329
330    caca_set_color_ansi(cv, caca_attr_to_ansi_fg(caca_get_attr(cv, -1, -1)),
331                        newcolor);
332}
333
334/** \brief DOS conio.h textcolor() equivalent */
335void caca_conio_textcolor(int newcolor)
336{
337    conio_init();
338
339    caca_set_color_ansi(cv, newcolor,
340                        caca_attr_to_ansi_bg(caca_get_attr(cv, -1, -1)));
341}
342
343/** \brief DOS conio.h textmode() equivalent */
344void caca_conio_textmode(int newmode)
345{
346    conio_init();
347
348    /* TODO: implement this function */
349}
350
351/** \brief DOS conio.h ungetch() equivalent */
352int caca_conio_ungetch(int ch)
353{
354    conio_init();
355
356    if(unget_ch >= 0)
357        return EOF;
358
359    unget_ch = ch;
360
361    return ch;
362}
363
364/** \brief DOS conio.h wherex() equivalent */
365int caca_conio_wherex(void)
366{
367    conio_init();
368
369    return caca_wherex(cv) + 1;
370}
371
372/** \brief DOS conio.h wherey() equivalent */
373int caca_conio_wherey(void)
374{
375    conio_init();
376
377    return caca_wherey(cv) + 1;
378}
379
380/** \brief DOS conio.h window() equivalent */
381void caca_conio_window(int left, int top, int right, int bottom)
382{
383    conio_init();
384
385    /* TODO: implement this function */
386}
387
388/* XXX: the following functions are local. */
389
390static void conio_init(void)
391{
392    if(!cv)
393        cv = caca_create_canvas(80, 25);
394    if(!dp)
395    {
396        dp = caca_create_display(cv);
397        caca_set_cursor(dp, 1);
398#if defined HAVE_ATEXIT
399        atexit(conio_fini);
400#endif
401    }
402}
403
404static void conio_refresh(void)
405{
406    caca_refresh_display(dp);
407}
408
409static void conio_fini(void)
410{
411    caca_free_display(dp);
412    dp = NULL;
413    caca_free_canvas(cv);
414    cv = NULL;
415}
416
Note: See TracBrowser for help on using the repository browser.