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

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

Implement conio.h's getche() and move cursor to top right corner after
a call to clrscr().

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