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

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

Implement conio.h's kbhit().

  • Property svn:keywords set to Id
File size: 7.9 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 3594 2009-07-31 00:01:13Z 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 int kbhit_ch = -1;
36static char pass_buffer[BUFSIZ];
37static char cgets_buffer[BUFSIZ];
38
39static void conio_init(void);
40static void conio_refresh(void);
41static void conio_fini(void);
42
43/** \brief DOS conio.h cgets() equivalent */
44char * caca_conio_cgets(char *str)
45{
46    conio_init();
47
48    /* TODO: implement this function */
49    cgets_buffer[0] = '\0';
50
51    return cgets_buffer;
52}
53
54/** \brief DOS conio.h clreol() equivalent */
55void caca_conio_clreol(void)
56{
57    conio_init();
58
59    /* TODO: implement this function */
60}
61
62/** \brief DOS conio.h clrscr() equivalent */
63void caca_conio_clrscr(void)
64{
65    conio_init();
66
67    caca_clear_canvas(cv);
68
69    conio_refresh();
70}
71
72/** \brief DOS conio.h cprintf() equivalent */
73int caca_conio_cprintf(const char *format, ...)
74{
75    va_list args;
76
77    conio_init();
78
79    va_start(args, format);
80    caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args);
81    va_end(args);
82
83    conio_refresh();
84
85    /* FIXME: we should fix caca_vprintf so that it returns the number of
86     * characters that were printed. */
87    return 0;
88}
89
90/** \brief DOS conio.h cputs() equivalent */
91int caca_conio_cputs(const char *str)
92{
93    conio_init();
94
95    /* TODO: implement this function */
96
97    return 0;
98}
99
100/** \brief DOS conio.h cscanf() equivalent */
101int caca_conio_cscanf(char *format, ...)
102{
103    conio_init();
104
105    /* TODO: implement this function */
106
107    return 0;
108}
109
110/** \brief DOS conio.h delay() equivalent */
111void caca_conio_delay(int i)
112{
113    conio_init();
114
115    /* TODO: implement this function */
116}
117
118/** \brief DOS conio.h delline() equivalent */
119void caca_conio_delline(void)
120{
121    conio_init();
122
123    /* TODO: implement this function */
124}
125
126/** \brief DOS conio.h getch() equivalent */
127int caca_conio_getch(void)
128{
129    caca_event_t ev;
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    if(kbhit_ch >= 0)
141    {
142        int tmp = kbhit_ch;
143        kbhit_ch = -1;
144        return tmp;
145    }
146
147    caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1);
148    return caca_get_event_key_ch(&ev);
149}
150
151/** \brief DOS conio.h getche() equivalent */
152int caca_conio_getche(void)
153{
154    conio_init();
155
156    /* TODO: implement this function */
157
158    return 0;
159}
160
161/** \brief DOS conio.h getpass() equivalent */
162char * caca_conio_getpass(const char *prompt)
163{
164    conio_init();
165
166    /* TODO: implement this function */
167    pass_buffer[0] = '\0';
168
169    return pass_buffer;
170}
171
172/** \brief DOS conio.h gettext() equivalent */
173int caca_conio_gettext(int left, int top, int right, int bottom, void *destin)
174{
175    conio_init();
176
177    /* TODO: implement this function */
178
179    return 0;
180}
181
182/** \brief DOS conio.h gettextinfo() equivalent */
183void caca_conio_gettextinfo(struct caca_conio_text_info *r)
184{
185    conio_init();
186
187    /* TODO: implement this function */
188}
189
190/** \brief DOS conio.h gotoxy() equivalent */
191void caca_conio_gotoxy(int x, int y)
192{
193    conio_init();
194
195    caca_gotoxy(cv, x - 1, y - 1);
196
197    conio_refresh();
198}
199
200/** \brief DOS conio.h highvideo() equivalent */
201void caca_conio_highvideo(void)
202{
203    conio_init();
204
205    /* TODO: implement this function */
206}
207
208/** \brief DOS conio.h insline() equivalent */
209void caca_conio_insline(void)
210{
211    conio_init();
212
213    /* TODO: implement this function */
214}
215
216/** \brief DOS conio.h kbhit() equivalent */
217int caca_conio_kbhit(void)
218{
219    caca_event_t ev;
220
221    conio_init();
222
223    if(kbhit_ch >= 0)
224        return 1;
225
226    if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0))
227    {
228        kbhit_ch = caca_get_event_key_ch(&ev);
229        return 1;
230    }
231
232    return 0;
233}
234
235/** \brief DOS conio.h lowvideo() equivalent */
236void caca_conio_lowvideo(void)
237{
238    conio_init();
239
240    /* TODO: implement this function */
241}
242
243/** \brief DOS conio.h movetext() equivalent */
244int caca_conio_movetext(int left, int top, int right, int bottom,
245                        int destleft, int desttop)
246{
247    conio_init();
248
249    /* TODO: implement this function */
250
251    return 0;
252}
253
254/** \brief DOS conio.h normvideo() equivalent */
255void caca_conio_normvideo(void)
256{
257    conio_init();
258
259    /* TODO: implement this function */
260}
261
262/** \brief DOS conio.h nosound() equivalent */
263void caca_conio_nosound(void)
264{
265    conio_init();
266
267    /* TODO: implement this function */
268}
269
270/** \brief DOS stdio.h printf() equivalent */
271int caca_conio_printf(const char *format, ...)
272{
273    va_list args;
274
275    conio_init();
276
277    va_start(args, format);
278    caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args);
279    va_end(args);
280
281    conio_refresh();
282
283    /* FIXME: we should fix caca_vprintf so that it returns the number of
284     * characters that were printed. */
285    return 0;
286}
287
288/** \brief DOS conio.h putch() equivalent */
289int caca_conio_putch(int ch)
290{
291    conio_init();
292
293    /* TODO: implement this function */
294
295    return 0;
296}
297
298/** \brief DOS conio.h puttext() equivalent */
299int caca_conio_puttext(int left, int top, int right, int bottom, void *destin)
300{
301    conio_init();
302
303    /* TODO: implement this function */
304
305    return 0;
306}
307
308/** \brief DOS conio.h _setcursortype() equivalent */
309void caca_conio__setcursortype(int cur_t)
310{
311    conio_init();
312
313    /* TODO: implement this function */
314}
315
316/** \brief DOS conio.h sound() equivalent */
317void caca_conio_sound(int i)
318{
319    conio_init();
320
321    /* TODO: implement this function */
322}
323
324/** \brief DOS conio.h textattr() equivalent */
325void caca_conio_textattr(int newattr)
326{
327    conio_init();
328
329    /* TODO: implement this function */
330}
331
332/** \brief DOS conio.h textbackground() equivalent */
333void caca_conio_textbackground(int newcolor)
334{
335    conio_init();
336
337    caca_set_color_ansi(cv, caca_attr_to_ansi_fg(caca_get_attr(cv, -1, -1)),
338                        newcolor);
339}
340
341/** \brief DOS conio.h textcolor() equivalent */
342void caca_conio_textcolor(int newcolor)
343{
344    conio_init();
345
346    caca_set_color_ansi(cv, newcolor,
347                        caca_attr_to_ansi_bg(caca_get_attr(cv, -1, -1)));
348}
349
350/** \brief DOS conio.h textmode() equivalent */
351void caca_conio_textmode(int newmode)
352{
353    conio_init();
354
355    /* TODO: implement this function */
356}
357
358/** \brief DOS conio.h ungetch() equivalent */
359int caca_conio_ungetch(int ch)
360{
361    conio_init();
362
363    if(unget_ch >= 0)
364        return EOF;
365
366    unget_ch = ch;
367
368    return ch;
369}
370
371/** \brief DOS conio.h wherex() equivalent */
372int caca_conio_wherex(void)
373{
374    conio_init();
375
376    return caca_wherex(cv) + 1;
377}
378
379/** \brief DOS conio.h wherey() equivalent */
380int caca_conio_wherey(void)
381{
382    conio_init();
383
384    return caca_wherey(cv) + 1;
385}
386
387/** \brief DOS conio.h window() equivalent */
388void caca_conio_window(int left, int top, int right, int bottom)
389{
390    conio_init();
391
392    /* TODO: implement this function */
393}
394
395/* XXX: the following functions are local. */
396
397static void conio_init(void)
398{
399    if(!cv)
400        cv = caca_create_canvas(80, 25);
401    if(!dp)
402    {
403        dp = caca_create_display(cv);
404        caca_set_cursor(dp, 1);
405#if defined HAVE_ATEXIT
406        atexit(conio_fini);
407#endif
408    }
409}
410
411static void conio_refresh(void)
412{
413    caca_refresh_display(dp);
414}
415
416static void conio_fini(void)
417{
418    caca_free_display(dp);
419    dp = NULL;
420    caca_free_canvas(cv);
421    cv = NULL;
422}
423
Note: See TracBrowser for help on using the repository browser.