ciolib.c 15.6 KB
Newer Older
1
#include <stdarg.h>
2
#include <stdlib.h>	/* malloc */
3
4
#include <stdio.h>

deuce's avatar
deuce committed
5
6
#include <threadwrap.h>

7
8
9
#define CIOLIB_NO_MACROS
#include "ciolib.h"

deuce's avatar
deuce committed
10
11
12
#ifdef _WIN32
 #include "win32cio.h"
#else
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 #ifndef NO_X
  #include "x_cio.h"
 #endif
 #include "curs_cio.h"
 #undef getch
#endif

#include "ansi_cio.h"

cioapi_t	cio_api;

static int ungotch;
static struct text_info cio_textinfo;
static int lastmode=3;
int _wscroll=1;
int directvideo=0;
deuce's avatar
deuce committed
29
int dont_move_cursor=0;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
static int initialized=0;

int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy);
char *ciolib_cgets(char *str);
int ciolib_cscanf (char *format , ...);
int ciolib_kbhit(void);
int ciolib_getch(void);
int ciolib_getche(void);
int ciolib_ungetch(int ch);
void ciolib_gettextinfo(struct text_info *info);
int ciolib_wherex(void);
int ciolib_wherey(void);
void ciolib_wscroll(void);
void ciolib_gotoxy(int x, int y);
void ciolib_clreol(void);
void ciolib_clrscr(void);
int ciolib_cputs(char *str);
int	ciolib_cprintf(char *fmat, ...);
void ciolib_textbackground(int colour);
void ciolib_textcolor(int colour);
void ciolib_highvideo(void);
void ciolib_lowvideo(void);
void ciolib_normvideo(void);
int ciolib_puttext(int a,int b,int c,int d,unsigned char *e);
int ciolib_gettext(int a,int b,int c,int d,unsigned char *e);
55
void ciolib_textattr(int a);
56
void ciolib_delay(long a);
57
int ciolib_putch(int a);
58
59
60
61
62
63
64
void ciolib_setcursortype(int a);
void ciolib_textmode(int mode);
void ciolib_window(int sx, int sy, int ex, int ey);
void ciolib_delline(void);
void ciolib_insline(void);
char *ciolib_getpass(const char *prompt);

65
66
#define CIOLIB_INIT()		{ if(!initialized) initciolib(CIOLIB_MODE_AUTO); }

67
68
69
70
71
#ifndef _WIN32
 #ifndef NO_X
int try_x_init(int mode)
{
	if(!console_init()) {
72
		cio_api.mode=CIOLIB_MODE_X;
deuce's avatar
deuce committed
73
		cio_api.mouse=1;
74
75
76
77
78
79
80
81
82
83
84
85
86
87
		cio_api.puttext=x_puttext;
		cio_api.gettext=x_gettext;
		cio_api.textattr=x_textattr;
		cio_api.kbhit=x_kbhit;
		cio_api.delay=x_delay;
		cio_api.wherey=x_wherey;
		cio_api.wherex=x_wherex;
		cio_api.putch=x_putch;
		cio_api.gotoxy=x_gotoxy;
		cio_api.gettextinfo=x_gettextinfo;
		cio_api.setcursortype=x_setcursortype;
		cio_api.getch=x_getch;
		cio_api.getche=x_getche;
		cio_api.textmode=x_textmode;
deuce's avatar
deuce committed
88
89
		cio_api.showmouse=NULL;
		cio_api.hidemouse=NULL;
90
		cio_api.settitle=x_settitle;
91
92
93
94
95
96
97
98
99
		return(1);
	}
	return(0);
}
 #endif

int try_curses_init(int mode)
{
	if(curs_initciolib(mode)) {
100
		cio_api.mode=CIOLIB_MODE_CURSES_IBM;
101
102
103
104
105
106
107
108
109
110
111
112
113
114
		cio_api.puttext=curs_puttext;
		cio_api.gettext=curs_gettext;
		cio_api.textattr=curs_textattr;
		cio_api.kbhit=curs_kbhit;
		cio_api.delay=curs_delay;
		cio_api.wherey=curs_wherey;
		cio_api.wherex=curs_wherex;
		cio_api.putch=curs_putch;
		cio_api.gotoxy=curs_gotoxy;
		cio_api.gettextinfo=curs_gettextinfo;
		cio_api.setcursortype=curs_setcursortype;
		cio_api.getch=curs_getch;
		cio_api.getche=curs_getche;
		cio_api.textmode=curs_textmode;
deuce's avatar
deuce committed
115
116
		cio_api.showmouse=curs_showmouse;
		cio_api.hidemouse=curs_hidemouse;
117
		cio_api.settitle=NULL;
118
119
120
121
122
123
124
125
126
		return(1);
	}
	return(0);
}
#endif

int try_ansi_init(int mode)
{
	if(ansi_initciolib(mode)) {
127
		cio_api.mode=CIOLIB_MODE_ANSI;
deuce's avatar
deuce committed
128
		cio_api.mouse=0;
129
130
131
132
133
134
135
136
137
138
139
140
141
142
		cio_api.puttext=ansi_puttext;
		cio_api.gettext=ansi_gettext;
		cio_api.textattr=ansi_textattr;
		cio_api.kbhit=ansi_kbhit;
		cio_api.delay=ansi_delay;
		cio_api.wherey=ansi_wherey;
		cio_api.wherex=ansi_wherex;
		cio_api.putch=ansi_putch;
		cio_api.gotoxy=ansi_gotoxy;
		cio_api.gettextinfo=ansi_gettextinfo;
		cio_api.setcursortype=ansi_setcursortype;
		cio_api.getch=ansi_getch;
		cio_api.getche=ansi_getche;
		cio_api.textmode=ansi_textmode;
deuce's avatar
deuce committed
143
144
		cio_api.showmouse=NULL;
		cio_api.hidemouse=NULL;
145
		cio_api.settitle=NULL;
146
147
148
149
150
151
		return(1);
	}
	return(0);
}

#ifdef _WIN32
152
153
154
#if defined(__BORLANDC__)
        #pragma argsused
#endif
155
int try_conio_init(int mode)
156
157
{
	/* This should test for something or other */
158
	if(win32_initciolib(C80)) {
159
		cio_api.mode=CIOLIB_MODE_CONIO;
deuce's avatar
deuce committed
160
		cio_api.mouse=1;
161
162
163
		cio_api.puttext=win32_puttext;
		cio_api.gettext=win32_gettext;
		cio_api.textattr=win32_textattr;
deuce's avatar
deuce committed
164
		cio_api.kbhit=win32_kbhit;
165
166
167
168
169
170
		cio_api.wherey=win32_wherey;
		cio_api.wherex=win32_wherex;
		cio_api.putch=win32_putch;
		cio_api.gotoxy=win32_gotoxy;
		cio_api.gettextinfo=win32_gettextinfo;
		cio_api.setcursortype=win32_setcursortype;
deuce's avatar
deuce committed
171
172
		cio_api.getch=win32_getch;
		cio_api.getche=win32_getche;
173
		cio_api.textmode=win32_textmode;
deuce's avatar
deuce committed
174
175
		cio_api.showmouse=win32_showmouse;
		cio_api.hidemouse=win32_hidemouse;
176
		cio_api.settitle=win32_settitle;
177
178
179
180
181
182
183
184
185
		return(1);
	}
	return(0);
}
#endif

int initciolib(int mode)
{
	switch(mode) {
186
		case CIOLIB_MODE_AUTO:
187
#ifdef _WIN32
188
			if(!try_conio_init(mode))
189
#else
190
#ifndef NO_X
191
			if(!try_x_init(mode))
192
#endif
193
194
195
196
197
				if(!try_curses_init(mode))
#endif
					try_ansi_init(mode);
			break;
#ifdef _WIN32
198
		case CIOLIB_MODE_CONIO:
199
			try_conio_init(mode);
200
201
			break;
#else
202
203
		case CIOLIB_MODE_CURSES:
		case CIOLIB_MODE_CURSES_IBM:
204
205
			try_curses_init(mode);
			break;
206

207
		case CIOLIB_MODE_X:
208
#ifndef NO_X
209
			try_x_init(mode);
210
#endif
211
212
			break;
#endif
213
		case CIOLIB_MODE_ANSI:
214
215
216
			try_ansi_init(mode);
			break;
	}
217
	if(cio_api.mode==CIOLIB_MODE_AUTO) {
deuce's avatar
deuce committed
218
		fprintf(stderr,"CIOLIB initialization failed!\n");
219
220
221
222
223
224
225
226
227
228
		return(-1);
	}

	initialized=1;
	ciolib_gettextinfo(&cio_textinfo);
	cio_textinfo.winleft=1;
	cio_textinfo.wintop=1;
	cio_textinfo.winright=cio_textinfo.screenwidth;
	cio_textinfo.winbottom=cio_textinfo.screenheight;
	cio_textinfo.normattr=7;
deuce's avatar
deuce committed
229
	_beginthread(ciolib_mouse_thread,0,NULL);
230
231
232
233
234
	return(0);
}

int ciolib_kbhit(void)
{
235
	CIOLIB_INIT();
236
237
	if(ungotch)
		return(1);
deuce's avatar
deuce committed
238
239
	if(mouse_pending())
		return(1);
240
241
242
243
244
245
246
	return(cio_api.kbhit());
}

int ciolib_getch(void)
{
	int ch;

247
248
	CIOLIB_INIT();

249
250
251
252
253
254
255
256
257
258
259
260
	if(ungotch) {
		ch=ungotch;
		ungotch=0;
		return(ch);
	}
	return(cio_api.getch());
}

int ciolib_getche(void)
{
	int ch;

261
262
	CIOLIB_INIT();

263
264
265
266
267
268
269
270
271
272
273
	if(ungotch) {
		ch=ungotch;
		ungotch=0;
		ciolib_putch(ch);
		return(ch);
	}
	return(cio_api.getche());
}

int ciolib_ungetch(int ch)
{
274
275
	CIOLIB_INIT();
	
276
277
278
279
280
281
282
283
284
285
	if(ungotch)
		return(EOF);
	ungotch=ch;
	return(ch);
}

int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy)
{
	int width;
	int height;
286
	unsigned char *buf;
287

288
289
	CIOLIB_INIT();
	
290
291
	width=ex-sx;
	height=ey-sy;
292
	buf=(unsigned char *)malloc((width+1)*(height+1)*2);
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
	if(buf==NULL)
		return(0);
	if(!ciolib_gettext(sx,sy,ex,ey,buf)) {
		free(buf);
		return(0);
	}
	if(!ciolib_puttext(dx,dy,dx+width,dy+height,buf)) {
		free(buf);
		return(0);
	}
	free(buf);
	return(1);
}

char *ciolib_cgets(char *str)
{
	int	maxlen;
	int len=0;
	int ch;

313
314
	CIOLIB_INIT();
	
315
316
317
318
	maxlen=*(unsigned char *)str;
	while((ch=ciolib_getche())!='\n') {
		switch(ch) {
			case 0:	/* Skip extended keys */
319
				ciolib_getche();
320
321
322
323
324
				break;
			case '\r':	/* Skip \r (ToDo: Should this be treeated as a \n? */
				break;
			case '\b':
				if(len==0) {
325
					ciolib_putch(7);
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
					break;
				}
				ciolib_putch('\b');
				len--;
				break;
			default:
				str[(len++)+2]=ch;
				if(len==maxlen) {
					str[len+2]=0;
					*((unsigned char *)(str+1))=(unsigned char)len;
					return(&str[2]);
				}
				break;
		}
	}
341
342
343
	str[len+2]=0;
	*((unsigned char *)(str+1))=(unsigned char)len;
	return(&str[2]);
344
345
}

346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
#ifdef _MSC_VER	/* Use lame vsscanf() implementation */
/* This is a way to do _vsscanf without using fancy stack tricks or using the
 * "_input" method provided by Microsoft, which is no longer exported as of .NET.
 * The function has a limit of 25 arguments (or less if you run out of stack space),
 *  but how many arguments do you need?
 */
/* From "krabsheva" - http://www.codeguru.com/Cpp/Cpp/string/comments.php/c5631/?thread=1051 */
int vsscanf( const char *buffer, const char *format, va_list arg_ptr )
{
	int i, ret;
	void *arg_arr[25];

	// Do exception handling in case we go too far //
	__try
	{
		for ( i = 0; i < 25; i++ )
			arg_arr[i] = va_arg( arg_ptr, void * );
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
	}

	/* This is lame, but the extra arguments won't be used by sscanf */
	ret = sscanf( buffer, format, arg_arr[0], arg_arr[1], arg_arr[2], arg_arr[3],
		arg_arr[4], arg_arr[5], arg_arr[6], arg_arr[7], arg_arr[8], arg_arr[9],
		arg_arr[10], arg_arr[11], arg_arr[12], arg_arr[13], arg_arr[14],
		arg_arr[15], arg_arr[16], arg_arr[17], arg_arr[18], arg_arr[19],
		arg_arr[20], arg_arr[21], arg_arr[22], arg_arr[23], arg_arr[24] );

	return ret;
}
#endif

379
380
381
382
383
384
int ciolib_cscanf (char *format , ...)
{
	char str[255];
    va_list argptr;
	int ret;

385
386
	CIOLIB_INIT();
	
387
388
389
390
391
392
393
394
395
396
397
398
399
	str[0]=-1;
	va_start(argptr,format);
	ret=vsscanf(ciolib_cgets(str),format,argptr);
	va_end(argptr);
	return(ret);
}

char *ciolib_getpass(const char *prompt)
{
	static char pass[9];
	int len=0;
	int ch;

400
401
	CIOLIB_INIT();
	
402
	ciolib_cputs((char *)prompt);
deuce's avatar
deuce committed
403
	while((ch=ciolib_getch())!='\n') {
404
405
		switch(ch) {
			case 0:	/* Skip extended keys */
deuce's avatar
deuce committed
406
				ciolib_getch();
407
408
409
410
411
				break;
			case '\r':	/* Skip \r (ToDo: Should this be treeated as a \n? */
				break;
			case '\b':
				if(len==0) {
412
					ciolib_putch(7);
413
414
415
416
417
418
					break;
				}
				len--;
				break;
			default:
				if(len==8)
419
					ciolib_putch(7);
420
421
422
423
424
				else
					pass[len++]=ch;
				break;
		}
	}
425
426
	pass[len]=0;
	return(pass);
427
428
429
430
431
}

void ciolib_gettextinfo(struct text_info *info)
{
	if(!initialized)
432
		initciolib(CIOLIB_MODE_AUTO);
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
	else {
		cio_api.gettextinfo(&cio_textinfo);
	}
	if(info!=&cio_textinfo) {
		info->winleft=cio_textinfo.winleft;        /* left window coordinate */
		info->wintop=cio_textinfo.wintop;         /* top window coordinate */
		info->winright=cio_textinfo.winright;       /* right window coordinate */
		info->winbottom=cio_textinfo.winbottom;      /* bottom window coordinate */
		info->attribute=cio_textinfo.attribute;      /* text attribute */
		info->normattr=cio_textinfo.normattr;       /* normal attribute */
		info->currmode=cio_textinfo.currmode;       /* current video mode:
                               			 BW40, BW80, C40, C80, or C4350 */
		info->screenheight=cio_textinfo.screenheight;   /* text screen's height */
		info->screenwidth=cio_textinfo.screenwidth;    /* text screen's width */
		info->curx=cio_textinfo.curx;           /* x-coordinate in current window */
		info->cury=cio_textinfo.cury;           /* y-coordinate in current window */
	}
}

void ciolib_wscroll(void)
{
	int os;
	struct text_info ti;

457
458
	CIOLIB_INIT();
	
459
460
461
462
463
464
465
	ciolib_gettextinfo(&ti);
	if(!_wscroll)
		return;
	ciolib_movetext(ti.winleft,ti.wintop+1,ti.winright,ti.winbottom,ti.winleft,ti.wintop);
	ciolib_gotoxy(1,ti.winbottom-ti.winleft+1);
	os=_wscroll;
	_wscroll=0;
466
467
	/* ciolib_cprintf("%*s",ti.winright-ti.winleft+1,""); */
	ciolib_clreol();
468
469
470
471
472
473
474
475
	_wscroll=os;
	ciolib_gotoxy(ti.curx,ti.cury);
}

int ciolib_wherex(void)
{
	int x;

476
477
	CIOLIB_INIT();
	
478
479
480
481
482
483
484
485
486
	x=cio_api.wherex();
	x=x-cio_textinfo.winleft+1;
	return(x);
}

int ciolib_wherey(void)
{
	int y;

487
488
	CIOLIB_INIT();
	
489
490
491
492
493
494
495
496
497
498
499
	y=cio_api.wherey();
	y=y-cio_textinfo.wintop+1;
	return(y);
}

void ciolib_gotoxy(int x, int y)
{
	int nx;
	int ny;
	struct text_info ti;

500
501
	CIOLIB_INIT();
	
502
503
504
505
506
507
508
509
510
511
512
513
514
	ciolib_gettextinfo(&ti);
	if(		x < 1
			|| x > ti.winright-ti.winleft+1
			|| y < 1
			|| y > ti.winbottom-ti.wintop+1)
		return;
	nx=x+ti.winleft-1;
	ny=y+ti.wintop-1;
	cio_api.gotoxy(nx,ny);
}

void ciolib_textmode(mode)
{
515
516
	CIOLIB_INIT();
	
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
	if(mode==-1) {
		ciolib_gettextinfo(&cio_textinfo);
		cio_api.textmode(lastmode);
		lastmode=cio_textinfo.currmode;
	}
	else {
		ciolib_gettextinfo(&cio_textinfo);
		lastmode=cio_textinfo.currmode;
		cio_api.textmode(mode);
	}
	ciolib_gettextinfo(&cio_textinfo);
	cio_textinfo.winleft=1;
	cio_textinfo.wintop=1;
	cio_textinfo.winright=cio_textinfo.screenwidth;
	cio_textinfo.winbottom=cio_textinfo.screenheight;
}

void ciolib_window(int sx, int sy, int ex, int ey)
{
536
537
	CIOLIB_INIT();
	
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
	ciolib_gettextinfo(&cio_textinfo);
	if(		   sx < 1
			|| sy < 1
			|| ex < 1
			|| ey < 1
			|| sx > cio_textinfo.screenwidth
			|| sy > cio_textinfo.screenheight
			|| sx > ex
			|| sy > ey
			|| ex > cio_textinfo.screenwidth
			|| ey > cio_textinfo.screenheight)
		return;
	cio_textinfo.winleft=sx;
	cio_textinfo.wintop=sy;
	cio_textinfo.winright=ex;
	cio_textinfo.winbottom=ey;
	ciolib_gotoxy(1,1);
}

void ciolib_clreol(void)
{
559
560
561
562
	unsigned char *buf;
	int i;
	int width,height;
	struct text_info ti;
563

564
565
	CIOLIB_INIT();
	
566
	ciolib_gettextinfo(&ti);
567
568
569
570
571
572
573
574
575
576

	width=ti.winright-ti.curx+1;
	height=1;
	buf=(unsigned char *)malloc(width*height*2);
	for(i=0;i<width*height*2;) {
		buf[i++]=' ';
		buf[i++]=ti.attribute;
	}
	ciolib_puttext(ti.curx+ti.winleft-1,ti.cury+ti.wintop-1,ti.winright,ti.cury+ti.wintop-1,buf);
	free(buf);
577
578
579
580
}

void ciolib_clrscr(void)
{
581
	unsigned char *buf;
582
583
584
585
	int i;
	int width,height;
	struct text_info ti;

586
587
	CIOLIB_INIT();
	
588
589
590
591
	ciolib_gettextinfo(&ti);

	width=ti.winright-ti.winleft+1;
	height=ti.winbottom-ti.wintop+1;
592
	buf=(unsigned char *)malloc(width*height*2);
593
594
595
596
597
598
599
600
601
602
603
604
	for(i=0;i<width*height*2;) {
		buf[i++]=' ';
		buf[i++]=ti.attribute;
	}
	ciolib_puttext(ti.winleft,ti.wintop,ti.winright,ti.winbottom,buf);
	free(buf);
}

void ciolib_delline(void)
{
	struct text_info ti;

605
606
	CIOLIB_INIT();
	
607
608
609
610
611
612
613
614
615
616
617
618
	ciolib_gettextinfo(&ti);

	ciolib_movetext(ti.winleft,ti.cury+1,ti.winright,ti.winbottom,ti.winleft,ti.cury);
	ciolib_gotoxy(1,ti.winbottom-ti.wintop+1);
	ciolib_clreol();
	ciolib_gotoxy(ti.curx,ti.cury);
}

void ciolib_insline(void)
{
	struct text_info ti;

619
620
	CIOLIB_INIT();
	
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
	ciolib_gettextinfo(&ti);

	ciolib_movetext(ti.winleft,ti.cury,ti.winright,ti.winbottom,ti.winleft,ti.cury+1);
	ciolib_gotoxy(1,ti.cury);
	ciolib_clreol();
	ciolib_gotoxy(ti.curx,ti.cury);
}

int ciolib_cprintf(char *fmat, ...)
{
    va_list argptr;
	int		ret;
#ifdef _WIN32			/* Can't figure out a way to allocate a "big enough" buffer for Win32. */
	char	str[16384];
#else
	char	*str;
#endif

639
640
	CIOLIB_INIT();
	
641
    va_start(argptr,fmat);
642
#ifdef _WIN32
rswindell's avatar
rswindell committed
643
	ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr);
644
645
646
647
648
649
650
651
652
653
654
655
#else
    ret=vsnprintf(NULL,0,fmat,argptr);
	str=(char *)malloc(ret+1);
	if(str==NULL)
		return(EOF);
	ret=vsprintf(str,fmat,argptr);
#endif
    va_end(argptr);
	if(ret>=0)
		ciolib_cputs(str);
	else
		ret=EOF;
656
#ifndef _WIN32
657
658
659
660
661
662
663
664
665
	free(str);
#endif
    return(ret);
}

int ciolib_cputs(char *str)
{
	int		pos;
	int		ret=0;
666
	int		olddmc;
667

668
	CIOLIB_INIT();
669
670

	olddmc=dont_move_cursor;	
deuce's avatar
deuce committed
671
	dont_move_cursor=1;
672
673
674
675
676
677
678
	for(pos=0;str[pos];pos++)
	{
		ret=str[pos];
		if(str[pos]=='\n')
			ciolib_putch('\r');
		ciolib_putch(str[pos]);
	}
679
	dont_move_cursor=olddmc;
deuce's avatar
deuce committed
680
	ciolib_gotoxy(ciolib_wherex(),ciolib_wherey());
681
682
683
684
685
686
687
	return(ret);
}

void ciolib_textbackground(int colour)
{
	unsigned char attr;

688
689
	CIOLIB_INIT();
	
690
691
692
693
694
695
696
697
698
699
700
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr&=143;
	attr|=(colour<<4);
	ciolib_textattr(attr);
}

void ciolib_textcolor(int colour)
{
	unsigned char attr;

701
702
	CIOLIB_INIT();
	
703
704
705
706
707
708
709
710
711
712
713
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr&=240;
	attr|=colour;
	ciolib_textattr(attr);
}

void ciolib_highvideo(void)
{
	int attr;

714
715
	CIOLIB_INIT();
	
716
717
718
719
720
721
722
723
724
725
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr |= 8;
	ciolib_textattr(attr);
}

void ciolib_lowvideo(void)
{
	int attr;

726
727
	CIOLIB_INIT();
	
728
729
730
731
732
733
734
735
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr &= 0xf7;
	ciolib_textattr(attr);
}

void ciolib_normvideo(void)
{
736
737
	CIOLIB_INIT();
	
738
739
740
741
742
	ciolib_textattr(0x07);
}

int ciolib_puttext(int a,int b,int c,int d,unsigned char *e)
{
743
744
	CIOLIB_INIT();
	
745
746
747
748
749
	return(cio_api.puttext(a,b,c,d,e));
}

int ciolib_gettext(int a,int b,int c,int d,unsigned char *e)
{
750
751
	CIOLIB_INIT();
	
752
753
754
	return(cio_api.gettext(a,b,c,d,e));
}

755
void ciolib_textattr(int a)
756
{
757
758
	CIOLIB_INIT();
	
759
760
761
762
763
	cio_api.textattr(a);
}

void ciolib_delay(long a)
{
764
765
	CIOLIB_INIT();
	
766
767
768
	cio_api.delay(a);
}

769
int ciolib_putch(int a)
770
{
771
	CIOLIB_INIT();
772

773
774
775
776
777
	return(cio_api.putch(a));
}

void ciolib_setcursortype(int a)
{
778
779
	CIOLIB_INIT();
	
780
781
	cio_api.setcursortype(a);
}
deuce's avatar
deuce committed
782
783
784
785
786
787

int ciolib_showmouse(void) {
	CIOLIB_INIT();

	if(cio_api.showmouse!=NULL)
		return(cio_api.showmouse());
788
	return(-1);
deuce's avatar
deuce committed
789
790
791
792
793
794
795
}

int ciolib_hidemouse(void) {
	CIOLIB_INIT();

	if(cio_api.hidemouse!=NULL)
		return(cio_api.hidemouse());
796
	return(-1);
deuce's avatar
deuce committed
797
}
798
799
800
801
802
803
804

void ciolib_settitle(const char *title) {
	CIOLIB_INIT();

	if(cio_api.settitle!=NULL)
		cio_api.settitle(title);
}