|
|
1.1 root 1: /* -----------------------------------------------------------------*\
2: /* AVIO (windowed) File Browser Demo
3: /* Version 1.0
4: /* Created by Microsoft Corp. 1988
5: /* -----------------------------------------------------------------*/
6:
7: /* ------------------------------------ */
8: /* library includes */
9: /* ------------------------------------ */
10: #define INCL_BASE
11: #define INCL_AVIO
12: #include <stdlib.h>
13: #include <stdio.h>
14: #include <os2.h>
15: #include <string.h>
16: #include "browse.h"
17:
18: /* ------------------------------------ */
19: /* global variables */
20: /* ------------------------------------ */
21: FILE *pFile_In;
22: char *apchDataLines[ NUM_DATA_LINES ];
23: SHORT HighestLine= -1;
24: SHORT HorScrollPos=0;
25: extern HVPS hVPS;
26: extern HWND hwndSkel;
27: extern HDC hDC;
28: extern USHORT Vid_Cols, Vid_Rows;
29:
30: /* ================================================================ */
31: /* Functions */
32: /* ================================================================ */
33:
34: SHORT Initialize(argc,argv)
35: int argc;
36: char *argv[];
37:
38: /* tries to open input file and initialize global variables */
39: /* plus any other misc. functions */
40: {
41: char *achInFile;
42: VIOMODEINFO viomiMode;
43:
44: /* -------------------------- */
45: /* get input file ready */
46: /* -------------------------- */
47: if (argc==1)
48: pFile_In=stdin;
49: else {
50: achInFile=argv[1];
51: if ((pFile_In=fopen(achInFile,"r"))==NULL) {
52: fprintf(stderr,"Error--could not open %s",achInFile);
53: return(-1);
54: }
55: }
56:
57: /* -------------------------- */
58: /* read input file */
59: /* -------------------------- */
60: if (ReadFile())
61: return(-1);
62:
63: /* -------------------------- */
64: /* get video parameters */
65: /* -------------------------- */
66: viomiMode.cb = sizeof(viomiMode);
67:
68: GetWinCharSize();
69:
70: SetScrollPosVert( 0, HighestLine );
71: SetScrollPosHorz( 0, HIGHEST_HSCROLL );
72: DisplayScreen(0, TRUE);
73: }
74:
75: /* ================================================================ */
76:
77: SHORT ReadFile( void )
78:
79: /* reads data lines from the file to memory. */
80: /* if an error occurs, it will abort the program */
81: /* stores the lines as null-terminated ascii, with */
82: /* no /n's in the strings. */
83: { char achLine[256];
84:
85: while (fgets(achLine,128,pFile_In)) {
86:
87: /* strip LF character from end of string before storing */
88: /* by converting LF to /0 */
89: if (achLine[strlen(achLine)-1]=='\n')
90: achLine[strlen(achLine)-1]=0;
91: else {
92: fprintf(stderr,"Internal error in ReadFile.\n");
93: return(-1);
94: }
95: if (StoreLine(achLine)) {
96: fprintf(stderr,"Error while storing line in ReadFile.\n");
97: return(-1);
98: }
99: }
100:
101: fclose(pFile_In);
102: return(0);
103: }
104:
105: /* ================================================================ */
106: /* Line-handling subsystem */
107: /* ================================================================ */
108:
109: SHORT StoreLine( pchLine )
110: char *pchLine;
111:
112: /* store a line in memory at end of list. */
113: /* creates the line number automatically */
114: /* extensions to allow >64K data go here and in RetrieveLine */
115: {
116: /* don't forget to malloc space for \0 */
117: if (HighestLine==NUM_DATA_LINES ||
118: (apchDataLines[++HighestLine]=malloc(strlen(pchLine)+1))==NULL )
119: return(-1);
120: /* copy (to, from) */
121: strcpy(apchDataLines[HighestLine],pchLine);
122: return(0);
123: }
124:
125: /* ================================================================ */
126:
127: SHORT RetrieveLine( ppchLine , LineNum )
128: char **ppchLine;
129: USHORT LineNum;
130:
131: /* take line number and convert it to a string of data from memory */
132: /* extensions to allow >64K data also incorporated here */
133: {
134: if (LineNum > HighestLine)
135: return(-1);
136: *ppchLine=apchDataLines[LineNum];
137: return(0);
138: }
139:
140: /* ================================================================ */
141: /* Video-handling subsystem */
142: /* ================================================================ */
143:
144: void ClearScreen( void )
145:
146: /* self-explanitory I hope */
147: /* uses technique from qh examples */
148: /* clearing=scrolldown(maxlines) */
149: {
150: BYTE bBlank[2];
151: bBlank[0] = 0x20; /* space character */
152: bBlank[1] = 0x07; /* white attribute (EGA) */
153: VioScrollUp(0, /* top row */
154: 0, /* left column */
155: -1, /* bottom row */
156: -1, /* right column */
157: -1, /* number of lines */
158: bBlank, /* cell to write */
159: WINDOW); /* video handle */
160: }
161:
162: /* ================================================================ */
163:
164: void DisplayScreen( USHORT TopLine, BOOL force)
165:
166: /* display lines from memory to video, starting at line number TopLine */
167: /* has 'smarts' to scroll+paint remainder. */
168: {
169: SHORT LineDiff;
170: static USHORT OldTopLine;
171:
172: VioSetOrg(0, HorScrollPos, WINDOW); /* effects horizontal shift */
173: LineDiff=TopLine-OldTopLine;
174: if ( (abs(LineDiff) < Vid_Rows ) && !force ) {
175: /* is legal to apply scroll+paint remainder algorithm */
176: /* (usually applied when user wants line up/down) */
177: if (LineDiff<0) {
178: /* user scrolls back; repaint top part of screen */
179: ScrollDown( -LineDiff );
180: VidRefresh(TopLine, -LineDiff, 0);
181: }
182: else {
183: /* user scrolls forward; repaint bottom part */
184: ScrollUp( LineDiff );
185: VidRefresh( TopLine+Vid_Rows-LineDiff, LineDiff, Vid_Rows-LineDiff);
186: }
187: }
188: else {
189: /* repaint entire screen */
190: ClearScreen();
191: VidRefresh(TopLine, Vid_Rows, 0);
192: }
193: OldTopLine=TopLine;
194: }
195:
196: /* ================================================================ */
197:
198: void VidRefresh ( USHORT LineFrom, USHORT NumLines, USHORT VidRowStart)
199: /* Redisplay lines LineFrom to LineTo starting at video VidRowStart */
200: /* Will NOT check that you haven't given it stupid arguments */
201: {
202: USHORT LineOffset;
203: char *pchLine;
204:
205: for (LineOffset=0; LineOffset < NumLines ; LineOffset++) {
206: if (LineOffset + LineFrom > HighestLine)
207: break;
208: RetrieveLine(&pchLine, LineOffset + LineFrom);
209: VioSetCurPos(
210: VidRowStart+LineOffset, /* vertical pos */
211: 0 , /* horizontal pos */
212: WINDOW /* hvio */
213: );
214: VioWrtTTY(
215: pchLine, /* string to print */
216: strlen(pchLine), /* string length */
217: WINDOW /* hvio */
218: );
219: }
220: }
221:
222: void ScrollUp(int Nlines)
223: {
224: BYTE bBlank[2];
225: bBlank[0] = 0x20; /* space character */
226: bBlank[1] = 0x07; /* white attribute (EGA) */
227: VioScrollUp(0, /* top row */
228: 0, /* left column */
229: -1, /* bottom row */
230: -1, /* right column */
231: Nlines, /* number of lines */
232: bBlank, /* cell to write */
233: WINDOW); /* video handle */
234: }
235:
236: void ScrollDown(int Nlines)
237: {
238: BYTE bBlank[2];
239: bBlank[0] = 0x20; /* space character */
240: bBlank[1] = 0x07; /* white attribute (EGA) */
241: VioScrollDn(0, /* top row */
242: 0, /* left column */
243: -1, /* bottom row */
244: -1, /* right column */
245: Nlines, /* number of lines */
246: bBlank, /* cell to write */
247: WINDOW); /* video handle */
248: }
249:
250: /* ================================================================ */
251: /* User input subsystem */
252: /* ================================================================ */
253:
254: VOID ExecuteAction( CHAR ch , USHORT usSliderPos )
255: /* should be: Execute_User_Action() */
256: /* determine the new line number */
257: /* at top of screen */
258: /* given the movement code in ch */
259: /* returns 1 if successful */
260: /* returns 0 if unsuccessful (user wants to quit) */
261: {
262: static USHORT OldLine ;
263: BOOL bForce=FALSE;
264:
265: #define downbound( X, A, B) ( (X) > ((B)-(A)) )? (B) : (X)+(A)
266: #define upbound( X, A, B) ( (X) < ((B)+(A)) )? (B) : (X)-(A)
267:
268:
269: switch (ch) {
270: case LINE_UP:
271: OldLine=upbound( OldLine, 1, 0);
272: break;
273: case LINE_DOWN:
274: OldLine=downbound( OldLine, 1, MAX_START_LINE);
275: break;
276: case PAGE_UP:
277: OldLine=upbound( OldLine, Vid_Rows, 0);
278: break;
279: case PAGE_DOWN:
280: OldLine=downbound( OldLine, Vid_Rows, MAX_START_LINE);
281: break;
282: case GOTO_TOP:
283: OldLine= 0;
284: break;
285: case GOTO_BOTTOM:
286: OldLine= MAX_START_LINE;
287: break;
288: case GOTO_LINE_TRACK:
289: OldLine= usSliderPos;
290: break;
291: case CHAR_RIGHT:
292: HorScrollPos= downbound ( HorScrollPos, 1, HIGHEST_HSCROLL);
293: break;
294: case CHAR_LEFT:
295: HorScrollPos = upbound( HorScrollPos, 1, 0);
296: break;
297: case PAGE_RIGHT:
298: HorScrollPos = downbound( HorScrollPos, HSCROLL_PAGESIZE, HIGHEST_HSCROLL);
299: break;
300: case PAGE_LEFT:
301: HorScrollPos = upbound( HorScrollPos, HSCROLL_PAGESIZE, 0);
302: break;
303: case GOTO_HSCROLL_TRACK:
304: HorScrollPos = (SHORT) usSliderPos;
305: break;
306: case NULL:
307: bForce=TRUE;
308: break;
309: case GOTO_LINE, GOTO_HSCROLL:
310: break;
311: }
312: if ( (ch != GOTO_HSCROLL_TRACK) && (ch != GOTO_LINE_TRACK) ) {
313: SetScrollPosVert ( OldLine, MAX_START_LINE );
314: SetScrollPosHorz ( HorScrollPos, HIGHEST_HSCROLL );
315: }
316: DisplayScreen( OldLine, bForce );
317: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.