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

#define CIOLIB_NO_MACROS
#include "ciolib.h"

deuce's avatar
deuce committed
8
9
10
#ifdef _WIN32
 #include "win32cio.h"
#else
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
55
56
57
58
59
60
61
 #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;
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);
void ciolib_textattr(unsigned char a);
void ciolib_delay(long a);
int ciolib_putch(unsigned char a);
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);

62
63
#define CIOLIB_INIT()		{ if(!initialized) initciolib(CIOLIB_MODE_AUTO); }

64
65
66
67
68
#ifndef _WIN32
 #ifndef NO_X
int try_x_init(int mode)
{
	if(!console_init()) {
69
		cio_api.mode=CIOLIB_MODE_X;
deuce's avatar
deuce committed
70
		cio_api.mouse=0;
71
72
73
74
75
76
77
78
79
80
81
82
83
84
		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
85
86
87
		cio_api.getmouse=NULL;
		cio_api.showmouse=NULL;
		cio_api.hidemouse=NULL;
88
		cio_api.settitle=x_settitle;
89
90
91
92
93
94
95
96
97
98
		return(1);
	}
	fprintf(stderr,"X init failed\n");
	return(0);
}
 #endif

int try_curses_init(int mode)
{
	if(curs_initciolib(mode)) {
99
		cio_api.mode=CIOLIB_MODE_CURSES_IBM;
100
101
102
103
104
105
106
107
108
109
110
111
112
113
		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
114
115
116
		cio_api.getmouse=curs_getmouse;
		cio_api.showmouse=curs_showmouse;
		cio_api.hidemouse=curs_hidemouse;
117
		cio_api.settitle=NULL;
118
119
120
121
122
123
124
125
126
127
		return(1);
	}
	fprintf(stderr,"Curses init failed\n");
	return(0);
}
#endif

int try_ansi_init(int mode)
{
	if(ansi_initciolib(mode)) {
128
		cio_api.mode=CIOLIB_MODE_ANSI;
deuce's avatar
deuce committed
129
		cio_api.mouse=0;
130
131
132
133
134
135
136
137
138
139
140
141
142
143
		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
144
145
146
		cio_api.getmouse=NULL;
		cio_api.showmouse=NULL;
		cio_api.hidemouse=NULL;
147
		cio_api.settitle=NULL;
148
149
150
151
152
153
154
		return(1);
	}
	fprintf(stderr,"ANSI init failed\n");
	return(0);
}

#ifdef _WIN32
155
156
157
#if defined(__BORLANDC__)
        #pragma argsused
#endif
158
int try_conio_init(int mode)
159
160
{
	/* This should test for something or other */
deuce's avatar
deuce committed
161
	if(win32_initciolib(mode)) {
162
		cio_api.mode=CIOLIB_MODE_CONIO;
deuce's avatar
deuce committed
163
		cio_api.mouse=1;
164
165
166
		cio_api.puttext=win32_puttext;
		cio_api.gettext=win32_gettext;
		cio_api.textattr=win32_textattr;
deuce's avatar
deuce committed
167
		cio_api.kbhit=win32_kbhit;
168
169
170
171
172
173
		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
174
175
		cio_api.getch=win32_getch;
		cio_api.getche=win32_getche;
176
		cio_api.textmode=win32_textmode;
deuce's avatar
deuce committed
177
178
179
		cio_api.getmouse=win32_getmouse;
		cio_api.showmouse=win32_showmouse;
		cio_api.hidemouse=win32_hidemouse;
180
		cio_api.settitle=NULL;
181
182
		return(1);
	}
183
	fprintf(stderr,"CONIO init failed\n");
184
185
186
187
188
189
190
	return(0);
}
#endif

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

212
		case CIOLIB_MODE_X:
213
#ifndef NO_X
214
			try_x_init(mode);
215
#endif
216
217
			break;
#endif
218
		case CIOLIB_MODE_ANSI:
219
220
221
			try_ansi_init(mode);
			break;
	}
222
	if(cio_api.mode==CIOLIB_MODE_AUTO) {
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
		fprintf(stderr,"CIOLIB initialization failed!");
		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;
	return(0);
}

int ciolib_kbhit(void)
{
239
	CIOLIB_INIT();
240
241
242
243
244
245
246
247
248
	if(ungotch)
		return(1);
	return(cio_api.kbhit());
}

int ciolib_getch(void)
{
	int ch;

249
250
	CIOLIB_INIT();

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

int ciolib_getche(void)
{
	int ch;

263
264
	CIOLIB_INIT();

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

int ciolib_ungetch(int ch)
{
276
277
	CIOLIB_INIT();
	
278
279
280
281
282
283
284
285
286
287
	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;
288
	unsigned char *buf;
289

290
291
	CIOLIB_INIT();
	
292
293
	width=ex-sx;
	height=ey-sy;
294
	buf=(unsigned char *)malloc((width+1)*(height+1)*2);
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
	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 chars;
	int ch;

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

int ciolib_cscanf (char *format , ...)
{
	char str[255];
    va_list argptr;
	int ret;

355
356
	CIOLIB_INIT();
	
357
358
359
360
361
362
363
364
365
366
367
368
369
370
	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 chars;
	int ch;

371
372
	CIOLIB_INIT();
	
373
	ciolib_cputs((char *)prompt);
374
375
376
	while((ch=getch())!='\n') {
		switch(ch) {
			case 0:	/* Skip extended keys */
377
				getch();
378
379
380
381
382
				break;
			case '\r':	/* Skip \r (ToDo: Should this be treeated as a \n? */
				break;
			case '\b':
				if(len==0) {
383
					ciolib_putch(7);
384
385
386
387
388
389
					break;
				}
				len--;
				break;
			default:
				if(len==8)
390
					ciolib_putch(7);
391
392
393
394
395
				else
					pass[len++]=ch;
				break;
		}
	}
396
397
	pass[len]=0;
	return(pass);
398
399
400
401
402
}

void ciolib_gettextinfo(struct text_info *info)
{
	if(!initialized)
403
		initciolib(CIOLIB_MODE_AUTO);
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
	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)
{
	char *buf;
	int os;
	struct text_info ti;

429
430
	CIOLIB_INIT();
	
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
	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;
	ciolib_cprintf("%*s",ti.winright-ti.winleft+1,"");
	_wscroll=os;
	ciolib_gotoxy(ti.curx,ti.cury);
}

int ciolib_wherex(void)
{
	int x;

447
448
	CIOLIB_INIT();
	
449
450
451
452
453
454
455
456
457
	x=cio_api.wherex();
	x=x-cio_textinfo.winleft+1;
	return(x);
}

int ciolib_wherey(void)
{
	int y;

458
459
	CIOLIB_INIT();
	
460
461
462
463
464
465
466
467
468
469
470
	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;

471
472
	CIOLIB_INIT();
	
473
474
475
476
477
478
479
480
481
482
483
484
485
	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)
{
486
487
	CIOLIB_INIT();
	
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
	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)
{
507
508
	CIOLIB_INIT();
	
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
	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)
{
	int os;
	struct text_info	ti;

533
534
	CIOLIB_INIT();
	
535
536
537
538
539
540
541
542
543
544
	ciolib_gettextinfo(&ti);
	os=_wscroll;
	_wscroll=0;
	ciolib_cprintf("%*s",ti.winright-ti.curx+1,"");
	_wscroll=os;
	ciolib_gotoxy(ti.curx,ti.cury);
}

void ciolib_clrscr(void)
{
545
	unsigned char *buf;
546
547
548
549
	int i;
	int width,height;
	struct text_info ti;

550
551
	CIOLIB_INIT();
	
552
553
554
555
	ciolib_gettextinfo(&ti);

	width=ti.winright-ti.winleft+1;
	height=ti.winbottom-ti.wintop+1;
556
	buf=(unsigned char *)malloc(width*height*2);
557
558
559
560
561
562
563
564
565
566
567
568
	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;

569
570
	CIOLIB_INIT();
	
571
572
573
574
575
576
577
578
579
580
581
582
	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;

583
584
	CIOLIB_INIT();
	
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
	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		pos;
	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

604
605
	CIOLIB_INIT();
	
606
    va_start(argptr,fmat);
607
#ifdef _WIN32
rswindell's avatar
rswindell committed
608
	ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr);
609
610
611
612
613
614
615
616
617
618
619
620
#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;
621
#ifndef _WIN32
622
623
624
625
626
627
628
629
630
631
	free(str);
#endif
    return(ret);
}

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

632
633
	CIOLIB_INIT();
	
634
635
636
637
638
639
640
641
642
643
644
645
646
647
	for(pos=0;str[pos];pos++)
	{
		ret=str[pos];
		if(str[pos]=='\n')
			ciolib_putch('\r');
		ciolib_putch(str[pos]);
	}
	return(ret);
}

void ciolib_textbackground(int colour)
{
	unsigned char attr;

648
649
	CIOLIB_INIT();
	
650
651
652
653
654
655
656
657
658
659
660
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr&=143;
	attr|=(colour<<4);
	ciolib_textattr(attr);
}

void ciolib_textcolor(int colour)
{
	unsigned char attr;

661
662
	CIOLIB_INIT();
	
663
664
665
666
667
668
669
670
671
672
673
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr&=240;
	attr|=colour;
	ciolib_textattr(attr);
}

void ciolib_highvideo(void)
{
	int attr;

674
675
	CIOLIB_INIT();
	
676
677
678
679
680
681
682
683
684
685
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr |= 8;
	ciolib_textattr(attr);
}

void ciolib_lowvideo(void)
{
	int attr;

686
687
	CIOLIB_INIT();
	
688
689
690
691
692
693
694
695
	ciolib_gettextinfo(&cio_textinfo);
	attr=cio_textinfo.attribute;
	attr &= 0xf7;
	ciolib_textattr(attr);
}

void ciolib_normvideo(void)
{
696
697
	CIOLIB_INIT();
	
698
699
700
701
702
	ciolib_textattr(0x07);
}

int ciolib_puttext(int a,int b,int c,int d,unsigned char *e)
{
703
704
	CIOLIB_INIT();
	
705
706
707
708
709
	return(cio_api.puttext(a,b,c,d,e));
}

int ciolib_gettext(int a,int b,int c,int d,unsigned char *e)
{
710
711
	CIOLIB_INIT();
	
712
713
714
715
716
	return(cio_api.gettext(a,b,c,d,e));
}

void ciolib_textattr(unsigned char a)
{
717
718
	CIOLIB_INIT();
	
719
720
721
722
723
	cio_api.textattr(a);
}

void ciolib_delay(long a)
{
724
725
	CIOLIB_INIT();
	
726
727
728
729
730
	cio_api.delay(a);
}

int ciolib_putch(unsigned char a)
{
731
	CIOLIB_INIT();
732

733
734
735
736
737
	return(cio_api.putch(a));
}

void ciolib_setcursortype(int a)
{
738
739
	CIOLIB_INIT();
	
740
741
	cio_api.setcursortype(a);
}
deuce's avatar
deuce committed
742
743
744
745
746
747
748
749
750
751
752
753
754
755

int ciolib_getmouse(struct cio_mouse_event *mevent) {
	CIOLIB_INIT();

	if(cio_api.getmouse!=NULL)
		return(cio_api.getmouse(mevent));
	return(-1);
}

int ciolib_showmouse(void) {
	CIOLIB_INIT();

	if(cio_api.showmouse!=NULL)
		return(cio_api.showmouse());
756
	return(-1);
deuce's avatar
deuce committed
757
758
759
760
761
762
763
}

int ciolib_hidemouse(void) {
	CIOLIB_INIT();

	if(cio_api.hidemouse!=NULL)
		return(cio_api.hidemouse());
764
	return(-1);
deuce's avatar
deuce committed
765
}
766
767
768
769
770
771
772

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

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