Annotation of sbbs/src/conio/ciolib.c, revision 1.1.1.1

1.1       root        1: /* $Id: ciolib.c,v 1.77 2006/09/02 07:25:56 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: /* Icon file! */
                     35: #ifdef __BORLANDC__
                     36: #pragma resource "ciolib.res"
                     37: #endif
                     38: 
                     39: #include <stdarg.h>
                     40: #include <stdlib.h>    /* alloca */
                     41: #include <stdio.h>
                     42: #if defined(_WIN32)
                     43:  #include <malloc.h>   /* alloca() on Win32 */
                     44: #endif
                     45: 
                     46: #include <threadwrap.h>
                     47: 
                     48: #define CIOLIB_NO_MACROS
                     49: #include "ciolib.h"
                     50: 
                     51: #ifdef WITH_SDL
                     52:  #include "sdl_con.h"
                     53: #endif
                     54: #ifdef _WIN32
                     55:  #include "win32cio.h"
                     56: #else
                     57:  #ifndef NO_X
                     58:   #include "x_cio.h"
                     59:  #endif
                     60:  #include "curs_cio.h"
                     61:  #undef getch
                     62: #endif
                     63: 
                     64: #include "ansi_cio.h"
                     65: 
                     66: CIOLIBEXPORT cioapi_t  cio_api;
                     67: 
                     68: static int ungotch;
                     69: static struct text_info cio_textinfo;
                     70: static int lastmode=3;
                     71: CIOLIBEXPORT int _wscroll=1;
                     72: CIOLIBEXPORT int directvideo=0;
                     73: CIOLIBEXPORT int hold_update=0;
                     74: CIOLIBEXPORT int puttext_can_move=0;
                     75: static int initialized=0;
                     76: 
                     77: CIOLIBEXPORT int CIOLIBCALL ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy);
                     78: CIOLIBEXPORT char * CIOLIBCALL ciolib_cgets(char *str);
                     79: CIOLIBEXPORT int CIOLIBCALL ciolib_cscanf (char *format , ...);
                     80: CIOLIBEXPORT int CIOLIBCALL ciolib_kbhit(void);
                     81: CIOLIBEXPORT int CIOLIBCALL ciolib_getch(void);
                     82: CIOLIBEXPORT int CIOLIBCALL ciolib_getche(void);
                     83: CIOLIBEXPORT int CIOLIBCALL ciolib_ungetch(int ch);
                     84: CIOLIBEXPORT void CIOLIBCALL ciolib_gettextinfo(struct text_info *info);
                     85: CIOLIBEXPORT int CIOLIBCALL ciolib_wherex(void);
                     86: CIOLIBEXPORT int CIOLIBCALL ciolib_wherey(void);
                     87: CIOLIBEXPORT void CIOLIBCALL ciolib_wscroll(void);
                     88: CIOLIBEXPORT void CIOLIBCALL ciolib_gotoxy(int x, int y);
                     89: CIOLIBEXPORT void CIOLIBCALL ciolib_clreol(void);
                     90: CIOLIBEXPORT void CIOLIBCALL ciolib_clrscr(void);
                     91: CIOLIBEXPORT int CIOLIBCALL ciolib_cputs(char *str);
                     92: CIOLIBEXPORT int       CIOLIBCALL ciolib_cprintf(char *fmat, ...);
                     93: CIOLIBEXPORT void CIOLIBCALL ciolib_textbackground(int colour);
                     94: CIOLIBEXPORT void CIOLIBCALL ciolib_textcolor(int colour);
                     95: CIOLIBEXPORT void CIOLIBCALL ciolib_highvideo(void);
                     96: CIOLIBEXPORT void CIOLIBCALL ciolib_lowvideo(void);
                     97: CIOLIBEXPORT void CIOLIBCALL ciolib_normvideo(void);
                     98: CIOLIBEXPORT int CIOLIBCALL ciolib_puttext(int a,int b,int c,int d,unsigned char *e);
                     99: CIOLIBEXPORT int CIOLIBCALL ciolib_gettext(int a,int b,int c,int d,unsigned char *e);
                    100: CIOLIBEXPORT void CIOLIBCALL ciolib_textattr(int a);
                    101: CIOLIBEXPORT void CIOLIBCALL ciolib_delay(long a);
                    102: CIOLIBEXPORT int CIOLIBCALL ciolib_putch(int a);
                    103: CIOLIBEXPORT void CIOLIBCALL ciolib_setcursortype(int a);
                    104: CIOLIBEXPORT void CIOLIBCALL ciolib_textmode(int mode);
                    105: CIOLIBEXPORT void CIOLIBCALL ciolib_window(int sx, int sy, int ex, int ey);
                    106: CIOLIBEXPORT void CIOLIBCALL ciolib_delline(void);
                    107: CIOLIBEXPORT void CIOLIBCALL ciolib_insline(void);
                    108: CIOLIBEXPORT char * CIOLIBCALL ciolib_getpass(const char *prompt);
                    109: CIOLIBEXPORT void CIOLIBCALL ciolib_copytext(const char *text, size_t buflen);
                    110: CIOLIBEXPORT char * CIOLIBCALL ciolib_getcliptext(void);
                    111: 
                    112: #define CIOLIB_INIT()          { if(initialized != 1) initciolib(CIOLIB_MODE_AUTO); }
                    113: 
                    114: #ifdef WITH_SDL
                    115: int try_sdl_init(int mode)
                    116: {
                    117:        if(!sdl_initciolib(mode)) {
                    118:                cio_api.mouse=1;
                    119:                cio_api.puttext=sdl_puttext;
                    120:                cio_api.gettext=sdl_gettext;
                    121:                cio_api.textattr=sdl_textattr;
                    122:                cio_api.kbhit=sdl_kbhit;
                    123:                cio_api.delay=sdl_delay;
                    124:                cio_api.wherey=sdl_wherey;
                    125:                cio_api.wherex=sdl_wherex;
                    126:                cio_api.putch=sdl_putch;
                    127:                cio_api.gotoxy=sdl_gotoxy;
                    128:                cio_api.gettextinfo=sdl_gettextinfo;
                    129:                cio_api.setcursortype=sdl_setcursortype;
                    130:                cio_api.getch=sdl_getch;
                    131:                cio_api.getche=sdl_getche;
                    132:                cio_api.textmode=sdl_textmode;
                    133:                cio_api.showmouse=sdl_showmouse;
                    134:                cio_api.hidemouse=sdl_hidemouse;
                    135:                cio_api.setname=sdl_setname;
                    136:                cio_api.settitle=sdl_settitle;
                    137: #ifdef _WIN32
                    138:                cio_api.copytext=win32_copytext;
                    139:                cio_api.getcliptext=win32_getcliptext;
                    140: #else
                    141:                cio_api.copytext=sdl_copytext;
                    142:                cio_api.getcliptext=sdl_getcliptext;
                    143: #endif
                    144:                cio_api.setfont=sdl_setfont;
                    145:                cio_api.getfont=sdl_getfont;
                    146:                cio_api.loadfont=sdl_loadfont;
                    147:                return(1);
                    148:        }
                    149:        return(0);
                    150: }
                    151: #endif
                    152: 
                    153: #ifndef _WIN32
                    154:  #ifndef NO_X
                    155: int try_x_init(int mode)
                    156: {
                    157:        if(!console_init()) {
                    158:                cio_api.mode=CIOLIB_MODE_X;
                    159:                cio_api.mouse=1;
                    160:                cio_api.puttext=x_puttext;
                    161:                cio_api.gettext=x_gettext;
                    162:                cio_api.textattr=x_textattr;
                    163:                cio_api.kbhit=x_kbhit;
                    164:                cio_api.delay=x_delay;
                    165:                cio_api.wherey=x_wherey;
                    166:                cio_api.wherex=x_wherex;
                    167:                cio_api.putch=x_putch;
                    168:                cio_api.gotoxy=x_gotoxy;
                    169:                cio_api.gettextinfo=x_gettextinfo;
                    170:                cio_api.setcursortype=x_setcursortype;
                    171:                cio_api.getch=x_getch;
                    172:                cio_api.getche=x_getche;
                    173:                cio_api.textmode=x_textmode;
                    174:                cio_api.setname=x_setname;
                    175:                cio_api.settitle=x_settitle;
                    176:                cio_api.copytext=x_copytext;
                    177:                cio_api.getcliptext=x_getcliptext;
                    178:                cio_api.setfont=x_setfont;
                    179:                cio_api.getfont=x_getfont;
                    180:                cio_api.loadfont=x_loadfont;
                    181:                return(1);
                    182:        }
                    183:        return(0);
                    184: }
                    185:  #endif
                    186: 
                    187: int try_curses_init(int mode)
                    188: {
                    189:        if(curs_initciolib(mode)) {
                    190:                cio_api.mode=CIOLIB_MODE_CURSES_IBM;
                    191:                cio_api.puttext=curs_puttext;
                    192:                cio_api.gettext=curs_gettext;
                    193:                cio_api.textattr=curs_textattr;
                    194:                cio_api.kbhit=curs_kbhit;
                    195:                cio_api.delay=curs_delay;
                    196:                cio_api.wherey=curs_wherey;
                    197:                cio_api.wherex=curs_wherex;
                    198:                cio_api.putch=curs_putch;
                    199:                cio_api.gotoxy=curs_gotoxy;
                    200:                cio_api.gettextinfo=curs_gettextinfo;
                    201:                cio_api.setcursortype=curs_setcursortype;
                    202:                cio_api.getch=curs_getch;
                    203:                cio_api.getche=curs_getche;
                    204:                cio_api.textmode=curs_textmode;
                    205:                cio_api.showmouse=curs_showmouse;
                    206:                cio_api.hidemouse=curs_hidemouse;
                    207:                cio_api.suspend=curs_suspend;
                    208:                cio_api.resume=curs_resume;
                    209: #ifdef NCURSES_VERSION_MAJOR
                    210:                cio_api.ESCDELAY=&ESCDELAY;
                    211: #endif
                    212:                return(1);
                    213:        }
                    214:        return(0);
                    215: }
                    216: #endif
                    217: 
                    218: int try_ansi_init(int mode)
                    219: {
                    220:        if(ansi_initciolib(mode)) {
                    221:                cio_api.mode=CIOLIB_MODE_ANSI;
                    222:                cio_api.mouse=0;
                    223:                cio_api.puttext=ansi_puttext;
                    224:                cio_api.gettext=ansi_gettext;
                    225:                cio_api.textattr=ansi_textattr;
                    226:                cio_api.kbhit=ansi_kbhit;
                    227:                cio_api.delay=ansi_delay;
                    228:                cio_api.wherey=ansi_wherey;
                    229:                cio_api.wherex=ansi_wherex;
                    230:                cio_api.putch=ansi_putch;
                    231:                cio_api.gotoxy=ansi_gotoxy;
                    232:                cio_api.gettextinfo=ansi_gettextinfo;
                    233:                cio_api.setcursortype=ansi_setcursortype;
                    234:                cio_api.getch=ansi_getch;
                    235:                cio_api.getche=ansi_getche;
                    236:                cio_api.textmode=ansi_textmode;
                    237:                cio_api.ESCDELAY=&CIOLIB_ANSI_TIMEOUT;
                    238:                return(1);
                    239:        }
                    240:        return(0);
                    241: }
                    242: 
                    243: #ifdef _WIN32
                    244: #if defined(__BORLANDC__)
                    245:         #pragma argsused
                    246: #endif
                    247: int try_conio_init(int mode)
                    248: {
                    249:        /* This should test for something or other */
                    250:        if(win32_initciolib(mode)) {
                    251:                cio_api.mode=CIOLIB_MODE_CONIO;
                    252:                cio_api.mouse=1;
                    253:                cio_api.puttext=win32_puttext;
                    254:                cio_api.gettext=win32_gettext;
                    255:                cio_api.textattr=win32_textattr;
                    256:                cio_api.kbhit=win32_kbhit;
                    257:                cio_api.delay=win32_delay;
                    258:                cio_api.wherey=win32_wherey;
                    259:                cio_api.wherex=win32_wherex;
                    260:                cio_api.putch=win32_putch;
                    261:                cio_api.gotoxy=win32_gotoxy;
                    262:                cio_api.gettextinfo=win32_gettextinfo;
                    263:                cio_api.setcursortype=win32_setcursortype;
                    264:                cio_api.getch=win32_getch;
                    265:                cio_api.getche=win32_getche;
                    266:                cio_api.textmode=win32_textmode;
                    267:                cio_api.showmouse=win32_showmouse;
                    268:                cio_api.hidemouse=win32_hidemouse;
                    269:                cio_api.setname=win32_settitle;
                    270:                cio_api.settitle=win32_settitle;
                    271:                cio_api.copytext=win32_copytext;
                    272:                cio_api.getcliptext=win32_getcliptext;
                    273:                cio_api.suspend=win32_suspend;
                    274:                cio_api.resume=win32_resume;
                    275:                return(1);
                    276:        }
                    277:        return(0);
                    278: }
                    279: #endif
                    280: 
                    281: CIOLIBEXPORT void CIOLIBCALL suspendciolib(void)
                    282: {
                    283:        ciolib_clrscr();
                    284:        if(cio_api.suspend != NULL)
                    285:                cio_api.suspend();
                    286:        initialized=-1;
                    287: }
                    288: 
                    289: CIOLIBEXPORT int CIOLIBCALL initciolib(int mode)
                    290: {
                    291:        switch(initialized) {
                    292:                case 1:
                    293:                        return(0);
                    294:                case -1:
                    295:                        initialized=1;
                    296:                        if(cio_api.resume != NULL)
                    297:                                cio_api.resume();
                    298:                        ciolib_clrscr();
                    299:                        return(0);
                    300:        }
                    301: 
                    302:        memset(&cio_api,0,sizeof(cio_api));
                    303: 
                    304:        switch(mode) {
                    305:                case CIOLIB_MODE_AUTO:
                    306: #ifdef WITH_SDL
                    307:                        if(!try_sdl_init(mode))
                    308: #endif
                    309: #ifdef _WIN32
                    310:                                if(!try_conio_init(mode))
                    311: #else
                    312: #ifndef NO_X
                    313:                                if(!try_x_init(mode))
                    314: #endif
                    315:                                        if(!try_curses_init(mode))
                    316: #endif
                    317:                                                try_ansi_init(mode);
                    318:                        break;
                    319: #ifdef _WIN32
                    320:                case CIOLIB_MODE_CONIO:
                    321:                        try_conio_init(mode);
                    322:                        break;
                    323: #else
                    324:                case CIOLIB_MODE_CURSES:
                    325:                case CIOLIB_MODE_CURSES_IBM:
                    326:                        try_curses_init(mode);
                    327:                        break;
                    328: 
                    329:                case CIOLIB_MODE_X:
                    330: #ifndef NO_X
                    331:                        try_x_init(mode);
                    332: #endif
                    333:                        break;
                    334: #endif
                    335:                case CIOLIB_MODE_ANSI:
                    336:                        try_ansi_init(mode);
                    337:                        break;
                    338: 
                    339: #ifdef WITH_SDL
                    340:                case CIOLIB_MODE_SDL:
                    341:                case CIOLIB_MODE_SDL_FULLSCREEN:
                    342:                        try_sdl_init(mode);
                    343:                        break;
                    344: #endif
                    345:        }
                    346:        if(cio_api.mode==CIOLIB_MODE_AUTO) {
                    347:                fprintf(stderr,"CIOLIB initialization failed!\n");
                    348:                return(-1);
                    349:        }
                    350: 
                    351:        initialized=1;
                    352:        ciolib_gettextinfo(&cio_textinfo);
                    353:        cio_textinfo.winleft=1;
                    354:        cio_textinfo.wintop=1;
                    355:        cio_textinfo.winright=cio_textinfo.screenwidth;
                    356:        cio_textinfo.winbottom=cio_textinfo.screenheight;
                    357:        cio_textinfo.normattr=7;
                    358:        _beginthread(ciolib_mouse_thread,0,NULL);
                    359:        return(0);
                    360: }
                    361: 
                    362: CIOLIBEXPORT int CIOLIBCALL ciolib_kbhit(void)
                    363: {
                    364:        CIOLIB_INIT();
                    365:        if(ungotch)
                    366:                return(1);
                    367:        return(cio_api.kbhit());
                    368: }
                    369: 
                    370: CIOLIBEXPORT int CIOLIBCALL ciolib_getch(void)
                    371: {
                    372:        int ch;
                    373: 
                    374:        CIOLIB_INIT();
                    375: 
                    376:        if(ungotch) {
                    377:                ch=ungotch;
                    378:                ungotch=0;
                    379:                return(ch);
                    380:        }
                    381:        return(cio_api.getch());
                    382: }
                    383: 
                    384: CIOLIBEXPORT int CIOLIBCALL ciolib_getche(void)
                    385: {
                    386:        int ch;
                    387: 
                    388:        CIOLIB_INIT();
                    389: 
                    390:        if(ungotch) {
                    391:                ch=ungotch;
                    392:                ungotch=0;
                    393:                ciolib_putch(ch);
                    394:                return(ch);
                    395:        }
                    396:        return(cio_api.getche());
                    397: }
                    398: 
                    399: CIOLIBEXPORT int CIOLIBCALL ciolib_ungetch(int ch)
                    400: {
                    401:        CIOLIB_INIT();
                    402:        
                    403:        if(ungotch)
                    404:                return(EOF);
                    405:        ungotch=ch;
                    406:        return(ch);
                    407: }
                    408: 
                    409: CIOLIBEXPORT int CIOLIBCALL ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy)
                    410: {
                    411:        int width;
                    412:        int height;
                    413:        unsigned char *buf;
                    414: 
                    415:        CIOLIB_INIT();
                    416: 
                    417:        if(cio_api.movetext != NULL)
                    418:                return(cio_api.movetext(sx, sy, ex, ey, dx, dy));
                    419: 
                    420:        width=ex-sx;
                    421:        height=ey-sy;
                    422:        buf=(unsigned char *)alloca((width+1)*(height+1)*2);
                    423:        if(buf==NULL)
                    424:                return(0);
                    425:        if(!ciolib_gettext(sx,sy,ex,ey,buf))
                    426:                return(0);
                    427:        if(!ciolib_puttext(dx,dy,dx+width,dy+height,buf))
                    428:                return(0);
                    429:        return(1);
                    430: }
                    431: 
                    432: CIOLIBEXPORT char * CIOLIBCALL ciolib_cgets(char *str)
                    433: {
                    434:        int     maxlen;
                    435:        int len=0;
                    436:        int ch;
                    437: 
                    438:        CIOLIB_INIT();
                    439:        
                    440:        maxlen=*(unsigned char *)str;
                    441:        while((ch=ciolib_getch())!='\n' && ch !='\r') {
                    442:                switch(ch) {
                    443:                        case 0: /* Skip extended keys */
                    444:                                ciolib_getche();
                    445:                                break;
                    446:                        case '\r':      /* Skip \r (ToDo: Should this be treated as a \n? */
                    447:                                break;
                    448:                        case '\b':
                    449:                                if(len==0) {
                    450:                                        ciolib_putch(7);
                    451:                                        break;
                    452:                                }
                    453:                                ciolib_putch('\b');
                    454:                                len--;
                    455:                                break;
                    456:                        default:
                    457:                                ciolib_putch(ch);
                    458:                                str[(len++)+2]=ch;
                    459:                                if(len==maxlen) {
                    460:                                        str[len+2]=0;
                    461:                                        *((unsigned char *)(str+1))=(unsigned char)len;
                    462:                                        ciolib_putch('\r');
                    463:                                        ciolib_putch('\n');
                    464:                                        return(&str[2]);
                    465:                                }
                    466:                                break;
                    467:                }
                    468:        }
                    469:        str[len+2]=0;
                    470:        *((unsigned char *)(str+1))=(unsigned char)len;
                    471:        ciolib_putch('\r');
                    472:        ciolib_putch('\n');
                    473:        return(&str[2]);
                    474: }
                    475: 
                    476: #ifdef _MSC_VER        /* Use lame vsscanf() implementation */
                    477: /* This is a way to do _vsscanf without using fancy stack tricks or using the
                    478:  * "_input" method provided by Microsoft, which is no longer exported as of .NET.
                    479:  * The function has a limit of 25 arguments (or less if you run out of stack space),
                    480:  *  but how many arguments do you need?
                    481:  */
                    482: /* From "krabsheva" - http://www.codeguru.com/Cpp/Cpp/string/comments.php/c5631/?thread=1051 */
                    483: int vsscanf( const char *buffer, const char *format, va_list arg_ptr )
                    484: {
                    485:        int i, ret;
                    486:        void *arg_arr[25];
                    487: 
                    488:        /* Do exception handling in case we go too far // */
                    489:        __try
                    490:        {
                    491:                for ( i = 0; i < 25; i++ )
                    492:                        arg_arr[i] = va_arg( arg_ptr, void * );
                    493:        }
                    494:        __except( EXCEPTION_EXECUTE_HANDLER )
                    495:        {
                    496:        }
                    497: 
                    498:        /* This is lame, but the extra arguments won't be used by sscanf */
                    499:        ret = sscanf( buffer, format, arg_arr[0], arg_arr[1], arg_arr[2], arg_arr[3],
                    500:                arg_arr[4], arg_arr[5], arg_arr[6], arg_arr[7], arg_arr[8], arg_arr[9],
                    501:                arg_arr[10], arg_arr[11], arg_arr[12], arg_arr[13], arg_arr[14],
                    502:                arg_arr[15], arg_arr[16], arg_arr[17], arg_arr[18], arg_arr[19],
                    503:                arg_arr[20], arg_arr[21], arg_arr[22], arg_arr[23], arg_arr[24] );
                    504: 
                    505:        return ret;
                    506: }
                    507: #endif
                    508: 
                    509: CIOLIBEXPORT int CIOLIBCALL ciolib_cscanf (char *format , ...)
                    510: {
                    511:        char str[255];
                    512:     va_list argptr;
                    513:        int ret;
                    514: 
                    515:        CIOLIB_INIT();
                    516:        
                    517:        str[0]=-1;
                    518:        va_start(argptr,format);
                    519:        ret=vsscanf(ciolib_cgets(str),format,argptr);
                    520:        va_end(argptr);
                    521:        return(ret);
                    522: }
                    523: 
                    524: CIOLIBEXPORT char * CIOLIBCALL ciolib_getpass(const char *prompt)
                    525: {
                    526:        static char pass[9];
                    527:        int len=0;
                    528:        int ch;
                    529: 
                    530:        CIOLIB_INIT();
                    531:        
                    532:        ciolib_cputs((char *)prompt);
                    533:        while((ch=ciolib_getch())!='\n') {
                    534:                switch(ch) {
                    535:                        case 0: /* Skip extended keys */
                    536:                                ciolib_getch();
                    537:                                break;
                    538:                        case '\r':      /* Skip \r (ToDo: Should this be treeated as a \n? */
                    539:                                break;
                    540:                        case '\b':
                    541:                                if(len==0) {
                    542:                                        ciolib_putch(7);
                    543:                                        break;
                    544:                                }
                    545:                                len--;
                    546:                                break;
                    547:                        default:
                    548:                                if(len==8)
                    549:                                        ciolib_putch(7);
                    550:                                else
                    551:                                        pass[len++]=ch;
                    552:                                break;
                    553:                }
                    554:        }
                    555:        pass[len]=0;
                    556:        return(pass);
                    557: }
                    558: 
                    559: CIOLIBEXPORT void CIOLIBCALL ciolib_gettextinfo(struct text_info *info)
                    560: {
                    561:        if(!initialized)
                    562:                initciolib(CIOLIB_MODE_AUTO);
                    563:        else {
                    564:                cio_api.gettextinfo(&cio_textinfo);
                    565:        }
                    566:        if(info!=&cio_textinfo) {
                    567:                info->winleft=cio_textinfo.winleft;        /* left window coordinate */
                    568:                info->wintop=cio_textinfo.wintop;         /* top window coordinate */
                    569:                info->winright=cio_textinfo.winright;       /* right window coordinate */
                    570:                info->winbottom=cio_textinfo.winbottom;      /* bottom window coordinate */
                    571:                info->attribute=cio_textinfo.attribute;      /* text attribute */
                    572:                info->normattr=cio_textinfo.normattr;       /* normal attribute */
                    573:                info->currmode=cio_textinfo.currmode;       /* current video mode:
                    574:                                                         BW40, BW80, C40, C80, or C4350 */
                    575:                info->screenheight=cio_textinfo.screenheight;   /* text screen's height */
                    576:                info->screenwidth=cio_textinfo.screenwidth;    /* text screen's width */
                    577:                info->curx=cio_textinfo.curx-cio_textinfo.winleft+1;           /* x-coordinate in current window */
                    578:                info->cury=cio_textinfo.cury-cio_textinfo.wintop+1;           /* y-coordinate in current window */
                    579:        }
                    580: }
                    581: 
                    582: CIOLIBEXPORT void CIOLIBCALL ciolib_wscroll(void)
                    583: {
                    584:        int os;
                    585:        struct text_info ti;
                    586: 
                    587:        CIOLIB_INIT();
                    588: 
                    589:        if(cio_api.wscroll!=NULL) {
                    590:                cio_api.wscroll();
                    591:                return;
                    592:        }
                    593:        ciolib_gettextinfo(&ti);
                    594:        if(!_wscroll)
                    595:                return;
                    596:        ciolib_movetext(ti.winleft,ti.wintop+1,ti.winright,ti.winbottom,ti.winleft,ti.wintop);
                    597:        ciolib_gotoxy(1,ti.winbottom-ti.wintop+1);
                    598:        os=_wscroll;
                    599:        _wscroll=0;
                    600:        /* ciolib_cprintf("%*s",ti.winright-ti.winleft+1,""); */
                    601:        ciolib_clreol();
                    602:        _wscroll=os;
                    603:        ciolib_gotoxy(ti.curx,ti.cury);
                    604: }
                    605: 
                    606: CIOLIBEXPORT int CIOLIBCALL ciolib_wherex(void)
                    607: {
                    608:        int x;
                    609: 
                    610:        CIOLIB_INIT();
                    611:        
                    612:        x=cio_api.wherex();
                    613:        x=x-cio_textinfo.winleft+1;
                    614:        return(x);
                    615: }
                    616: 
                    617: CIOLIBEXPORT int CIOLIBCALL ciolib_wherey(void)
                    618: {
                    619:        int y;
                    620: 
                    621:        CIOLIB_INIT();
                    622:        
                    623:        y=cio_api.wherey();
                    624:        y=y-cio_textinfo.wintop+1;
                    625:        return(y);
                    626: }
                    627: 
                    628: CIOLIBEXPORT void CIOLIBCALL ciolib_gotoxy(int x, int y)
                    629: {
                    630:        int nx;
                    631:        int ny;
                    632:        struct text_info ti;
                    633: 
                    634:        CIOLIB_INIT();
                    635:        
                    636:        ciolib_gettextinfo(&ti);
                    637:        if(             x < 1
                    638:                        || x > ti.winright-ti.winleft+1
                    639:                        || y < 1
                    640:                        || y > ti.winbottom-ti.wintop+1)
                    641:                return;
                    642:        nx=x+ti.winleft-1;
                    643:        ny=y+ti.wintop-1;
                    644:        cio_api.gotoxy(nx,ny);
                    645: }
                    646: 
                    647: CIOLIBEXPORT void CIOLIBCALL ciolib_textmode(int mode)
                    648: {
                    649:        CIOLIB_INIT();
                    650:        
                    651:        if(mode==-1) {
                    652:                ciolib_gettextinfo(&cio_textinfo);
                    653:                cio_api.textmode(lastmode);
                    654:                lastmode=cio_textinfo.currmode;
                    655:        }
                    656:        else {
                    657:                ciolib_gettextinfo(&cio_textinfo);
                    658:                lastmode=cio_textinfo.currmode;
                    659:                cio_api.textmode(mode);
                    660:        }
                    661:        ciolib_gettextinfo(&cio_textinfo);
                    662:        cio_textinfo.winleft=1;
                    663:        cio_textinfo.wintop=1;
                    664:        cio_textinfo.winright=cio_textinfo.screenwidth;
                    665:        cio_textinfo.winbottom=cio_textinfo.screenheight;
                    666: }
                    667: 
                    668: CIOLIBEXPORT void CIOLIBCALL ciolib_window(int sx, int sy, int ex, int ey)
                    669: {
                    670:        CIOLIB_INIT();
                    671:        
                    672:        ciolib_gettextinfo(&cio_textinfo);
                    673:        if(                sx < 1
                    674:                        || sy < 1
                    675:                        || ex < 1
                    676:                        || ey < 1
                    677:                        || sx > cio_textinfo.screenwidth
                    678:                        || sy > cio_textinfo.screenheight
                    679:                        || sx > ex
                    680:                        || sy > ey
                    681:                        || ex > cio_textinfo.screenwidth
                    682:                        || ey > cio_textinfo.screenheight)
                    683:                return;
                    684:        cio_textinfo.winleft=sx;
                    685:        cio_textinfo.wintop=sy;
                    686:        cio_textinfo.winright=ex;
                    687:        cio_textinfo.winbottom=ey;
                    688:        ciolib_gotoxy(1,1);
                    689: }
                    690: 
                    691: CIOLIBEXPORT void CIOLIBCALL ciolib_clreol(void)
                    692: {
                    693:        unsigned char *buf;
                    694:        int i;
                    695:        int width,height;
                    696:        struct text_info ti;
                    697: 
                    698:        CIOLIB_INIT();
                    699:        
                    700:        ciolib_gettextinfo(&ti);
                    701: 
                    702:        width=ti.winright-ti.winleft+1-ti.curx+1;
                    703:        height=1;
                    704:        buf=(unsigned char *)alloca(width*height*2);
                    705:        for(i=0;i<width*height*2;) {
                    706:                buf[i++]=' ';
                    707:                buf[i++]=ti.attribute;
                    708:        }
                    709:        ciolib_puttext(ti.curx+ti.winleft-1,ti.cury+ti.wintop-1,ti.winright,ti.cury+ti.wintop-1,buf);
                    710: }
                    711: 
                    712: CIOLIBEXPORT void CIOLIBCALL ciolib_clrscr(void)
                    713: {
                    714:        unsigned char *buf;
                    715:        int i;
                    716:        int width,height;
                    717:        struct text_info ti;
                    718: 
                    719:        CIOLIB_INIT();
                    720:        
                    721:        ciolib_gettextinfo(&ti);
                    722: 
                    723:        width=ti.winright-ti.winleft+1;
                    724:        height=ti.winbottom-ti.wintop+1;
                    725:        buf=(unsigned char *)alloca(width*height*2);
                    726:        for(i=0;i<width*height*2;) {
                    727:                buf[i++]=' ';
                    728:                buf[i++]=ti.attribute;
                    729:        }
                    730:        ciolib_puttext(ti.winleft,ti.wintop,ti.winright,ti.winbottom,buf);
                    731:        ciolib_gotoxy(1,1);
                    732: }
                    733: 
                    734: CIOLIBEXPORT void CIOLIBCALL ciolib_delline(void)
                    735: {
                    736:        struct text_info ti;
                    737: 
                    738:        CIOLIB_INIT();
                    739:        
                    740:        ciolib_gettextinfo(&ti);
                    741: 
                    742:        ciolib_movetext(ti.winleft,ti.cury+1,ti.winright,ti.winbottom,ti.winleft,ti.cury);
                    743:        ciolib_gotoxy(1,ti.winbottom-ti.wintop+1);
                    744:        ciolib_clreol();
                    745:        ciolib_gotoxy(ti.curx,ti.cury);
                    746: }
                    747: 
                    748: CIOLIBEXPORT void CIOLIBCALL ciolib_insline(void)
                    749: {
                    750:        struct text_info ti;
                    751: 
                    752:        CIOLIB_INIT();
                    753:        
                    754:        ciolib_gettextinfo(&ti);
                    755: 
                    756:        ciolib_movetext(ti.winleft,ti.cury,ti.winright,ti.winbottom,ti.winleft,ti.cury+1);
                    757:        ciolib_gotoxy(1,ti.cury);
                    758:        ciolib_clreol();
                    759:        ciolib_gotoxy(ti.curx,ti.cury);
                    760: }
                    761: 
                    762: CIOLIBEXPORT int CIOLIBCALL ciolib_cprintf(char *fmat, ...)
                    763: {
                    764:     va_list argptr;
                    765:        int             ret;
                    766: #ifdef _MSC_VER                /* Can't figure out a way to allocate a "big enough" buffer for Win32. */
                    767:        char    str[16384];
                    768: #else
                    769:        char    *str;
                    770: #endif
                    771: 
                    772:        CIOLIB_INIT();
                    773: 
                    774:     va_start(argptr,fmat);
                    775: #ifdef _MSC_VER
                    776:        ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr);
                    777: #else
                    778:     ret=vsnprintf(NULL,0,fmat,argptr);
                    779:        if(ret<0)
                    780:                return(EOF);
                    781:        str=(char *)alloca(ret+1);
                    782:        if(str==NULL)
                    783:                return(EOF);
                    784:        ret=vsprintf(str,fmat,argptr);
                    785: #endif
                    786:     va_end(argptr);
                    787:        if(ret>=0)
                    788:                ciolib_cputs(str);
                    789:        else
                    790:                ret=EOF;
                    791:     return(ret);
                    792: }
                    793: 
                    794: CIOLIBEXPORT int CIOLIBCALL ciolib_cputs(char *str)
                    795: {
                    796:        int             pos;
                    797:        int             ret=0;
                    798:        int             olddmc;
                    799: 
                    800:        CIOLIB_INIT();
                    801: 
                    802:        olddmc=hold_update;
                    803:        hold_update=1;
                    804:        for(pos=0;str[pos];pos++)
                    805:        {
                    806:                ret=str[pos];
                    807:                if(str[pos]=='\n')
                    808:                        ciolib_putch('\r');
                    809:                ciolib_putch(str[pos]);
                    810:        }
                    811:        hold_update=olddmc;
                    812:        ciolib_gotoxy(ciolib_wherex(),ciolib_wherey());
                    813:        return(ret);
                    814: }
                    815: 
                    816: CIOLIBEXPORT void CIOLIBCALL ciolib_textbackground(int colour)
                    817: {
                    818:        unsigned char attr;
                    819:        unsigned char col;
                    820: 
                    821:        CIOLIB_INIT();
                    822:        
                    823:        ciolib_gettextinfo(&cio_textinfo);
                    824:        attr=cio_textinfo.attribute;
                    825:        attr&=143;
                    826:        col=(colour & 0x07);
                    827:        attr|=(col<<4);
                    828:        ciolib_textattr(attr);
                    829: }
                    830: 
                    831: CIOLIBEXPORT void CIOLIBCALL ciolib_textcolor(int colour)
                    832: {
                    833:        unsigned char attr;
                    834:        unsigned char col;
                    835: 
                    836:        CIOLIB_INIT();
                    837:        
                    838:        ciolib_gettextinfo(&cio_textinfo);
                    839:        attr=cio_textinfo.attribute;
                    840:        attr&=240;
                    841:        col=colour&0x0f;
                    842:        attr|=col;
                    843:        ciolib_textattr(attr);
                    844: }
                    845: 
                    846: CIOLIBEXPORT void CIOLIBCALL ciolib_highvideo(void)
                    847: {
                    848:        int attr;
                    849: 
                    850:        CIOLIB_INIT();
                    851:        
                    852:        ciolib_gettextinfo(&cio_textinfo);
                    853:        attr=cio_textinfo.attribute;
                    854:        attr |= 8;
                    855:        ciolib_textattr(attr);
                    856: }
                    857: 
                    858: CIOLIBEXPORT void CIOLIBCALL ciolib_lowvideo(void)
                    859: {
                    860:        int attr;
                    861: 
                    862:        CIOLIB_INIT();
                    863:        
                    864:        ciolib_gettextinfo(&cio_textinfo);
                    865:        attr=cio_textinfo.attribute;
                    866:        attr &= 0xf7;
                    867:        ciolib_textattr(attr);
                    868: }
                    869: 
                    870: CIOLIBEXPORT void CIOLIBCALL ciolib_normvideo(void)
                    871: {
                    872:        CIOLIB_INIT();
                    873:        
                    874:        ciolib_textattr(0x07);
                    875: }
                    876: 
                    877: CIOLIBEXPORT int CIOLIBCALL ciolib_puttext(int a,int b,int c,int d,unsigned char *e)
                    878: {
                    879:        CIOLIB_INIT();
                    880:        
                    881:        return(cio_api.puttext(a,b,c,d,e));
                    882: }
                    883: 
                    884: CIOLIBEXPORT int CIOLIBCALL ciolib_gettext(int a,int b,int c,int d,unsigned char *e)
                    885: {
                    886:        CIOLIB_INIT();
                    887:        
                    888:        return(cio_api.gettext(a,b,c,d,e));
                    889: }
                    890: 
                    891: CIOLIBEXPORT void CIOLIBCALL ciolib_textattr(int a)
                    892: {
                    893:        CIOLIB_INIT();
                    894:        
                    895:        cio_api.textattr(a);
                    896: }
                    897: 
                    898: CIOLIBEXPORT void CIOLIBCALL ciolib_delay(long a)
                    899: {
                    900:        CIOLIB_INIT();
                    901:        
                    902:        cio_api.delay(a);
                    903: }
                    904: 
                    905: CIOLIBEXPORT int CIOLIBCALL ciolib_putch(int a)
                    906: {
                    907:        unsigned char a1=a;
                    908:        CIOLIB_INIT();
                    909: 
                    910:        if(a1=='\n')
                    911:                return(cio_api.putch(a1));
                    912:        return(cio_api.putch(a1));
                    913: }
                    914: 
                    915: CIOLIBEXPORT void CIOLIBCALL ciolib_setcursortype(int a)
                    916: {
                    917:        CIOLIB_INIT();
                    918:        
                    919:        cio_api.setcursortype(a);
                    920: }
                    921: 
                    922: CIOLIBEXPORT int CIOLIBCALL ciolib_showmouse(void) {
                    923:        CIOLIB_INIT();
                    924: 
                    925:        if(cio_api.showmouse!=NULL)
                    926:                return(cio_api.showmouse());
                    927:        return(-1);
                    928: }
                    929: 
                    930: CIOLIBEXPORT int CIOLIBCALL ciolib_hidemouse(void) {
                    931:        CIOLIB_INIT();
                    932: 
                    933:        if(cio_api.hidemouse!=NULL)
                    934:                return(cio_api.hidemouse());
                    935:        return(-1);
                    936: }
                    937: 
                    938: CIOLIBEXPORT void CIOLIBCALL ciolib_setname(const char *name) {
                    939:        CIOLIB_INIT();
                    940: 
                    941:        if(cio_api.setname!=NULL)
                    942:                cio_api.setname(name);
                    943: }
                    944: 
                    945: CIOLIBEXPORT void CIOLIBCALL ciolib_settitle(const char *title) {
                    946:        CIOLIB_INIT();
                    947: 
                    948:        if(cio_api.settitle!=NULL)
                    949:                cio_api.settitle(title);
                    950: }
                    951: 
                    952: CIOLIBEXPORT void CIOLIBCALL ciolib_copytext(const char *text, size_t buflen)
                    953: {
                    954:        CIOLIB_INIT();
                    955: 
                    956:        if(cio_api.copytext!=NULL)
                    957:                cio_api.copytext(text,buflen);
                    958: }
                    959: 
                    960: CIOLIBEXPORT char * CIOLIBCALL ciolib_getcliptext(void)
                    961: {
                    962:        CIOLIB_INIT();
                    963: 
                    964:        if(cio_api.getcliptext!=NULL)
                    965:                return(cio_api.getcliptext());
                    966:        else
                    967:                return(NULL);
                    968: }
                    969: 
                    970: CIOLIBEXPORT int CIOLIBCALL ciolib_setfont(int font, int force)
                    971: {
                    972:        CIOLIB_INIT();
                    973: 
                    974:        if(cio_api.setfont!=NULL)
                    975:                return(cio_api.setfont(font,force));
                    976:        else
                    977:                return(-1);
                    978: }
                    979: 
                    980: CIOLIBEXPORT int CIOLIBCALL ciolib_getfont(void)
                    981: {
                    982:        CIOLIB_INIT();
                    983: 
                    984:        if(cio_api.getfont!=NULL)
                    985:                return(cio_api.getfont());
                    986:        else
                    987:                return(-1);
                    988: }
                    989: 
                    990: CIOLIBEXPORT int CIOLIBCALL ciolib_loadfont(char *filename)
                    991: {
                    992:        CIOLIB_INIT();
                    993: 
                    994:        if(cio_api.loadfont!=NULL)
                    995:                return(cio_api.loadfont(filename));
                    996:        else
                    997:                return(-1);
                    998: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.