|
|
1.1 ! root 1: /*------------------------------ ! 2: HEAD.C -- Displays File Head ! 3: ------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #define INCL_GPI ! 7: #include <os2.h> ! 8: #include <malloc.h> ! 9: #include <stdio.h> ! 10: #include <string.h> ! 11: #include "easyfont.h" ! 12: #include "head.h" ! 13: ! 14: #define LCID_FIXEDFONT 1L ! 15: #define LCID_BOLDFONT 2L ! 16: ! 17: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 18: MRESULT EXPENTRY AboutDlgProc (HWND, USHORT, MPARAM, MPARAM) ; ! 19: MRESULT EXPENTRY OpenDlgProc (HWND, USHORT, MPARAM, MPARAM) ; ! 20: SHORT ParseFileName (CHAR *, CHAR *) ; ! 21: ! 22: CHAR szClientClass [] = "Head" ; ! 23: CHAR szFileName [80] ; ! 24: HAB hab ; ! 25: ! 26: int main (int argc, char *argv[]) ! 27: { ! 28: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | ! 29: FCF_SIZEBORDER | FCF_MINMAX | ! 30: FCF_SHELLPOSITION | FCF_TASKLIST | ! 31: FCF_MENU ; ! 32: HMQ hmq ; ! 33: HWND hwndFrame, hwndClient ; ! 34: QMSG qmsg ; ! 35: ! 36: // Check for filename parameter and copy to szFileName ! 37: ! 38: if (argc > 1) ! 39: ParseFileName (szFileName, argv [1]) ; ! 40: ! 41: // Continue normally ! 42: ! 43: hab = WinInitialize (0) ; ! 44: hmq = WinCreateMsgQueue (hab, 0) ; ! 45: ! 46: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 47: ! 48: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE, ! 49: &flFrameFlags, szClientClass, NULL, ! 50: 0L, NULL, ID_RESOURCE, &hwndClient) ; ! 51: ! 52: if (hwndFrame != NULL) ! 53: { ! 54: WinSendMsg (hwndFrame, WM_SETICON, ! 55: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), ! 56: NULL) ; ! 57: ! 58: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 59: WinDispatchMsg (hab, &qmsg) ; ! 60: ! 61: WinDestroyWindow (hwndFrame) ; ! 62: } ! 63: WinDestroyMsgQueue (hmq) ; ! 64: WinTerminate (hab) ; ! 65: return 0 ; ! 66: } ! 67: ! 68: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 69: { ! 70: static CHAR szErrorMsg [] = "File not found or could not be opened" ; ! 71: static SHORT cxClient, cyClient, cxChar, cyChar, cyDesc ; ! 72: CHAR *pcReadBuffer ; ! 73: FILE *fileInput ; ! 74: FONTMETRICS fm ; ! 75: HPS hps ; ! 76: POINTL ptl ; ! 77: SHORT sLength ; ! 78: ! 79: switch (msg) ! 80: { ! 81: case WM_CREATE: ! 82: hps = WinGetPS (hwnd) ; ! 83: EzfQueryFonts (hps) ; ! 84: ! 85: if (!EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR, ! 86: FONTSIZE_10, 0)) ! 87: { ! 88: WinReleasePS (hps) ; ! 89: ! 90: WinMessageBox (HWND_DESKTOP, HWND_DESKTOP, ! 91: "Cannot find a fixed-pitch font. Load the Courier " ! 92: "fonts from the Control Panel and try again.", ! 93: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ; ! 94: ! 95: return 1 ; ! 96: } ! 97: GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ; ! 98: cxChar = (SHORT) fm.lAveCharWidth ; ! 99: cyChar = (SHORT) fm.lMaxBaselineExt ; ! 100: cyDesc = (SHORT) fm.lMaxDescender ; ! 101: ! 102: GpiSetCharSet (hps, LCID_DEFAULT) ; ! 103: GpiDeleteSetId (hps, LCID_FIXEDFONT) ; ! 104: WinReleasePS (hps) ; ! 105: return 0 ; ! 106: ! 107: case WM_SIZE: ! 108: cxClient = SHORT1FROMMP (mp2) ; ! 109: cyClient = SHORT2FROMMP (mp2) ; ! 110: return 0 ; ! 111: ! 112: case WM_COMMAND: ! 113: switch (COMMANDMSG(&msg)->cmd) ! 114: { ! 115: case IDM_OPEN: ! 116: if (WinDlgBox (HWND_DESKTOP, hwnd, OpenDlgProc, ! 117: NULL, IDD_OPEN, NULL)) ! 118: WinInvalidateRect (hwnd, NULL, FALSE) ; ! 119: return 0 ; ! 120: ! 121: case IDM_ABOUT: ! 122: WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc, ! 123: NULL, IDD_ABOUT, NULL) ; ! 124: return 0 ; ! 125: } ! 126: break ; ! 127: ! 128: case WM_PAINT: ! 129: hps = WinBeginPaint (hwnd, NULL, NULL) ; ! 130: GpiErase (hps) ; ! 131: ! 132: if (szFileName [0] != '\0') ! 133: { ! 134: EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR, ! 135: FONTSIZE_10, 0) ; ! 136: EzfCreateLogFont (hps, LCID_BOLDFONT, FONTFACE_COUR, ! 137: FONTSIZE_10, FATTR_SEL_BOLD) ; ! 138: ! 139: GpiSetCharSet (hps, LCID_BOLDFONT) ; ! 140: ptl.x = cxChar ; ! 141: ptl.y = cyClient - cyChar + cyDesc ; ! 142: GpiCharStringAt (hps, &ptl, (LONG) strlen (szFileName), ! 143: szFileName) ; ! 144: ptl.y -= cyChar ; ! 145: ! 146: if ((fileInput = fopen (szFileName, "r")) != NULL) ! 147: { ! 148: GpiSetCharSet (hps, LCID_FIXEDFONT) ; ! 149: pcReadBuffer = malloc (cxClient / cxChar) ; ! 150: ! 151: while ((ptl.y -= cyChar) > 0 && ! 152: fgets (pcReadBuffer, cxClient / cxChar - 2, ! 153: fileInput) != NULL) ! 154: { ! 155: sLength = strlen (pcReadBuffer) ; ! 156: ! 157: if (pcReadBuffer [sLength - 1] == '\n') ! 158: sLength-- ; ! 159: ! 160: if (sLength > 0) ! 161: GpiCharStringAt (hps, &ptl, (LONG) sLength, ! 162: pcReadBuffer) ; ! 163: } ! 164: free (pcReadBuffer) ; ! 165: fclose (fileInput) ; ! 166: } ! 167: else // file cannot be opened ! 168: { ! 169: ptl.y -= cyChar ; ! 170: GpiCharStringAt (hps, &ptl, ! 171: (LONG) strlen (szErrorMsg), ! 172: szErrorMsg) ; ! 173: } ! 174: GpiSetCharSet (hps, LCID_DEFAULT) ; ! 175: GpiDeleteSetId (hps, LCID_FIXEDFONT) ; ! 176: GpiDeleteSetId (hps, LCID_BOLDFONT) ; ! 177: } ! 178: WinEndPaint (hps) ; ! 179: return 0 ; ! 180: } ! 181: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 182: } ! 183: ! 184: MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 185: { ! 186: switch (msg) ! 187: { ! 188: case WM_COMMAND: ! 189: switch (COMMANDMSG(&msg)->cmd) ! 190: { ! 191: case DID_OK: ! 192: case DID_CANCEL: ! 193: WinDismissDlg (hwnd, TRUE) ; ! 194: return 0 ; ! 195: } ! 196: break ; ! 197: } ! 198: return WinDefDlgProc (hwnd, msg, mp1, mp2) ; ! 199: } ! 200: ! 201: VOID FillDirListBox (HWND hwnd, CHAR *pcCurrentPath) ! 202: { ! 203: static CHAR szDrive [] = " :" ; ! 204: FILEFINDBUF findbuf ; ! 205: HDIR hDir = 1 ; ! 206: SHORT sDrive ; ! 207: USHORT usDriveNum, usCurPathLen, usSearchCount = 1 ; ! 208: ULONG ulDriveMap ; ! 209: ! 210: DosQCurDisk (&usDriveNum, &ulDriveMap) ; ! 211: pcCurrentPath [0] = (CHAR) usDriveNum + '@' ; ! 212: pcCurrentPath [1] = ':' ; ! 213: pcCurrentPath [2] = '\\' ; ! 214: usCurPathLen = 64 ; ! 215: DosQCurDir (0, pcCurrentPath + 3, &usCurPathLen) ; ! 216: ! 217: WinSetDlgItemText (hwnd, IDD_PATH, pcCurrentPath) ; ! 218: WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_DELETEALL, NULL, NULL) ; ! 219: ! 220: for (sDrive = 0 ; sDrive < 26 ; sDrive++) ! 221: if (ulDriveMap & 1L << sDrive) ! 222: { ! 223: szDrive [1] = (CHAR) sDrive + 'A' ; ! 224: ! 225: WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM, ! 226: MPFROM2SHORT (LIT_END, 0), ! 227: MPFROMP (szDrive)) ; ! 228: } ! 229: ! 230: DosFindFirst ("*.*", &hDir, 0x0017, &findbuf, sizeof findbuf, ! 231: &usSearchCount, 0L) ; ! 232: while (usSearchCount) ! 233: { ! 234: if (findbuf.attrFile & 0x0010 && ! 235: (findbuf.achName [0] != '.' || findbuf.achName [1])) ! 236: ! 237: WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM, ! 238: MPFROM2SHORT (LIT_SORTASCENDING, 0), ! 239: MPFROMP (findbuf.achName)) ; ! 240: ! 241: DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount) ; ! 242: } ! 243: } ! 244: ! 245: VOID FillFileListBox (HWND hwnd) ! 246: { ! 247: FILEFINDBUF findbuf ; ! 248: HDIR hDir = 1 ; ! 249: USHORT usSearchCount = 1 ; ! 250: ! 251: WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_DELETEALL, NULL, NULL) ; ! 252: ! 253: DosFindFirst ("*.*", &hDir, 0x0007, &findbuf, sizeof findbuf, ! 254: &usSearchCount, 0L) ; ! 255: while (usSearchCount) ! 256: { ! 257: WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_INSERTITEM, ! 258: MPFROM2SHORT (LIT_SORTASCENDING, 0), ! 259: MPFROMP (findbuf.achName)) ; ! 260: ! 261: DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount) ; ! 262: } ! 263: } ! 264: ! 265: MRESULT EXPENTRY OpenDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 266: { ! 267: static CHAR szCurrentPath [80], szBuffer [80] ; ! 268: SHORT sSelect ; ! 269: ! 270: switch (msg) ! 271: { ! 272: case WM_INITDLG: ! 273: FillDirListBox (hwnd, szCurrentPath) ; ! 274: FillFileListBox (hwnd) ; ! 275: ! 276: WinSendDlgItemMsg (hwnd, IDD_FILEEDIT, EM_SETTEXTLIMIT, ! 277: MPFROM2SHORT (80, 0), NULL) ; ! 278: return 0 ; ! 279: ! 280: case WM_CONTROL: ! 281: if (SHORT1FROMMP (mp1) == IDD_DIRLIST || ! 282: SHORT1FROMMP (mp1) == IDD_FILELIST) ! 283: { ! 284: sSelect = (USHORT) WinSendDlgItemMsg (hwnd, ! 285: SHORT1FROMMP (mp1), ! 286: LM_QUERYSELECTION, 0L, 0L) ; ! 287: ! 288: WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), ! 289: LM_QUERYITEMTEXT, ! 290: MPFROM2SHORT (sSelect, sizeof szBuffer), ! 291: MPFROMP (szBuffer)) ; ! 292: } ! 293: ! 294: switch (SHORT1FROMMP (mp1)) // Control ID ! 295: { ! 296: case IDD_DIRLIST: ! 297: switch (SHORT2FROMMP (mp1)) // notification code ! 298: { ! 299: case LN_ENTER: ! 300: if (szBuffer [0] == ' ') ! 301: DosSelectDisk (szBuffer [1] - '@') ; ! 302: else ! 303: DosChDir (szBuffer, 0L) ; ! 304: ! 305: FillDirListBox (hwnd, szCurrentPath) ; ! 306: FillFileListBox (hwnd) ; ! 307: ! 308: WinSetDlgItemText (hwnd, IDD_FILEEDIT, "") ; ! 309: return 0 ; ! 310: } ! 311: break ; ! 312: ! 313: case IDD_FILELIST: ! 314: switch (SHORT2FROMMP (mp1)) // notification code ! 315: { ! 316: case LN_SELECT: ! 317: WinSetDlgItemText (hwnd, IDD_FILEEDIT, ! 318: szBuffer) ; ! 319: return 0 ; ! 320: ! 321: case LN_ENTER: ! 322: ParseFileName (szFileName, szBuffer) ; ! 323: WinDismissDlg (hwnd, TRUE) ; ! 324: return 0 ; ! 325: } ! 326: break ; ! 327: } ! 328: break ; ! 329: ! 330: case WM_COMMAND: ! 331: switch (COMMANDMSG(&msg)->cmd) ! 332: { ! 333: case DID_OK: ! 334: WinQueryDlgItemText (hwnd, IDD_FILEEDIT, ! 335: sizeof szBuffer, szBuffer) ; ! 336: ! 337: switch (ParseFileName (szCurrentPath, szBuffer)) ! 338: { ! 339: case 0: ! 340: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 341: FillDirListBox (hwnd, szCurrentPath) ; ! 342: FillFileListBox (hwnd) ; ! 343: return 0 ; ! 344: ! 345: case 1: ! 346: FillDirListBox (hwnd, szCurrentPath) ; ! 347: FillFileListBox (hwnd) ; ! 348: WinSetDlgItemText (hwnd, IDD_FILEEDIT, "") ; ! 349: return 0 ; ! 350: ! 351: case 2: ! 352: strcpy (szFileName, szCurrentPath) ; ! 353: WinDismissDlg (hwnd, TRUE) ; ! 354: return 0 ; ! 355: } ! 356: break ; ! 357: ! 358: case DID_CANCEL: ! 359: WinDismissDlg (hwnd, FALSE) ; ! 360: return 0 ; ! 361: } ! 362: break ; ! 363: } ! 364: return WinDefDlgProc (hwnd, msg, mp1, mp2) ; ! 365: } ! 366: ! 367: SHORT ParseFileName (CHAR *pcOut, CHAR *pcIn) ! 368: { ! 369: /*---------------------------------------------------------------- ! 370: Input: pcOut -- Pointer to parsed file specification. ! 371: pcIn -- Pointer to raw file specification. ! 372: ! 373: Returns: 0 -- pcIn had invalid drive or directory. ! 374: 1 -- pcIn was empty or had no filename. ! 375: 2 -- pcOut points to drive, full dir, and file name. ! 376: ! 377: Changes current drive and directory per pcIn string. ! 378: ----------------------------------------------------------------*/ ! 379: ! 380: CHAR *pcLastSlash, *pcFileOnly ; ! 381: ULONG ulDriveMap ; ! 382: USHORT usDriveNum, usDirLen = 64 ; ! 383: ! 384: strupr (pcIn) ; ! 385: ! 386: // If input string is empty, return 1 ! 387: ! 388: if (pcIn [0] == '\0') ! 389: return 1 ; ! 390: ! 391: // Get drive from input string or current drive ! 392: ! 393: if (pcIn [1] == ':') ! 394: { ! 395: if (DosSelectDisk (pcIn [0] - '@')) ! 396: return 0 ; ! 397: ! 398: pcIn += 2 ; ! 399: } ! 400: DosQCurDisk (&usDriveNum, &ulDriveMap) ; ! 401: ! 402: *pcOut++ = (CHAR) usDriveNum + '@' ; ! 403: *pcOut++ = ':' ; ! 404: *pcOut++ = '\\' ; ! 405: ! 406: // If rest of string is empty, return 1 ! 407: ! 408: if (pcIn [0] == '\0') ! 409: return 1 ; ! 410: ! 411: // Search for last backslash. If none, could be directory. ! 412: ! 413: if (NULL == (pcLastSlash = strrchr (pcIn, '\\'))) ! 414: { ! 415: if (!DosChDir (pcIn, 0L)) ! 416: return 1 ; ! 417: ! 418: // Otherwise, get current dir & attach input filename ! 419: ! 420: DosQCurDir (0, pcOut, &usDirLen) ; ! 421: ! 422: if (strlen (pcIn) > 12) ! 423: return 0 ; ! 424: ! 425: if (*(pcOut + strlen (pcOut) - 1) != '\\') ! 426: strcat (pcOut++, "\\") ; ! 427: ! 428: strcat (pcOut, pcIn) ; ! 429: return 2 ; ! 430: } ! 431: // If the only backslash is at beginning, change to root ! 432: ! 433: if (pcIn == pcLastSlash) ! 434: { ! 435: DosChDir ("\\", 0L) ; ! 436: ! 437: if (pcIn [1] == '\0') ! 438: return 1 ; ! 439: ! 440: strcpy (pcOut, pcIn + 1) ; ! 441: return 2 ; ! 442: } ! 443: // Attempt to change directory -- Get current dir if OK ! 444: ! 445: *pcLastSlash = '\0' ; ! 446: ! 447: if (DosChDir (pcIn, 0L)) ! 448: return 0 ; ! 449: ! 450: DosQCurDir (0, pcOut, &usDirLen) ; ! 451: ! 452: // Append input filename, if any ! 453: ! 454: pcFileOnly = pcLastSlash + 1 ; ! 455: ! 456: if (*pcFileOnly == '\0') ! 457: return 1 ; ! 458: ! 459: if (strlen (pcFileOnly) > 12) ! 460: return 0 ; ! 461: ! 462: if (*(pcOut + strlen (pcOut) - 1) != '\\') ! 463: strcat (pcOut++, "\\") ; ! 464: ! 465: strcat (pcOut, pcFileOnly) ; ! 466: return 2 ; ! 467: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.