|
|
1.1 ! root 1: /* $Id: ciolib.c,v 1.30 2004/10/15 05:13:35 deuce Exp $ */ ! 2: ! 3: /**************************************************************************** ! 4: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 5: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 6: * * ! 7: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html * ! 8: * * ! 9: * This library is free software; you can redistribute it and/or * ! 10: * modify it under the terms of the GNU Lesser General Public License * ! 11: * as published by the Free Software Foundation; either version 2 * ! 12: * of the License, or (at your option) any later version. * ! 13: * See the GNU Lesser General Public License for more details: lgpl.txt or * ! 14: * http://www.fsf.org/copyleft/lesser.html * ! 15: * * ! 16: * Anonymous FTP access to the most recent released source is available at * ! 17: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 18: * * ! 19: * Anonymous CVS access to the development source and modification history * ! 20: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 21: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 22: * (just hit return, no password is necessary) * ! 23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 24: * * ! 25: * For Synchronet coding style and modification guidelines, see * ! 26: * http://www.synchro.net/source.html * ! 27: * * ! 28: * You are encouraged to submit any modifications (preferably in Unix diff * ! 29: * format) via e-mail to [email protected] * ! 30: * * ! 31: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 32: ****************************************************************************/ ! 33: ! 34: #include <stdarg.h> ! 35: #include <stdlib.h> /* malloc */ ! 36: #include <stdio.h> ! 37: ! 38: #include <threadwrap.h> ! 39: ! 40: #define CIOLIB_NO_MACROS ! 41: #include "ciolib.h" ! 42: ! 43: #ifdef _WIN32 ! 44: #include "win32cio.h" ! 45: #else ! 46: #ifndef NO_X ! 47: #include "x_cio.h" ! 48: #endif ! 49: #include "curs_cio.h" ! 50: #undef getch ! 51: #endif ! 52: ! 53: #include "ansi_cio.h" ! 54: ! 55: cioapi_t cio_api; ! 56: ! 57: static int ungotch; ! 58: static struct text_info cio_textinfo; ! 59: static int lastmode=3; ! 60: int _wscroll=1; ! 61: int directvideo=0; ! 62: int dont_move_cursor=0; ! 63: static int initialized=0; ! 64: ! 65: int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy); ! 66: char *ciolib_cgets(char *str); ! 67: int ciolib_cscanf (char *format , ...); ! 68: int ciolib_kbhit(void); ! 69: int ciolib_getch(void); ! 70: int ciolib_getche(void); ! 71: int ciolib_ungetch(int ch); ! 72: void ciolib_gettextinfo(struct text_info *info); ! 73: int ciolib_wherex(void); ! 74: int ciolib_wherey(void); ! 75: void ciolib_wscroll(void); ! 76: void ciolib_gotoxy(int x, int y); ! 77: void ciolib_clreol(void); ! 78: void ciolib_clrscr(void); ! 79: int ciolib_cputs(char *str); ! 80: int ciolib_cprintf(char *fmat, ...); ! 81: void ciolib_textbackground(int colour); ! 82: void ciolib_textcolor(int colour); ! 83: void ciolib_highvideo(void); ! 84: void ciolib_lowvideo(void); ! 85: void ciolib_normvideo(void); ! 86: int ciolib_puttext(int a,int b,int c,int d,unsigned char *e); ! 87: int ciolib_gettext(int a,int b,int c,int d,unsigned char *e); ! 88: void ciolib_textattr(int a); ! 89: void ciolib_delay(long a); ! 90: int ciolib_putch(int a); ! 91: void ciolib_setcursortype(int a); ! 92: void ciolib_textmode(int mode); ! 93: void ciolib_window(int sx, int sy, int ex, int ey); ! 94: void ciolib_delline(void); ! 95: void ciolib_insline(void); ! 96: char *ciolib_getpass(const char *prompt); ! 97: ! 98: #define CIOLIB_INIT() { if(!initialized) initciolib(CIOLIB_MODE_AUTO); } ! 99: ! 100: #ifndef _WIN32 ! 101: #ifndef NO_X ! 102: int try_x_init(int mode) ! 103: { ! 104: if(!console_init()) { ! 105: cio_api.mode=CIOLIB_MODE_X; ! 106: cio_api.mouse=1; ! 107: cio_api.puttext=x_puttext; ! 108: cio_api.gettext=x_gettext; ! 109: cio_api.textattr=x_textattr; ! 110: cio_api.kbhit=x_kbhit; ! 111: cio_api.delay=x_delay; ! 112: cio_api.wherey=x_wherey; ! 113: cio_api.wherex=x_wherex; ! 114: cio_api.putch=x_putch; ! 115: cio_api.gotoxy=x_gotoxy; ! 116: cio_api.gettextinfo=x_gettextinfo; ! 117: cio_api.setcursortype=x_setcursortype; ! 118: cio_api.getch=x_getch; ! 119: cio_api.getche=x_getche; ! 120: cio_api.textmode=x_textmode; ! 121: cio_api.showmouse=NULL; ! 122: cio_api.hidemouse=NULL; ! 123: cio_api.settitle=x_settitle; ! 124: return(1); ! 125: } ! 126: return(0); ! 127: } ! 128: #endif ! 129: ! 130: int try_curses_init(int mode) ! 131: { ! 132: if(curs_initciolib(mode)) { ! 133: cio_api.mode=CIOLIB_MODE_CURSES_IBM; ! 134: cio_api.puttext=curs_puttext; ! 135: cio_api.gettext=curs_gettext; ! 136: cio_api.textattr=curs_textattr; ! 137: cio_api.kbhit=curs_kbhit; ! 138: cio_api.delay=curs_delay; ! 139: cio_api.wherey=curs_wherey; ! 140: cio_api.wherex=curs_wherex; ! 141: cio_api.putch=curs_putch; ! 142: cio_api.gotoxy=curs_gotoxy; ! 143: cio_api.gettextinfo=curs_gettextinfo; ! 144: cio_api.setcursortype=curs_setcursortype; ! 145: cio_api.getch=curs_getch; ! 146: cio_api.getche=curs_getche; ! 147: cio_api.textmode=curs_textmode; ! 148: cio_api.showmouse=curs_showmouse; ! 149: cio_api.hidemouse=curs_hidemouse; ! 150: cio_api.settitle=NULL; ! 151: return(1); ! 152: } ! 153: return(0); ! 154: } ! 155: #endif ! 156: ! 157: int try_ansi_init(int mode) ! 158: { ! 159: if(ansi_initciolib(mode)) { ! 160: cio_api.mode=CIOLIB_MODE_ANSI; ! 161: cio_api.mouse=0; ! 162: cio_api.puttext=ansi_puttext; ! 163: cio_api.gettext=ansi_gettext; ! 164: cio_api.textattr=ansi_textattr; ! 165: cio_api.kbhit=ansi_kbhit; ! 166: cio_api.delay=ansi_delay; ! 167: cio_api.wherey=ansi_wherey; ! 168: cio_api.wherex=ansi_wherex; ! 169: cio_api.putch=ansi_putch; ! 170: cio_api.gotoxy=ansi_gotoxy; ! 171: cio_api.gettextinfo=ansi_gettextinfo; ! 172: cio_api.setcursortype=ansi_setcursortype; ! 173: cio_api.getch=ansi_getch; ! 174: cio_api.getche=ansi_getche; ! 175: cio_api.textmode=ansi_textmode; ! 176: cio_api.showmouse=NULL; ! 177: cio_api.hidemouse=NULL; ! 178: cio_api.settitle=NULL; ! 179: return(1); ! 180: } ! 181: return(0); ! 182: } ! 183: ! 184: #ifdef _WIN32 ! 185: #if defined(__BORLANDC__) ! 186: #pragma argsused ! 187: #endif ! 188: int try_conio_init(int mode) ! 189: { ! 190: /* This should test for something or other */ ! 191: if(win32_initciolib(C80)) { ! 192: cio_api.mode=CIOLIB_MODE_CONIO; ! 193: cio_api.mouse=1; ! 194: cio_api.puttext=win32_puttext; ! 195: cio_api.gettext=win32_gettext; ! 196: cio_api.textattr=win32_textattr; ! 197: cio_api.kbhit=win32_kbhit; ! 198: cio_api.wherey=win32_wherey; ! 199: cio_api.wherex=win32_wherex; ! 200: cio_api.putch=win32_putch; ! 201: cio_api.gotoxy=win32_gotoxy; ! 202: cio_api.gettextinfo=win32_gettextinfo; ! 203: cio_api.setcursortype=win32_setcursortype; ! 204: cio_api.getch=win32_getch; ! 205: cio_api.getche=win32_getche; ! 206: cio_api.textmode=win32_textmode; ! 207: cio_api.showmouse=win32_showmouse; ! 208: cio_api.hidemouse=win32_hidemouse; ! 209: cio_api.settitle=win32_settitle; ! 210: return(1); ! 211: } ! 212: return(0); ! 213: } ! 214: #endif ! 215: ! 216: int initciolib(int mode) ! 217: { ! 218: switch(mode) { ! 219: case CIOLIB_MODE_AUTO: ! 220: #ifdef _WIN32 ! 221: if(!try_conio_init(mode)) ! 222: #else ! 223: #ifndef NO_X ! 224: if(!try_x_init(mode)) ! 225: #endif ! 226: if(!try_curses_init(mode)) ! 227: #endif ! 228: try_ansi_init(mode); ! 229: break; ! 230: #ifdef _WIN32 ! 231: case CIOLIB_MODE_CONIO: ! 232: try_conio_init(mode); ! 233: break; ! 234: #else ! 235: case CIOLIB_MODE_CURSES: ! 236: case CIOLIB_MODE_CURSES_IBM: ! 237: try_curses_init(mode); ! 238: break; ! 239: ! 240: case CIOLIB_MODE_X: ! 241: #ifndef NO_X ! 242: try_x_init(mode); ! 243: #endif ! 244: break; ! 245: #endif ! 246: case CIOLIB_MODE_ANSI: ! 247: try_ansi_init(mode); ! 248: break; ! 249: } ! 250: if(cio_api.mode==CIOLIB_MODE_AUTO) { ! 251: fprintf(stderr,"CIOLIB initialization failed!\n"); ! 252: return(-1); ! 253: } ! 254: ! 255: initialized=1; ! 256: ciolib_gettextinfo(&cio_textinfo); ! 257: cio_textinfo.winleft=1; ! 258: cio_textinfo.wintop=1; ! 259: cio_textinfo.winright=cio_textinfo.screenwidth; ! 260: cio_textinfo.winbottom=cio_textinfo.screenheight; ! 261: cio_textinfo.normattr=7; ! 262: _beginthread(ciolib_mouse_thread,0,NULL); ! 263: return(0); ! 264: } ! 265: ! 266: int ciolib_kbhit(void) ! 267: { ! 268: CIOLIB_INIT(); ! 269: if(ungotch) ! 270: return(1); ! 271: if(mouse_pending()) ! 272: return(1); ! 273: return(cio_api.kbhit()); ! 274: } ! 275: ! 276: int ciolib_getch(void) ! 277: { ! 278: int ch; ! 279: ! 280: CIOLIB_INIT(); ! 281: ! 282: if(ungotch) { ! 283: ch=ungotch; ! 284: ungotch=0; ! 285: return(ch); ! 286: } ! 287: return(cio_api.getch()); ! 288: } ! 289: ! 290: int ciolib_getche(void) ! 291: { ! 292: int ch; ! 293: ! 294: CIOLIB_INIT(); ! 295: ! 296: if(ungotch) { ! 297: ch=ungotch; ! 298: ungotch=0; ! 299: ciolib_putch(ch); ! 300: return(ch); ! 301: } ! 302: return(cio_api.getche()); ! 303: } ! 304: ! 305: int ciolib_ungetch(int ch) ! 306: { ! 307: CIOLIB_INIT(); ! 308: ! 309: if(ungotch) ! 310: return(EOF); ! 311: ungotch=ch; ! 312: return(ch); ! 313: } ! 314: ! 315: int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy) ! 316: { ! 317: int width; ! 318: int height; ! 319: unsigned char *buf; ! 320: ! 321: CIOLIB_INIT(); ! 322: ! 323: width=ex-sx; ! 324: height=ey-sy; ! 325: buf=(unsigned char *)malloc((width+1)*(height+1)*2); ! 326: if(buf==NULL) ! 327: return(0); ! 328: if(!ciolib_gettext(sx,sy,ex,ey,buf)) { ! 329: free(buf); ! 330: return(0); ! 331: } ! 332: if(!ciolib_puttext(dx,dy,dx+width,dy+height,buf)) { ! 333: free(buf); ! 334: return(0); ! 335: } ! 336: free(buf); ! 337: return(1); ! 338: } ! 339: ! 340: char *ciolib_cgets(char *str) ! 341: { ! 342: int maxlen; ! 343: int len=0; ! 344: int ch; ! 345: ! 346: CIOLIB_INIT(); ! 347: ! 348: maxlen=*(unsigned char *)str; ! 349: while((ch=ciolib_getche())!='\n') { ! 350: switch(ch) { ! 351: case 0: /* Skip extended keys */ ! 352: ciolib_getche(); ! 353: break; ! 354: case '\r': /* Skip \r (ToDo: Should this be treeated as a \n? */ ! 355: break; ! 356: case '\b': ! 357: if(len==0) { ! 358: ciolib_putch(7); ! 359: break; ! 360: } ! 361: ciolib_putch('\b'); ! 362: len--; ! 363: break; ! 364: default: ! 365: str[(len++)+2]=ch; ! 366: if(len==maxlen) { ! 367: str[len+2]=0; ! 368: *((unsigned char *)(str+1))=(unsigned char)len; ! 369: return(&str[2]); ! 370: } ! 371: break; ! 372: } ! 373: } ! 374: str[len+2]=0; ! 375: *((unsigned char *)(str+1))=(unsigned char)len; ! 376: return(&str[2]); ! 377: } ! 378: ! 379: #ifdef _MSC_VER /* Use lame vsscanf() implementation */ ! 380: /* This is a way to do _vsscanf without using fancy stack tricks or using the ! 381: * "_input" method provided by Microsoft, which is no longer exported as of .NET. ! 382: * The function has a limit of 25 arguments (or less if you run out of stack space), ! 383: * but how many arguments do you need? ! 384: */ ! 385: /* From "krabsheva" - http://www.codeguru.com/Cpp/Cpp/string/comments.php/c5631/?thread=1051 */ ! 386: int vsscanf( const char *buffer, const char *format, va_list arg_ptr ) ! 387: { ! 388: int i, ret; ! 389: void *arg_arr[25]; ! 390: ! 391: // Do exception handling in case we go too far // ! 392: __try ! 393: { ! 394: for ( i = 0; i < 25; i++ ) ! 395: arg_arr[i] = va_arg( arg_ptr, void * ); ! 396: } ! 397: __except( EXCEPTION_EXECUTE_HANDLER ) ! 398: { ! 399: } ! 400: ! 401: /* This is lame, but the extra arguments won't be used by sscanf */ ! 402: ret = sscanf( buffer, format, arg_arr[0], arg_arr[1], arg_arr[2], arg_arr[3], ! 403: arg_arr[4], arg_arr[5], arg_arr[6], arg_arr[7], arg_arr[8], arg_arr[9], ! 404: arg_arr[10], arg_arr[11], arg_arr[12], arg_arr[13], arg_arr[14], ! 405: arg_arr[15], arg_arr[16], arg_arr[17], arg_arr[18], arg_arr[19], ! 406: arg_arr[20], arg_arr[21], arg_arr[22], arg_arr[23], arg_arr[24] ); ! 407: ! 408: return ret; ! 409: } ! 410: #endif ! 411: ! 412: int ciolib_cscanf (char *format , ...) ! 413: { ! 414: char str[255]; ! 415: va_list argptr; ! 416: int ret; ! 417: ! 418: CIOLIB_INIT(); ! 419: ! 420: str[0]=-1; ! 421: va_start(argptr,format); ! 422: ret=vsscanf(ciolib_cgets(str),format,argptr); ! 423: va_end(argptr); ! 424: return(ret); ! 425: } ! 426: ! 427: char *ciolib_getpass(const char *prompt) ! 428: { ! 429: static char pass[9]; ! 430: int len=0; ! 431: int ch; ! 432: ! 433: CIOLIB_INIT(); ! 434: ! 435: ciolib_cputs((char *)prompt); ! 436: while((ch=ciolib_getch())!='\n') { ! 437: switch(ch) { ! 438: case 0: /* Skip extended keys */ ! 439: ciolib_getch(); ! 440: break; ! 441: case '\r': /* Skip \r (ToDo: Should this be treeated as a \n? */ ! 442: break; ! 443: case '\b': ! 444: if(len==0) { ! 445: ciolib_putch(7); ! 446: break; ! 447: } ! 448: len--; ! 449: break; ! 450: default: ! 451: if(len==8) ! 452: ciolib_putch(7); ! 453: else ! 454: pass[len++]=ch; ! 455: break; ! 456: } ! 457: } ! 458: pass[len]=0; ! 459: return(pass); ! 460: } ! 461: ! 462: void ciolib_gettextinfo(struct text_info *info) ! 463: { ! 464: if(!initialized) ! 465: initciolib(CIOLIB_MODE_AUTO); ! 466: else { ! 467: cio_api.gettextinfo(&cio_textinfo); ! 468: } ! 469: if(info!=&cio_textinfo) { ! 470: info->winleft=cio_textinfo.winleft; /* left window coordinate */ ! 471: info->wintop=cio_textinfo.wintop; /* top window coordinate */ ! 472: info->winright=cio_textinfo.winright; /* right window coordinate */ ! 473: info->winbottom=cio_textinfo.winbottom; /* bottom window coordinate */ ! 474: info->attribute=cio_textinfo.attribute; /* text attribute */ ! 475: info->normattr=cio_textinfo.normattr; /* normal attribute */ ! 476: info->currmode=cio_textinfo.currmode; /* current video mode: ! 477: BW40, BW80, C40, C80, or C4350 */ ! 478: info->screenheight=cio_textinfo.screenheight; /* text screen's height */ ! 479: info->screenwidth=cio_textinfo.screenwidth; /* text screen's width */ ! 480: info->curx=cio_textinfo.curx; /* x-coordinate in current window */ ! 481: info->cury=cio_textinfo.cury; /* y-coordinate in current window */ ! 482: } ! 483: } ! 484: ! 485: void ciolib_wscroll(void) ! 486: { ! 487: int os; ! 488: struct text_info ti; ! 489: ! 490: CIOLIB_INIT(); ! 491: ! 492: ciolib_gettextinfo(&ti); ! 493: if(!_wscroll) ! 494: return; ! 495: ciolib_movetext(ti.winleft,ti.wintop+1,ti.winright,ti.winbottom,ti.winleft,ti.wintop); ! 496: ciolib_gotoxy(1,ti.winbottom-ti.winleft+1); ! 497: os=_wscroll; ! 498: _wscroll=0; ! 499: /* ciolib_cprintf("%*s",ti.winright-ti.winleft+1,""); */ ! 500: ciolib_clreol(); ! 501: _wscroll=os; ! 502: ciolib_gotoxy(ti.curx,ti.cury); ! 503: } ! 504: ! 505: int ciolib_wherex(void) ! 506: { ! 507: int x; ! 508: ! 509: CIOLIB_INIT(); ! 510: ! 511: x=cio_api.wherex(); ! 512: x=x-cio_textinfo.winleft+1; ! 513: return(x); ! 514: } ! 515: ! 516: int ciolib_wherey(void) ! 517: { ! 518: int y; ! 519: ! 520: CIOLIB_INIT(); ! 521: ! 522: y=cio_api.wherey(); ! 523: y=y-cio_textinfo.wintop+1; ! 524: return(y); ! 525: } ! 526: ! 527: void ciolib_gotoxy(int x, int y) ! 528: { ! 529: int nx; ! 530: int ny; ! 531: struct text_info ti; ! 532: ! 533: CIOLIB_INIT(); ! 534: ! 535: ciolib_gettextinfo(&ti); ! 536: if( x < 1 ! 537: || x > ti.winright-ti.winleft+1 ! 538: || y < 1 ! 539: || y > ti.winbottom-ti.wintop+1) ! 540: return; ! 541: nx=x+ti.winleft-1; ! 542: ny=y+ti.wintop-1; ! 543: cio_api.gotoxy(nx,ny); ! 544: } ! 545: ! 546: void ciolib_textmode(mode) ! 547: { ! 548: CIOLIB_INIT(); ! 549: ! 550: if(mode==-1) { ! 551: ciolib_gettextinfo(&cio_textinfo); ! 552: cio_api.textmode(lastmode); ! 553: lastmode=cio_textinfo.currmode; ! 554: } ! 555: else { ! 556: ciolib_gettextinfo(&cio_textinfo); ! 557: lastmode=cio_textinfo.currmode; ! 558: cio_api.textmode(mode); ! 559: } ! 560: ciolib_gettextinfo(&cio_textinfo); ! 561: cio_textinfo.winleft=1; ! 562: cio_textinfo.wintop=1; ! 563: cio_textinfo.winright=cio_textinfo.screenwidth; ! 564: cio_textinfo.winbottom=cio_textinfo.screenheight; ! 565: } ! 566: ! 567: void ciolib_window(int sx, int sy, int ex, int ey) ! 568: { ! 569: CIOLIB_INIT(); ! 570: ! 571: ciolib_gettextinfo(&cio_textinfo); ! 572: if( sx < 1 ! 573: || sy < 1 ! 574: || ex < 1 ! 575: || ey < 1 ! 576: || sx > cio_textinfo.screenwidth ! 577: || sy > cio_textinfo.screenheight ! 578: || sx > ex ! 579: || sy > ey ! 580: || ex > cio_textinfo.screenwidth ! 581: || ey > cio_textinfo.screenheight) ! 582: return; ! 583: cio_textinfo.winleft=sx; ! 584: cio_textinfo.wintop=sy; ! 585: cio_textinfo.winright=ex; ! 586: cio_textinfo.winbottom=ey; ! 587: ciolib_gotoxy(1,1); ! 588: } ! 589: ! 590: void ciolib_clreol(void) ! 591: { ! 592: unsigned char *buf; ! 593: int i; ! 594: int width,height; ! 595: struct text_info ti; ! 596: ! 597: CIOLIB_INIT(); ! 598: ! 599: ciolib_gettextinfo(&ti); ! 600: ! 601: width=ti.winright-ti.curx+1; ! 602: height=1; ! 603: buf=(unsigned char *)malloc(width*height*2); ! 604: for(i=0;i<width*height*2;) { ! 605: buf[i++]=' '; ! 606: buf[i++]=ti.attribute; ! 607: } ! 608: ciolib_puttext(ti.curx+ti.winleft-1,ti.cury+ti.wintop-1,ti.winright,ti.cury+ti.wintop-1,buf); ! 609: free(buf); ! 610: } ! 611: ! 612: void ciolib_clrscr(void) ! 613: { ! 614: unsigned char *buf; ! 615: int i; ! 616: int width,height; ! 617: struct text_info ti; ! 618: ! 619: CIOLIB_INIT(); ! 620: ! 621: ciolib_gettextinfo(&ti); ! 622: ! 623: width=ti.winright-ti.winleft+1; ! 624: height=ti.winbottom-ti.wintop+1; ! 625: buf=(unsigned char *)malloc(width*height*2); ! 626: for(i=0;i<width*height*2;) { ! 627: buf[i++]=' '; ! 628: buf[i++]=ti.attribute; ! 629: } ! 630: ciolib_puttext(ti.winleft,ti.wintop,ti.winright,ti.winbottom,buf); ! 631: free(buf); ! 632: } ! 633: ! 634: void ciolib_delline(void) ! 635: { ! 636: struct text_info ti; ! 637: ! 638: CIOLIB_INIT(); ! 639: ! 640: ciolib_gettextinfo(&ti); ! 641: ! 642: ciolib_movetext(ti.winleft,ti.cury+1,ti.winright,ti.winbottom,ti.winleft,ti.cury); ! 643: ciolib_gotoxy(1,ti.winbottom-ti.wintop+1); ! 644: ciolib_clreol(); ! 645: ciolib_gotoxy(ti.curx,ti.cury); ! 646: } ! 647: ! 648: void ciolib_insline(void) ! 649: { ! 650: struct text_info ti; ! 651: ! 652: CIOLIB_INIT(); ! 653: ! 654: ciolib_gettextinfo(&ti); ! 655: ! 656: ciolib_movetext(ti.winleft,ti.cury,ti.winright,ti.winbottom,ti.winleft,ti.cury+1); ! 657: ciolib_gotoxy(1,ti.cury); ! 658: ciolib_clreol(); ! 659: ciolib_gotoxy(ti.curx,ti.cury); ! 660: } ! 661: ! 662: int ciolib_cprintf(char *fmat, ...) ! 663: { ! 664: va_list argptr; ! 665: int ret; ! 666: #ifdef _MSC_VER /* Can't figure out a way to allocate a "big enough" buffer for Win32. */ ! 667: char str[16384]; ! 668: #else ! 669: char *str; ! 670: #endif ! 671: ! 672: CIOLIB_INIT(); ! 673: ! 674: va_start(argptr,fmat); ! 675: #ifdef _MSC_VER ! 676: ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr); ! 677: #else ! 678: ret=vsnprintf(NULL,0,fmat,argptr); ! 679: str=(char *)malloc(ret+1); ! 680: if(str==NULL) ! 681: return(EOF); ! 682: ret=vsprintf(str,fmat,argptr); ! 683: #endif ! 684: va_end(argptr); ! 685: if(ret>=0) ! 686: ciolib_cputs(str); ! 687: else ! 688: ret=EOF; ! 689: #ifndef _WIN32 ! 690: free(str); ! 691: #endif ! 692: return(ret); ! 693: } ! 694: ! 695: int ciolib_cputs(char *str) ! 696: { ! 697: int pos; ! 698: int ret=0; ! 699: int olddmc; ! 700: ! 701: CIOLIB_INIT(); ! 702: ! 703: olddmc=dont_move_cursor; ! 704: dont_move_cursor=1; ! 705: for(pos=0;str[pos];pos++) ! 706: { ! 707: ret=str[pos]; ! 708: if(str[pos]=='\n') ! 709: ciolib_putch('\r'); ! 710: ciolib_putch(str[pos]); ! 711: } ! 712: dont_move_cursor=olddmc; ! 713: ciolib_gotoxy(ciolib_wherex(),ciolib_wherey()); ! 714: return(ret); ! 715: } ! 716: ! 717: void ciolib_textbackground(int colour) ! 718: { ! 719: unsigned char attr; ! 720: ! 721: CIOLIB_INIT(); ! 722: ! 723: ciolib_gettextinfo(&cio_textinfo); ! 724: attr=cio_textinfo.attribute; ! 725: attr&=143; ! 726: attr|=(colour<<4); ! 727: ciolib_textattr(attr); ! 728: } ! 729: ! 730: void ciolib_textcolor(int colour) ! 731: { ! 732: unsigned char attr; ! 733: ! 734: CIOLIB_INIT(); ! 735: ! 736: ciolib_gettextinfo(&cio_textinfo); ! 737: attr=cio_textinfo.attribute; ! 738: attr&=240; ! 739: attr|=colour; ! 740: ciolib_textattr(attr); ! 741: } ! 742: ! 743: void ciolib_highvideo(void) ! 744: { ! 745: int attr; ! 746: ! 747: CIOLIB_INIT(); ! 748: ! 749: ciolib_gettextinfo(&cio_textinfo); ! 750: attr=cio_textinfo.attribute; ! 751: attr |= 8; ! 752: ciolib_textattr(attr); ! 753: } ! 754: ! 755: void ciolib_lowvideo(void) ! 756: { ! 757: int attr; ! 758: ! 759: CIOLIB_INIT(); ! 760: ! 761: ciolib_gettextinfo(&cio_textinfo); ! 762: attr=cio_textinfo.attribute; ! 763: attr &= 0xf7; ! 764: ciolib_textattr(attr); ! 765: } ! 766: ! 767: void ciolib_normvideo(void) ! 768: { ! 769: CIOLIB_INIT(); ! 770: ! 771: ciolib_textattr(0x07); ! 772: } ! 773: ! 774: int ciolib_puttext(int a,int b,int c,int d,unsigned char *e) ! 775: { ! 776: CIOLIB_INIT(); ! 777: ! 778: return(cio_api.puttext(a,b,c,d,e)); ! 779: } ! 780: ! 781: int ciolib_gettext(int a,int b,int c,int d,unsigned char *e) ! 782: { ! 783: CIOLIB_INIT(); ! 784: ! 785: return(cio_api.gettext(a,b,c,d,e)); ! 786: } ! 787: ! 788: void ciolib_textattr(int a) ! 789: { ! 790: CIOLIB_INIT(); ! 791: ! 792: cio_api.textattr(a); ! 793: } ! 794: ! 795: void ciolib_delay(long a) ! 796: { ! 797: CIOLIB_INIT(); ! 798: ! 799: cio_api.delay(a); ! 800: } ! 801: ! 802: int ciolib_putch(int a) ! 803: { ! 804: unsigned char a1=a; ! 805: CIOLIB_INIT(); ! 806: ! 807: return(cio_api.putch(a1)); ! 808: } ! 809: ! 810: void ciolib_setcursortype(int a) ! 811: { ! 812: CIOLIB_INIT(); ! 813: ! 814: cio_api.setcursortype(a); ! 815: } ! 816: ! 817: int ciolib_showmouse(void) { ! 818: CIOLIB_INIT(); ! 819: ! 820: if(cio_api.showmouse!=NULL) ! 821: return(cio_api.showmouse()); ! 822: return(-1); ! 823: } ! 824: ! 825: int ciolib_hidemouse(void) { ! 826: CIOLIB_INIT(); ! 827: ! 828: if(cio_api.hidemouse!=NULL) ! 829: return(cio_api.hidemouse()); ! 830: return(-1); ! 831: } ! 832: ! 833: void ciolib_settitle(const char *title) { ! 834: CIOLIB_INIT(); ! 835: ! 836: if(cio_api.settitle!=NULL) ! 837: cio_api.settitle(title); ! 838: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.