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