|
|
1.1 ! root 1: /* ! 2: browse.c -- AVIO File Browsing Utility ! 3: ! 4: Created by Microsoft Corporation, 1989 ! 5: */ ! 6: #define INCL_WINTRACKRECT ! 7: #define INCL_WINWINDOWMGR ! 8: #define INCL_WINPOINTERS ! 9: #define INCL_WINFRAMEMGR ! 10: #include <os2.h> ! 11: #include <stdio.h> ! 12: #include <stdlib.h> ! 13: #include <string.h> ! 14: #include "avio.h" ! 15: #include "browse.h" ! 16: #include <opendlg.h> ! 17: /* ! 18: Constants ! 19: */ ! 20: #define MAXLINELEN 120 ! 21: #define AVIO_PS_ROWS 25 ! 22: #define AVIO_PS_COLS 80 ! 23: /* ! 24: Global Variables ! 25: */ ! 26: FILE *pfInput; ! 27: PFNWP pfnOldClient; ! 28: char *aszLines[NUM_DATA_LINES]; ! 29: SHORT sTopLine = 0; ! 30: DLF dlfInput; ! 31: HFILE hfInput; ! 32: USHORT usAction; ! 33: LBINFO lbiData; ! 34: HPOINTER hptrWait; ! 35: HPOINTER hptrArrow; ! 36: HWND hWndClient; ! 37: HWND hWndFrame; ! 38: BOOL fLargeFont = FALSE; ! 39: SHORT sMaxLine; ! 40: /* ! 41: Open the input file ! 42: */ ! 43: int cdecl main(int argc, char *argv[]) { ! 44: static CHAR szClientClass[] = "Browse"; ! 45: static CHAR szCaption[] = ""; ! 46: HAB hAB; ! 47: HMQ hmq; ! 48: QMSG qmsg; ! 49: ULONG flFrameFlags = FCF_STANDARD | FCF_HORZSCROLL | FCF_VERTSCROLL; ! 50: ULONG flFrameStyle = WS_VISIBLE | FS_SCREENALIGN; ! 51: char *szInFile; ! 52: ! 53: hAB = WinInitialize(0); ! 54: hmq = WinCreateMsgQueue(hAB, 0); ! 55: ! 56: WinRegisterClass(hAB, szClientClass, BrowseWndProc, CS_SYNCPAINT, 0); ! 57: ! 58: hWndFrame = WinCreateStdWindow(HWND_DESKTOP, flFrameStyle, ! 59: &flFrameFlags, szClientClass, szCaption, ! 60: 0L, NULL, ID_RESOURCE, &hWndClient); ! 61: /* ! 62: Get the hourglass and arrow pointers ! 63: */ ! 64: hptrWait = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE); ! 65: hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE); ! 66: ! 67: if (argc == 1) pfInput = stdin; ! 68: else { ! 69: if (!(pfInput = fopen(argv[1], "r"))) { ! 70: fprintf(stderr, "***Error: Could not open %s", szInFile); ! 71: return(-1); ! 72: } ! 73: } ! 74: ReadFile(); ! 75: /* ! 76: Setup AVIO PS and force a paint ! 77: Note: This subclasses the client and frame windows ! 78: */ ! 79: lbiData.sPSrows = AVIO_PS_ROWS; ! 80: lbiData.sPScols = AVIO_PS_COLS; ! 81: lbiData.sRows = sTopLine; ! 82: lbiData.sCols = sMaxLine; ! 83: lbiData.pfnQL = (PFNQL) RetrieveLine; ! 84: lbiData.fLargeFont = FALSE; ! 85: AvioInit(&lbiData); ! 86: /* ! 87: Process messages ! 88: */ ! 89: while (WinGetMsg(hAB, &qmsg, NULL, 0, 0)) WinDispatchMsg(hAB, &qmsg); ! 90: ! 91: /* Blast the AVIO PS */ ! 92: AvioClose(); ! 93: ! 94: WinDestroyWindow(hWndFrame); ! 95: WinDestroyMsgQueue(hmq); ! 96: WinTerminate(hAB); ! 97: return 0; ! 98: } ! 99: ! 100: void ReadFile(void) { ! 101: /* ! 102: Reads in a file using <stdio.h> fgets() calls. ! 103: It might be wise to put better word wrap facilities here ! 104: */ ! 105: char szLine[MAXLINELEN]; ! 106: ! 107: /* Put up the hourglass */ ! 108: WinSetPointer(HWND_DESKTOP, hptrWait); ! 109: ! 110: /* Reinitialize buffer, MaxLineLength */ ! 111: for (; sTopLine > 0; ) free(aszLines[--sTopLine]); ! 112: sMaxLine = 0; ! 113: ! 114: /* Read in the file */ ! 115: while (fgets(szLine, MAXLINELEN, pfInput)) { ! 116: ! 117: /* Convert LF (\n) into NULL (\0) */ ! 118: if (szLine[strlen(szLine) - 1] == '\n') { ! 119: szLine[strlen(szLine) - 1] = 0; ! 120: } else szLine[MAXLINELEN - 1] = 0; ! 121: ! 122: if (StoreLine(szLine)) { ! 123: fprintf(stderr,"***Error: Line buffer full\n"); ! 124: return; ! 125: } ! 126: } ! 127: fclose(pfInput); ! 128: ! 129: /* Reset the mouse pointer */ ! 130: WinSetPointer(HWND_DESKTOP, hptrArrow); ! 131: ! 132: return; ! 133: } ! 134: ! 135: SHORT StoreLine(char *szLine) { ! 136: /* ! 137: Put a line into the line buffer; line numbers are free ! 138: For > 64K data, add code here and in RetrieveLine ! 139: */ ! 140: int i, cLinePos; ! 141: BOOL fDone; ! 142: /* ! 143: Check if top line exceeded, or malloc() fails ! 144: */ ! 145: if (sTopLine == NUM_DATA_LINES) return -1; ! 146: /* ! 147: Compute line length with tabs expanded ! 148: */ ! 149: cLinePos = 0; ! 150: for (i = 0; i < MAXLINELEN; i++) { ! 151: switch(szLine[i]) { ! 152: case '\0': ! 153: cLinePos++; i = MAXLINELEN; ! 154: break; ! 155: case '\t': ! 156: do { ! 157: cLinePos++; ! 158: } while (cLinePos % 8); ! 159: break; ! 160: ! 161: default: ! 162: cLinePos++; ! 163: } ! 164: ! 165: } ! 166: if (cLinePos > sMaxLine) sMaxLine = cLinePos; ! 167: if (!(aszLines[sTopLine] = malloc(cLinePos))) return -1; ! 168: /* ! 169: Copy szLine into the line buffer. Expand tabs here. ! 170: */ ! 171: i = cLinePos = 0; fDone = FALSE; ! 172: while ((i <= MAXLINELEN) && (!fDone)) { ! 173: switch(szLine[i]) { ! 174: case '\t': ! 175: do { ! 176: aszLines[sTopLine][cLinePos++] = ' '; ! 177: } while (cLinePos % 8); ! 178: break; ! 179: ! 180: default: ! 181: aszLines[sTopLine][cLinePos++] = szLine[i]; ! 182: fDone = !szLine[i]; ! 183: break; ! 184: } ! 185: i++; ! 186: } ! 187: sTopLine++; ! 188: return 0; ! 189: } ! 190: ! 191: char * _loadds RetrieveLine(USHORT usLineNum) { ! 192: /* ! 193: Return line numbered usLineNum ! 194: */ ! 195: if (usLineNum >= sTopLine) { /* Out of range */ ! 196: return NULL; ! 197: } ! 198: return aszLines[usLineNum]; ! 199: } ! 200: ! 201: MRESULT CALLBACK BrowseWndProc(hWnd, msg, mp1, mp2) ! 202: HWND hWnd; ! 203: USHORT msg; ! 204: MPARAM mp1; ! 205: MPARAM mp2; ! 206: { ! 207: /* ! 208: Handle the About... and Open... messages ! 209: */ ! 210: switch(msg) { ! 211: case WM_COMMAND: ! 212: switch (COMMANDMSG(&msg)->cmd) { ! 213: case IDM_ABOUT: ! 214: WinDlgBox(HWND_DESKTOP, hWnd, AboutDlgProc, ! 215: NULL, IDD_ABOUT, NULL); ! 216: return 0; ! 217: ! 218: case IDM_OPEN: ! 219: /* ! 220: Open the file, using the file dialog ! 221: then reopen it with stdio calls ! 222: */ ! 223: SetupDLF(&dlfInput, DLG_OPENDLG, &hfInput, ! 224: "\\*.*", NULL, "Browse Open File", ! 225: "Select a file to be browsed."); ! 226: DlgFile(hWnd, &dlfInput); ! 227: pfInput = fopen(dlfInput.szOpenFile, "r"); ! 228: ReadFile(); ! 229: /* ! 230: Close the opened handle ! 231: */ ! 232: DosClose(hfInput); ! 233: ! 234: /* Fix up the screen display */ ! 235: lbiData.sRows = sTopLine; ! 236: lbiData.sCols = sMaxLine; ! 237: lbiData.fLargeFont = fLargeFont; ! 238: AvioInit(&lbiData); ! 239: ! 240: return 0; ! 241: ! 242: case IDM_FONT: ! 243: AvioLargeFont(fLargeFont = !fLargeFont); ! 244: return 0; ! 245: ! 246: default: return 0; ! 247: } ! 248: break; ! 249: default: return WinDefWindowProc(hWnd, msg, mp1, mp2); ! 250: } ! 251: return 0L; ! 252: } ! 253: ! 254: MRESULT CALLBACK AboutDlgProc(hDlg, msg, mp1, mp2) ! 255: /* ! 256: About... dialog procedure ! 257: */ ! 258: HWND hDlg; ! 259: USHORT msg; ! 260: MPARAM mp1; ! 261: MPARAM mp2; ! 262: { ! 263: switch(msg) { ! 264: case WM_COMMAND: ! 265: switch(COMMANDMSG(&msg)->cmd) { ! 266: case DID_OK: WinDismissDlg(hDlg, TRUE); break; ! 267: default: break; ! 268: } ! 269: default: return WinDefDlgProc(hDlg, msg, mp1, mp2); ! 270: } ! 271: return FALSE; ! 272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.