Annotation of pmsdk/samples/browse/viobrows.c, revision 1.1

1.1     ! root        1: /* ------------------------------------ */
        !             2: /*     VIO File Browser Demo           */
        !             3: /*     Version 5                       */
        !             4: /*     Created   1988 Microsoft Corp.  */
        !             5: /* ------------------------------------ */
        !             6: 
        !             7: /* ------------------------------------ */
        !             8: /* library includes                    */
        !             9: /* ------------------------------------ */
        !            10: #define INCL_BASE
        !            11: #include <stdlib.h>
        !            12: #include <stdio.h>
        !            13: #include <os2.h>
        !            14: #include <string.h>
        !            15: #include "viobrows.h"
        !            16: 
        !            17: /* ------------------------------------ */
        !            18: /* global variables                    */
        !            19: /* ------------------------------------ */
        !            20: FILE *pFile_In;
        !            21: char *apchDataLines[ NUM_DATA_LINES ];
        !            22: SHORT HighestLine= -1;
        !            23: USHORT Vid_Cols, Vid_Rows;
        !            24: SHORT HorScrollPos=0;
        !            25: 
        !            26: /* ================================================================ */
        !            27: /*         Functions                                               */
        !            28: /* ================================================================ */
        !            29: 
        !            30: void cdecl main( argc, argv )
        !            31: int argc;
        !            32: char *argv[];
        !            33: {
        !            34:     if (Initialize(argc,argv))
        !            35:        exit(-1);
        !            36:     ManipulateFile();
        !            37:     exit(0);
        !            38: }
        !            39: 
        !            40: /* ================================================================ */
        !            41: 
        !            42: SHORT Initialize(argc,argv)
        !            43: int argc;
        !            44: char *argv[];
        !            45: 
        !            46: /* tries to open input file and initialize global variables */
        !            47: /* plus any other misc. functions                          */
        !            48: {
        !            49:     char *achInFile;
        !            50:     VIOMODEINFO viomiMode;
        !            51: 
        !            52:     /* -------------------------- */
        !            53:     /* get input file ready      */
        !            54:     /* -------------------------- */
        !            55:     if (argc==1)
        !            56:        pFile_In=stdin;
        !            57:     else {
        !            58:        achInFile=argv[1];
        !            59:        if ((pFile_In=fopen(achInFile,"r"))==NULL) {
        !            60:            fprintf(stderr,"Error--could not open %s",achInFile);
        !            61:            return(-1);
        !            62:        }
        !            63:     }
        !            64: 
        !            65:     /* -------------------------- */
        !            66:     /* read input file           */
        !            67:     /* -------------------------- */
        !            68:     if (ReadFile())
        !            69:        return(-1);
        !            70: 
        !            71: 
        !            72:     /* -------------------------- */
        !            73:     /* get video parameters      */
        !            74:     /* -------------------------- */
        !            75:     viomiMode.cb = sizeof(viomiMode);
        !            76:     VioGetMode(&viomiMode, 0);
        !            77:     Vid_Cols=viomiMode.col;
        !            78:     Vid_Rows=viomiMode.row;
        !            79: 
        !            80:     DisplayScreen(0, TRUE);
        !            81: }
        !            82: 
        !            83: /* ================================================================ */
        !            84: 
        !            85: SHORT ReadFile( void )
        !            86: 
        !            87: /* reads data lines from the file to memory.       */
        !            88: /* if an error occurs, it will abort the program    */
        !            89: /* stores the lines as null-terminated ascii, with  */
        !            90: /* no /n's in the strings.                          */
        !            91: {   char achLine[256];
        !            92: 
        !            93:     while (fgets(achLine,128,pFile_In)) {
        !            94: 
        !            95:        /* strip LF character from end of string before storing */
        !            96:        /* by converting LF to /0                               */
        !            97:        if (achLine[strlen(achLine)-1]=='\n')
        !            98:            achLine[strlen(achLine)-1]=0;
        !            99:        else {
        !           100:            fprintf(stderr,"Internal error in ReadFile.\n");
        !           101:            return(-1);
        !           102:        }
        !           103:        if (StoreLine(achLine)) {
        !           104:            fprintf(stderr,"Error while storing line in ReadFile.\n");
        !           105:            return(-1);
        !           106:        }
        !           107:     }
        !           108: 
        !           109:     fclose(pFile_In);
        !           110:     return(0);
        !           111: }
        !           112: 
        !           113: /* ================================================================ */
        !           114: 
        !           115: void ManipulateFile( void )
        !           116: 
        !           117: /* this takes lines from memory and displays to user's pleasure */
        !           118: /* other functions such as DisplayLineNumber and SwitchFile    */
        !           119: /* should be added here                                        */
        !           120: {
        !           121:     USHORT CurLine=0;
        !           122: 
        !           123:     UserLoop();
        !           124:     /* set cursor at a nice place before exiting */
        !           125:     VioSetCurPos(Vid_Rows-1,0,0);
        !           126: }
        !           127: 
        !           128: /* ================================================================ */
        !           129: /*     Line-handling subsystem                                     */
        !           130: /* ================================================================ */
        !           131: 
        !           132: SHORT StoreLine( pchLine )
        !           133: char *pchLine;
        !           134: 
        !           135: /* store a line in memory at end of list.                      */
        !           136: /* creates the line number automatically                       */
        !           137: /* extensions to allow >64K data go here and in RetrieveLine   */
        !           138: {
        !           139:     /* don't forget to malloc space for \0 */
        !           140:     if (HighestLine==NUM_DATA_LINES ||
        !           141:       (apchDataLines[++HighestLine]=malloc(strlen(pchLine)+1))==NULL )
        !           142:        return(-1);
        !           143:     /* copy (to, from) */
        !           144:     strcpy(apchDataLines[HighestLine],pchLine);
        !           145:     return(0);
        !           146: }
        !           147: 
        !           148: /* ================================================================ */
        !           149: 
        !           150: SHORT RetrieveLine( ppchLine , LineNum )
        !           151: char **ppchLine;
        !           152: USHORT LineNum;
        !           153: 
        !           154: /* take line number and convert it to a string of data from memory  */
        !           155: /* extensions to allow >64K data also incorporated here            */
        !           156: {
        !           157:     if (LineNum > HighestLine)
        !           158:        return(-1);
        !           159:     *ppchLine=apchDataLines[LineNum];
        !           160:     return(0);
        !           161: }
        !           162: 
        !           163: /* ================================================================ */
        !           164: /*             Video-handling subsystem                            */
        !           165: /* ================================================================ */
        !           166: 
        !           167: void ClearScreen( void )
        !           168: 
        !           169: /* self-explanitory I hope         */
        !           170: /* uses technique from qh examples  */
        !           171: /* clearing=scrolldown(maxlines)    */
        !           172: {
        !           173:     BYTE bBlank[2];
        !           174:     bBlank[0] = 0x20;                      /* space character       */
        !           175:     bBlank[1] = 0x07;                      /* white attribute (EGA) */
        !           176:     VioScrollDn(0,                         /* top row               */
        !           177:         0,                                 /* left column           */
        !           178:         -1,                                /* bottom row            */
        !           179:         -1,                                /* right column          */
        !           180:         -1,                                /* number of lines       */
        !           181:         bBlank,                            /* cell to write         */
        !           182:        WINDOW);                           /* video handle          */
        !           183: }
        !           184: 
        !           185: /* ================================================================ */
        !           186: 
        !           187: void DisplayScreen( USHORT TopLine, BOOL force)
        !           188: 
        !           189: /* display lines from memory to video, starting at line number TopLine */
        !           190: /* has 'smarts' to scroll+paint remainder.                             */
        !           191: {
        !           192:     SHORT LineDiff;
        !           193:     static USHORT OldTopLine;
        !           194: 
        !           195: /* horizontal shift should go here, but is not implemented yet */
        !           196: 
        !           197:     LineDiff=TopLine-OldTopLine;
        !           198:     if ( (abs(LineDiff) < Vid_Rows ) && !force ) {
        !           199:        /* is legal to apply scroll+paint remainder algorithm */
        !           200:        /* (usually applied when user wants line up/down) */
        !           201:        if (LineDiff<0) {
        !           202:            /* user scrolls back; repaint top part of screen */
        !           203:            ScrollDown( -LineDiff );
        !           204:            VidRefresh(TopLine, -LineDiff, 0);
        !           205:        }
        !           206:        else {
        !           207:            /* user scrolls forward; repaint bottom part */
        !           208:            ScrollUp( LineDiff );
        !           209:            VidRefresh( TopLine+Vid_Rows-LineDiff, LineDiff, Vid_Rows-LineDiff);
        !           210:        }
        !           211:     }
        !           212:     else {
        !           213:        /* repaint entire screen */
        !           214:        ClearScreen();
        !           215:        VidRefresh(TopLine, Vid_Rows, 0);
        !           216:     }
        !           217:     OldTopLine=TopLine;
        !           218: }
        !           219: 
        !           220: /* ================================================================ */
        !           221: 
        !           222: void VidRefresh ( USHORT LineFrom, USHORT NumLines, USHORT VidRowStart)
        !           223: /* Redisplay lines LineFrom to LineTo starting at video VidRowStart */
        !           224: /* Will NOT check that you haven't given it stupid arguments        */
        !           225: {
        !           226:     USHORT LineOffset;
        !           227:     char *pchLine;
        !           228: 
        !           229:     for (LineOffset=0; LineOffset < NumLines ; LineOffset++) {
        !           230:        if (LineOffset + LineFrom > HighestLine)
        !           231:            break;
        !           232:        RetrieveLine(&pchLine, LineOffset + LineFrom);
        !           233:        VioSetCurPos(
        !           234:            VidRowStart+LineOffset,     /* vertical pos   */
        !           235:            0                    ,      /* horizontal pos */
        !           236:            WINDOW                      /* hvio */
        !           237:        );
        !           238:        VioWrtTTY(
        !           239:            pchLine,            /* string to print */
        !           240:            strlen(pchLine),    /* string length */
        !           241:            WINDOW              /* hvio */
        !           242:        );
        !           243:     }
        !           244: }
        !           245: 
        !           246: void ScrollUp(int Nlines)
        !           247: {
        !           248:     BYTE bBlank[2];
        !           249:     bBlank[0] = 0x20;                      /* space character       */
        !           250:     bBlank[1] = 0x07;                      /* white attribute (EGA) */
        !           251:     VioScrollUp(0,                        /* top row               */
        !           252:         0,                                 /* left column           */
        !           253:         -1,                                /* bottom row            */
        !           254:         -1,                                /* right column          */
        !           255:        Nlines,                            /* number of lines       */
        !           256:         bBlank,                            /* cell to write         */
        !           257:        WINDOW);                           /* video handle          */
        !           258: }
        !           259: 
        !           260: void ScrollDown(int Nlines)
        !           261: {
        !           262:     BYTE bBlank[2];
        !           263:     bBlank[0] = 0x20;                      /* space character       */
        !           264:     bBlank[1] = 0x07;                      /* white attribute (EGA) */
        !           265:     VioScrollDn(0,                         /* top row               */
        !           266:         0,                                 /* left column           */
        !           267:         -1,                                /* bottom row            */
        !           268:         -1,                                /* right column          */
        !           269:        Nlines,                            /* number of lines       */
        !           270:         bBlank,                            /* cell to write         */
        !           271:        WINDOW);                           /* video handle          */
        !           272: }
        !           273: 
        !           274: /* ================================================================ */
        !           275: /*     User input subsystem                                        */
        !           276: /* ================================================================ */
        !           277: 
        !           278: VOID UserLoop( VOID )
        !           279: {
        !           280:     CHAR ch;
        !           281: 
        !           282:     while ( (ch=GetKbdInput()) != EXIT )
        !           283:        ExecuteAction(ch);
        !           284: }
        !           285: 
        !           286: VOID ExecuteAction( CHAR ch)
        !           287: /* interact with the user somehow to discover new line number  */
        !           288: /* at top of screen                                            */
        !           289: /* extensions to allow PM windowing go here                    */
        !           290: /* returns 1 if successful                                     */
        !           291: /* returns 0 if unsuccessful (user wants to quit)              */
        !           292: {
        !           293:     static USHORT OldLine ;
        !           294:     BOOL bForce=FALSE;
        !           295: 
        !           296: #define downbound( X, A, B) ( (X) > ((B)-(A)) )? (B) : (X)+(A)
        !           297: #define upbound( X, A, B) ( (X) < ((B)+(A)) )? (B) : (X)-(A)
        !           298: 
        !           299:     switch (ch) {
        !           300:        case LINE_UP:
        !           301:            OldLine=upbound( OldLine, 1, 0);
        !           302:            break;
        !           303:        case LINE_DOWN:
        !           304:            OldLine=downbound( OldLine, 1, MAX_START_LINE);
        !           305:            break;
        !           306:        case PAGE_UP:
        !           307:            OldLine=upbound( OldLine, Vid_Rows, 0);
        !           308:            break;
        !           309:        case PAGE_DOWN:
        !           310:            OldLine=downbound( OldLine, Vid_Rows, MAX_START_LINE);
        !           311:            break;
        !           312:        case GOTO_TOP:
        !           313:            OldLine= 0;
        !           314:            break;
        !           315:        case GOTO_BOTTOM:
        !           316:            OldLine= MAX_START_LINE;
        !           317:            break;
        !           318:        case GOTO_LINE:
        !           319:            /* Not Implemented */
        !           320:            break;
        !           321:        case CHAR_RIGHT:
        !           322:            HorScrollPos= downbound ( HorScrollPos, 1, HIGHEST_HSCROLL);
        !           323:            break;
        !           324:        case CHAR_LEFT:
        !           325:            HorScrollPos = upbound( HorScrollPos, 1, 0);
        !           326:            break;
        !           327:        case PAGE_RIGHT:
        !           328:            HorScrollPos = downbound( HorScrollPos, HSCROLL_PAGESIZE, HIGHEST_HSCROLL);
        !           329:            break;
        !           330:        case PAGE_LEFT:
        !           331:            HorScrollPos = upbound( HorScrollPos, HSCROLL_PAGESIZE, 0);
        !           332:            break;
        !           333:        case GOTO_HSCROLL:
        !           334:            /* Not Implemented */
        !           335:            break;
        !           336:        case NULL:
        !           337:            bForce= TRUE;
        !           338:            break;
        !           339:     }
        !           340:     DisplayScreen( OldLine, bForce );
        !           341: }
        !           342: 
        !           343: /* ================================================================ */
        !           344: 
        !           345: CHAR GetKbdInput( void )
        !           346: 
        !           347: /* get an action code based on keyboard input      */
        !           348: /* action codes are #defined constants.            */
        !           349: {
        !           350:     switch(GetScanCode()) {
        !           351:        case 1:                         /* escape */
        !           352:            return ( EXIT );
        !           353:        case 0x48:                      /* up-arrow */
        !           354:            return( LINE_UP );
        !           355:        case 0x50:                      /* down-arrow */
        !           356:            return( LINE_DOWN );
        !           357:        case 0x4d:                      /* right-arrow */
        !           358:            return( CHAR_RIGHT );
        !           359:        case 0x4b:                      /* left-arrow */
        !           360:            return( CHAR_LEFT );
        !           361:        case 0x49:                      /* PageUp */
        !           362:            return( PAGE_UP );
        !           363:        case 0x51:                      /* PageDown */
        !           364:            return( PAGE_DOWN );
        !           365:        case 0x47:                      /* Home */
        !           366:            return( GOTO_TOP );
        !           367:        case 0x4f:
        !           368:            return( GOTO_BOTTOM );
        !           369:        case 0x0f:                      /* Tab */
        !           370:            return( GOTO_LINE );
        !           371:     }
        !           372: }
        !           373: 
        !           374: /* ================================================================ */
        !           375: 
        !           376: UCHAR GetScanCode( void )
        !           377: 
        !           378: /* wait for a single keystroke and return its scan code */
        !           379: {
        !           380:     KBDKEYINFO kbciKeyInfo;
        !           381: 
        !           382:     KbdCharIn(&kbciKeyInfo,                /* buffer for data */
        !           383:        IO_WAIT,                            /* WAIT/NOWAIT     */
        !           384:        0);                                 /* keyboard handle */
        !           385:     return(kbciKeyInfo.chScan);
        !           386: }

unix.superglobalmegacorp.com

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