|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.