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

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

Start implementing a full <conio.h> replacement with a libcaca backend.

  • Property svn:keywords set to Id
File size: 7.4 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 3588 2009-07-26 23:26:21Z 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 delline() equivalent */
110void caca_conio_delline(void)
111{
112    conio_init();
113
114    /* TODO: implement this function */
115}
116
117/** \brief DOS conio.h getch() equivalent */
118int caca_conio_getch(void)
119{
120    caca_event_t ev;
121    int ch;
122
123    conio_init();
124
125    if(unget_ch >= 0)
126    {
127        int tmp = unget_ch;
128        unget_ch = -1;
129        return tmp;
130    }
131
132    caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1);
133    ch = caca_get_event_key_ch(&ev);
134
135    switch(ch)
136    {
137        case CACA_KEY_LEFT: ch = 75; break;
138        case CACA_KEY_RIGHT: ch = 77; break;
139        default: break;
140    }
141
142    return ch;
143}
144
145/** \brief DOS conio.h getche() equivalent */
146int caca_conio_getche(void)
147{
148    conio_init();
149
150    /* TODO: implement this function */
151
152    return 0;
153}
154
155/** \brief DOS conio.h getpass() equivalent */
156char * caca_conio_getpass(const char *prompt)
157{
158    conio_init();
159
160    /* TODO: implement this function */
161    pass_buffer[0] = '\0';
162
163    return pass_buffer;
164}
165
166/** \brief DOS conio.h gettext() equivalent */
167int caca_conio_gettext(int left, int top, int right, int bottom, void *destin)
168{
169    conio_init();
170
171    /* TODO: implement this function */
172
173    return 0;
174}
175
176/** \brief DOS conio.h gettextinfo() equivalent */
177void caca_conio_gettextinfo(struct caca_conio_text_info *r)
178{
179    conio_init();
180
181    /* TODO: implement this function */
182}
183
184/** \brief DOS conio.h gotoxy() equivalent */
185void caca_conio_gotoxy(int x, int y)
186{
187    conio_init();
188
189    caca_gotoxy(cv, x - 1, y - 1);
190
191    conio_refresh();
192}
193
194/** \brief DOS conio.h highvideo() equivalent */
195void caca_conio_highvideo(void)
196{
197    conio_init();
198
199    /* TODO: implement this function */
200}
201
202/** \brief DOS conio.h insline() equivalent */
203void caca_conio_insline(void)
204{
205    conio_init();
206
207    /* TODO: implement this function */
208}
209
210/** \brief DOS conio.h kbhit() equivalent */
211int caca_conio_kbhit(void)
212{
213    conio_init();
214
215    /* TODO: implement this function */
216
217    return 0;
218}
219
220/** \brief DOS conio.h lowvideo() equivalent */
221void caca_conio_lowvideo(void)
222{
223    conio_init();
224
225    /* TODO: implement this function */
226}
227
228/** \brief DOS conio.h movetext() equivalent */
229int caca_conio_movetext(int left, int top, int right, int bottom,
230                        int destleft, int desttop)
231{
232    conio_init();
233
234    /* TODO: implement this function */
235
236    return 0;
237}
238
239/** \brief DOS conio.h normvideo() equivalent */
240void caca_conio_normvideo(void)
241{
242    conio_init();
243
244    /* TODO: implement this function */
245}
246
247/** \brief DOS stdio.h printf() equivalent */
248int caca_conio_printf(const char *format, ...)
249{
250    va_list args;
251
252    conio_init();
253
254    va_start(args, format);
255    caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args);
256    va_end(args);
257
258    conio_refresh();
259
260    /* FIXME: we should fix caca_vprintf so that it returns the number of
261     * characters that were printed. */
262    return 0;
263}
264
265/** \brief DOS conio.h putch() equivalent */
266int caca_conio_putch(int ch)
267{
268    conio_init();
269
270    /* TODO: implement this function */
271
272    return 0;
273}
274
275/** \brief DOS conio.h puttext() equivalent */
276int caca_conio_puttext(int left, int top, int right, int bottom, void *destin)
277{
278    conio_init();
279
280    /* TODO: implement this function */
281
282    return 0;
283}
284
285/** \brief DOS conio.h _setcursortype() equivalent */
286void caca_conio__setcursortype(int cur_t)
287{
288    conio_init();
289
290    /* TODO: implement this function */
291}
292
293/** \brief DOS conio.h textattr() equivalent */
294void caca_conio_textattr(int newattr)
295{
296    conio_init();
297
298    /* TODO: implement this function */
299}
300
301/** \brief DOS conio.h textbackground() equivalent */
302void caca_conio_textbackground(int newcolor)
303{
304    conio_init();
305
306    caca_set_color_ansi(cv, caca_attr_to_ansi_fg(caca_get_attr(cv, -1, -1)),
307                        newcolor);
308}
309
310/** \brief DOS conio.h textcolor() equivalent */
311void caca_conio_textcolor(int newcolor)
312{
313    conio_init();
314
315    caca_set_color_ansi(cv, newcolor,
316                        caca_attr_to_ansi_bg(caca_get_attr(cv, -1, -1)));
317}
318
319/** \brief DOS conio.h textmode() equivalent */
320void caca_conio_textmode(int newmode)
321{
322    conio_init();
323
324    /* TODO: implement this function */
325}
326
327/** \brief DOS conio.h ungetch() equivalent */
328int caca_conio_ungetch(int ch)
329{
330    conio_init();
331
332    if(unget_ch >= 0)
333        return EOF;
334
335    unget_ch = ch;
336
337    return ch;
338}
339
340/** \brief DOS conio.h wherex() equivalent */
341int caca_conio_wherex(void)
342{
343    conio_init();
344
345    return caca_wherex(cv) + 1;
346}
347
348/** \brief DOS conio.h wherey() equivalent */
349int caca_conio_wherey(void)
350{
351    conio_init();
352
353    return caca_wherey(cv) + 1;
354}
355
356/** \brief DOS conio.h window() equivalent */
357void caca_conio_window(int left, int top, int right, int bottom)
358{
359    conio_init();
360
361    /* TODO: implement this function */
362}
363
364/* XXX: the following functions are local. */
365
366static void conio_init(void)
367{
368    if(!cv)
369        cv = caca_create_canvas(80, 25);
370    if(!dp)
371    {
372        dp = caca_create_display(cv);
373        caca_set_cursor(dp, 1);
374#if defined HAVE_ATEXIT
375        atexit(conio_fini);
376#endif
377    }
378}
379
380static void conio_refresh(void)
381{
382    caca_refresh_display(dp);
383}
384
385static void conio_fini(void)
386{
387    caca_free_display(dp);
388    dp = NULL;
389    caca_free_canvas(cv);
390    cv = NULL;
391}
392
Note: See TracBrowser for help on using the repository browser.