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

Last change on this file since 3595 was 3595, checked in by Sam Hocevar, 10 years ago

Make caca_printf(), caca_vprintf() and caca_put_str() return the number of
printed cells instead of always returning 0. This is handy if we want to
advance a cursor after each printf() call.

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