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

1.1     ! root        1: /*
        !             2:     VIO File Browsing Application
        !             3:     Created by Microsoft Corporation, 1989
        !             4: */
        !             5: #define         INCL_KBD
        !             6: #define         INCL_VIO
        !             7: #include <stdio.h>
        !             8: #include <stdlib.h>
        !             9: #include <os2.h>
        !            10: #include <string.h>
        !            11: #include "browse.h"
        !            12: /*
        !            13:     Global Variables
        !            14: */
        !            15: FILE   *pfInput;
        !            16: char   *aszLines[NUM_DATA_LINES];
        !            17: SHORT  sTopLine= -1;
        !            18: SHORT  sRows;
        !            19: SHORT  HorScrollPos=0;
        !            20: BYTE   abBlank[2] = { 0x20, 0x07 }; 
        !            21: 
        !            22: /*
        !            23:     Macros for Vio calls
        !            24:     The last parameter is zero because we're using a VIO PS
        !            25: */
        !            26: #define ClearScreen()  VioScrollDn(0, 0, -1, -1, -1, abBlank, 0)
        !            27: #define        Move(r,c)       VioSetCurPos(r, c, 0)
        !            28: #define ScrollDown(n)  VioScrollDn(0, 0, -1, -1,  n, abBlank, 0)
        !            29: #define ScrollUp(n)    VioScrollUp(0, 0, -1, -1,  n, abBlank, 0)
        !            30: #define Write(s)       VioWrtTTY(s, strlen(s), 0)
        !            31: /*
        !            32:     Macros for bounds checking
        !            33: */
        !            34: #define Abs(x)         (((x) > 0) ? (x) : (-(x)))
        !            35: #define Max(x, y)      (((x) > (y)) ? (x) : (y))
        !            36: #define Min(x, y)      (((x) < (y)) ? (x) : (y))
        !            37: #define LowerBound(pos, disp, lbound)  Max(pos - disp, lbound)
        !            38: #define UpperBound(pos, disp, ubound)  Min(pos + disp, ubound)
        !            39: 
        !            40: /*
        !            41:     Functions
        !            42: */
        !            43: int cdecl main(int argc, char *argv[]) {
        !            44: /*
        !            45:     Open the input file and initialize globals
        !            46: */
        !            47:     char       *szFilename;
        !            48:     VIOMODEINFO        viomiMode;
        !            49: 
        !            50:     /*
        !            51:        Open the Input File
        !            52:     */
        !            53:     if (argc == 1)
        !            54:        pfInput = stdin;
        !            55:     else {
        !            56:        szFilename = argv[1];
        !            57:        if (!(pfInput = fopen(szFilename,"r"))) {
        !            58:            fprintf(stderr, "***Error:  Could not open %s", szFilename);
        !            59:            return(-1);
        !            60:        }
        !            61:     }
        !            62:     /*
        !            63:        Read it into the line buffer
        !            64:     */
        !            65:     if (ReadFile()) return(-1);
        !            66:     /*
        !            67:        Get the video parameters
        !            68:     */
        !            69:     viomiMode.cb = sizeof(viomiMode);
        !            70:     VioGetMode(&viomiMode, 0);
        !            71:     sRows = (SHORT) viomiMode.row;
        !            72: 
        !            73:     DisplayScreen(0, TRUE);
        !            74:     ManipulateFile();
        !            75: 
        !            76:     return 0;
        !            77: }
        !            78: 
        !            79: SHORT ReadFile(VOID) {
        !            80: /*
        !            81:     Read lines from the file into the line buffer
        !            82:     If there's an error, abort the program (return -1)
        !            83: */
        !            84:     char szLine[MAXLINELENGTH];
        !            85: 
        !            86:     while (fgets(szLine, MAXLINELENGTH, pfInput)) {
        !            87: 
        !            88:        /* Convert LF (\n) character to NULL (\0) */
        !            89:        if (szLine[strlen(szLine)-1] == '\n')
        !            90:            szLine[strlen(szLine)-1] = 0;
        !            91:        else {
        !            92:            fprintf(stderr,"***Error:  Incomplete line read\n");
        !            93:            return(-1);
        !            94:        }
        !            95: 
        !            96:        /* Put the line into the line buffer */
        !            97:        if (StoreLine(szLine)) {
        !            98:            fprintf(stderr,"***Error:  Line buffer full\n");
        !            99:            return(-1);
        !           100:        }
        !           101:     }
        !           102: 
        !           103:     /* Close the Input file */
        !           104:     fclose(pfInput);
        !           105:     return 0;
        !           106: }
        !           107: 
        !           108: VOID ManipulateFile(VOID) {
        !           109: /*
        !           110:     Main loop for display processing
        !           111: */
        !           112:     CHAR    ch;
        !           113:     SHORT   sLine = 0;
        !           114: 
        !           115:     /* The main command loop */
        !           116:     while ((ch = GetKbdInput()) != ESC) {
        !           117:        /*
        !           118:            Take user input and compute new top line of screen
        !           119:            by taking appropriate jump in jumptable.
        !           120: 
        !           121:            Note:  no horizontal scrolling.
        !           122:        */
        !           123:        switch (ch) {
        !           124:        case LINE_UP:    sLine = LowerBound(sLine, 1, 0);               break;
        !           125:        case LINE_DOWN:  sLine = UpperBound(sLine, 1, BOTTOM);          break;
        !           126:        case PAGE_UP:    sLine = LowerBound(sLine, sRows, 0);           break;
        !           127:        case PAGE_DOWN:  sLine = UpperBound(sLine, sRows, BOTTOM);      break;
        !           128:        case HOME_KEY:   sLine = 0;                                     break;
        !           129:        case END_KEY:    sLine = BOTTOM;                                break;
        !           130:        default:                                                        break;
        !           131:        }
        !           132:        DisplayScreen((USHORT) sLine, !ch);
        !           133:     }
        !           134: 
        !           135:     /* Set Cursor to the bottom of the screen */
        !           136:     Move((USHORT) sRows - 1, 0);
        !           137: }
        !           138: 
        !           139: SHORT StoreLine(char *szLine) {
        !           140: /*
        !           141:     Put a line into the line buffer; line numbers are free
        !           142:     For > 64K data, add code here and in RetrieveLine
        !           143: */
        !           144:     /*
        !           145:        Check if top line exceeded, or if malloc() fails
        !           146:     */
        !           147:     if ((sTopLine == NUM_DATA_LINES) ||
        !           148:        ((aszLines[++sTopLine] = malloc(strlen(szLine) + 1)) == NULL))
        !           149: 
        !           150:        return -1;
        !           151:     /*
        !           152:        Copy szLine into the line buffer
        !           153:     */
        !           154:     strcpy(aszLines[sTopLine], szLine);
        !           155:     return 0;
        !           156: }
        !           157: 
        !           158: SHORT RetrieveLine(char **pszLine , USHORT usLineNum) {
        !           159: /*
        !           160:     Return line numbered usLineNum
        !           161: */
        !           162:     if (usLineNum > sTopLine) return -1;  /* Out of range */
        !           163:     *pszLine = aszLines[usLineNum];
        !           164:     return 0;
        !           165: }
        !           166: 
        !           167: VOID DisplayScreen(USHORT usDisplayTop, BOOL fForceDraw) {
        !           168: /*
        !           169:     Display lines on the screen, starting at usDisplayTop
        !           170:     by scrolling, then painting new information
        !           171: */
        !           172:     SHORT          sDelta;
        !           173:     static USHORT   usOldDispTop;
        !           174: 
        !           175:     sDelta = usDisplayTop - usOldDispTop;
        !           176:     /*
        !           177:        If only a few lines need repainting...
        !           178:     */
        !           179:     if ((Abs(sDelta) < sRows) && !fForceDraw ) {
        !           180:        /*
        !           181:            Moving to a "higher line", so:
        !           182:                Scroll down by the amount (make the difference positive)
        !           183:                Paint in the lines at the top
        !           184:        */
        !           185:        if (sDelta < 0) {
        !           186:            ScrollDown(-sDelta);
        !           187:            Refresh(usDisplayTop, -sDelta, 0);
        !           188:        } else {
        !           189:            /*
        !           190:                Moving to a "lower line", so:
        !           191:                Scroll the information up, and paint at the bottom
        !           192:            */
        !           193:            ScrollUp(sDelta);
        !           194:            Refresh(usDisplayTop + sRows - sDelta, sDelta, sRows - sDelta);
        !           195:        }
        !           196:     } else {   /* Paint the entire screen */
        !           197:        ClearScreen();
        !           198:        Refresh(usDisplayTop, sRows, 0);
        !           199:     }
        !           200:     usOldDispTop = usDisplayTop;
        !           201: }
        !           202: 
        !           203: VOID Refresh (USHORT iLine, USHORT usLines, USHORT usStart) {
        !           204: /*
        !           205:     Updates usLines lines, starting at line iLine in the line
        !           206:     buffer, and line usStart on the screen
        !           207: */
        !           208:     USHORT usLine;
        !           209:     char   *szLine;
        !           210: 
        !           211:     for (usLine = 0; usLine < usLines; usLine++) {
        !           212:        /*
        !           213:            Read the line, set the cursor, print the line
        !           214:        */
        !           215:        if (RetrieveLine(&szLine, (iLine + usLine))) break;
        !           216:        Move((usStart + usLine), 0);
        !           217:        Write(szLine);
        !           218:     }
        !           219: }
        !           220: 
        !           221: CHAR GetKbdInput(VOID) {
        !           222: /*
        !           223:     Get chars, then check scan codes and return our own values
        !           224: */
        !           225:     KBDKEYINFO kbciKeyInfo;
        !           226: 
        !           227:     /*
        !           228:        Wait for characters
        !           229:     */
        !           230:     KbdCharIn(&kbciKeyInfo, IO_WAIT, 0);
        !           231: 
        !           232:     switch (kbciKeyInfo.chScan) {
        !           233:        case ESC:                       /* escape */
        !           234:        case LINE_UP:
        !           235:        case LINE_DOWN:
        !           236:        case PAGE_UP:
        !           237:        case PAGE_DOWN:
        !           238:        case HOME_KEY:
        !           239:        case END_KEY:
        !           240:            return kbciKeyInfo.chScan; break;
        !           241:        default:
        !           242:           return(NULL); break;
        !           243:     }
        !           244: }

unix.superglobalmegacorp.com

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