source: trunk/dll/saveclip.c@ 871

Last change on this file since 871 was 871, checked in by Steven Levine, 18 years ago

Correct hex edit buffer sizing to avoid data loss
Detect and report overflows in fixup()

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.7 KB
RevLine 
[51]1
2/***********************************************************************
3
4 $Id: saveclip.c 871 2007-11-17 01:13:23Z stevenhl $
5
6 Save file list to clipboard
7
8 Copyright (c) 1993-98 M. Kimes
[574]9 Copyright (c) 2005, 2007 Steven H. Levine
[51]10
[159]11 12 Feb 03 SHL SaveListDlgProc: standardize EA math
12 01 Aug 04 SHL Rework lstrip/rstrip usage
13 01 Aug 04 SHL Rework fixup usage
14 24 May 05 SHL Rework for CNRITEM.szSubject
[352]15 17 Jul 06 SHL Use Runtime_Error
[404]16 29 Jul 06 SHL Use xfgets
[574]17 22 Mar 07 GKY Use QWL_USER
[775]18 06 Aug 07 GKY Increase Subject EA to 1024
[793]19 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[846]20 27 Sep 07 SHL Correct ULONGLONG size formatting
[871]21 16 Nov 07 SHL Ensure fixup buffer sufficiently large
[51]22
23***********************************************************************/
24
[2]25#define INCL_DOS
26#define INCL_WIN
[841]27#define INCL_LONGLONG
[352]28#include <os2.h>
[2]29
30#include <stdarg.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <share.h>
[352]35
[2]36#include "fm3dll.h"
37#include "fm3dlg.h"
38#include "fm3str.h"
39
[352]40static PSZ pszSrcFile = __FILE__;
[871]41#define MAX_PATTERN_BYTES 80
[352]42
[551]43BOOL SaveToClip(HWND hwnd, CHAR * text, BOOL append)
[352]44{
[551]45 HAB hab = WinQueryAnchorBlock(hwnd);
[2]46
[551]47 return SaveToClipHab(hab, text, append);
[2]48}
49
[551]50BOOL SaveToClipHab(HAB hab, CHAR * text, BOOL append)
[352]51{
[551]52 CHAR *clip = NULL, *hold = NULL, *p;
53 ULONG len;
54 BOOL ret = FALSE;
[2]55
[551]56 if (text) {
[2]57 len = strlen(text);
58 p = text;
[551]59 while (*p) {
60 if (*p == '\n' && (p == text || *(p - 1) != '\r'))
61 len++;
[2]62 p++;
63 }
[551]64 if (len) {
65 if (WinOpenClipbrd(hab)) {
66 if (append)
67 clip = (CHAR *) WinQueryClipbrdData(hab, CF_TEXT);
68 if (clip)
[766]69 len += strlen(clip) + 1;
[551]70 if (!DosAllocSharedMem((PPVOID) & hold, (PSZ) NULL, len, PAG_COMMIT |
71 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
72 *hold = 0;
73 if (clip)
74 strcpy(hold, clip);
75 p = hold + strlen(hold);
76 strcpy(p, text);
77 while (*p) {
78 if (*p == '\n' && (p == hold || *(p - 1) != '\r')) {
79 memmove(p + 1, p, strlen(p) + 1);
80 *p = '\r';
81 }
82 p++;
83 }
84 WinEmptyClipbrd(hab);
85 if (!WinSetClipbrdData(hab, (ULONG) hold, CF_TEXT, CFI_POINTER))
86 DosFreeMem(hold);
87 else
88 ret = TRUE;
89 }
90 WinCloseClipbrd(hab);
[2]91 }
92 }
93 }
94 return ret;
95}
96
[551]97VOID ListToClipboard(HWND hwnd, CHAR ** list, BOOL append)
[352]98{
[551]99 HAB hab = WinQueryAnchorBlock(hwnd);
[2]100
[551]101 ListToClipboardHab(hab, list, append);
[2]102}
103
[551]104VOID ListToClipboardHab(HAB hab, CHAR ** list, BOOL append)
[352]105{
[551]106 CHAR *text = NULL, **clip = NULL;
107 INT x;
[766]108 ULONG len = 0;
[2]109
[551]110 if (list && list[0]) {
111 for (x = 0; list[x]; x++)
[2]112 len += strlen(list[x]) + 2;
[551]113 if (len)
[2]114 len++;
[551]115 if (len) {
116 if (append)
117 clip = ListFromClipboardHab(hab);
118 if (clip && clip[0]) {
119 for (x = 0; clip[x]; x++)
120 len += strlen(clip[x]) + 2;
121 len++;
[2]122 }
[551]123 if (WinOpenClipbrd(hab)) {
124 if (!DosAllocSharedMem((PPVOID) & text, (PSZ) NULL, len, PAG_COMMIT |
125 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
126 *text = 0;
127 if (clip && clip[0]) {
128 for (x = 0; clip[x]; x++) {
129 strcat(text, clip[x]);
130 strcat(text, "\r\n");
131 }
132 }
133 for (x = 0; list[x]; x++) {
134 strcat(text, list[x]);
135 strcat(text, "\r\n");
136 }
137 WinEmptyClipbrd(hab);
138 if (!WinSetClipbrdData(hab, (ULONG) text, CF_TEXT, CFI_POINTER))
139 DosFreeMem(text);
140 }
141 WinCloseClipbrd(hab);
[2]142 }
[551]143 if (clip)
144 FreeList(clip);
[2]145 }
146 }
147}
148
[551]149CHAR **ListFromClipboard(HWND hwnd)
[352]150{
[551]151 HAB hab = WinQueryAnchorBlock(hwnd);
[2]152
153 return ListFromClipboardHab(hab);
154}
155
[551]156CHAR **ListFromClipboardHab(HAB hab)
[352]157{
[551]158 CHAR *p, *pp, *text = NULL, **list = NULL;
159 INT numfiles = 0, numalloced = 0;
[2]160
[551]161 if (WinOpenClipbrd(hab)) {
162 p = (CHAR *) WinQueryClipbrdData(hab, CF_TEXT);
163 if (p && *p)
164 text = xstrdup(p, pszSrcFile, __LINE__);
[2]165 WinCloseClipbrd(hab);
[352]166 if (text) {
[115]167 bstrip(text);
168 pp = text;
[551]169 p = strchr(pp, '\r');
170 if (!p)
171 p = strchr(pp, '\n');
172 while (p && *p) {
173 *p = 0;
174 p++;
175 while (*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t')
176 p++;
177 rstrip(pp);
178 if (*pp) {
179 if (AddToList(pp, &list, &numfiles, &numalloced))
180 break;
181 }
182 pp = p;
183 p = strchr(pp, '\r');
184 if (!p)
185 p = strchr(pp, '\n');
[2]186 }
187 free(text);
188 }
189 }
190 return list;
191}
192
[551]193MRESULT EXPENTRY SaveListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[51]194{
[551]195 HWND hwndCnr;
196 CHAR savename[CCHMAXPATH] = "", pattern[81];
[2]197
[551]198 switch (msg) {
199 case WM_INITDLG:
200 if (!mp2) {
201 Runtime_Error(pszSrcFile, __LINE__, "no data");
202 WinDismissDlg(hwnd, 0);
203 }
204 else {
[574]205 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[551]206 hwndCnr = *(HWND *) mp2;
207 WinSendDlgItemMsg(hwnd,
208 SAV_FILENAME,
209 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
210 WinSendDlgItemMsg(hwnd,
211 SAV_PATTERN,
212 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
213 *savename = *pattern = 0;
214 {
215 ULONG size;
216
217 size = CCHMAXPATH;
218 PrfQueryProfileData(fmprof,
219 appname, "SaveToListName", savename, &size);
[871]220 size = MAX_PATTERN_BYTES + 1;
[551]221 PrfQueryProfileData(fmprof,
222 appname, "SaveToListPattern", pattern, &size);
[2]223 }
[551]224 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
225 if (!*pattern)
226 strcpy(pattern, "%F %s");
227 {
[871]228 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
[2]229
[551]230 fixup(pattern, temp, sizeof(temp), strlen(pattern));
231 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
232 }
233 {
234 FILE *fp;
235 CHAR s[CCHMAXPATH + 14];
[2]236
[551]237 save_dir2(s);
238 if (s[strlen(s) - 1] != '\\')
239 strcat(s, "\\");
240 strcat(s, "PATTERNS.DAT");
241 fp = _fsopen(s, "r", SH_DENYWR);
242 if (fp) {
243 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
244 stripcr(s);
245 if (*s && *s != ';')
246 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
247 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
248 }
249 fclose(fp);
250 }
251 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
252 MPVOID, MPVOID))
253 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
[2]254 }
[551]255 }
256 break;
[2]257
[551]258 case UM_SETDIR:
259 {
260 SHORT sSelect, sMax;
261 CHAR szBuffer[CCHMAXPATH + 14];
262 FILE *fp;
[2]263
[551]264 sMax = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
265 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
266 if (sMax > 0) {
267 save_dir2(szBuffer);
268 if (szBuffer[strlen(szBuffer) - 1] != '\\')
269 strcat(szBuffer, "\\");
270 strcat(szBuffer, "PATTERNS.DAT");
271 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
272 if (fp) {
273 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
274 for (sSelect = 0; sSelect < sMax; sSelect++) {
275 *szBuffer = 0;
276 WinSendDlgItemMsg(hwnd,
277 SAV_LISTBOX,
278 LM_QUERYITEMTEXT,
279 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
280 if (*szBuffer)
281 fprintf(fp, "%s\n", szBuffer);
282 }
283 fclose(fp);
284 }
[2]285 }
[551]286 else if (!sMax) {
287 save_dir2(szBuffer);
288 if (szBuffer[strlen(szBuffer) - 1] != '\\')
289 strcat(szBuffer, "\\");
290 strcat(szBuffer, "PATTERNS.DAT");
291 unlinkf("%s", szBuffer);
292 }
293 }
294 return 0;
[2]295
[551]296 case WM_CONTROL:
297 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
[2]298
[551]299 SHORT sSelect;
300 CHAR szBuffer[81];
[2]301
[551]302 switch (SHORT2FROMMP(mp1)) {
303 case LN_SELECT:
304 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
305 LM_QUERYSELECTION,
306 MPFROMSHORT(LIT_FIRST), MPVOID);
307 if (sSelect >= 0) {
308 *szBuffer = 0;
309 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
310 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
311 if (*szBuffer)
312 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
313 }
314 break;
[2]315
[551]316 case LN_ENTER:
317 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
318 break;
[2]319 }
[551]320 }
321 return 0;
[2]322
[551]323 case WM_COMMAND:
324 hwndCnr = *(HWND *) INSTDATA(hwnd);
325 switch (SHORT1FROMMP(mp1)) {
326 case DID_CANCEL:
327 WinDismissDlg(hwnd, 0);
328 break;
[2]329
[551]330 case IDM_HELP:
331 if (hwndHelp)
332 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
333 MPFROM2SHORT(HELP_SAVETOLIST, 0),
334 MPFROMSHORT(HM_RESOURCEID));
335 break;
[2]336
[551]337 case SAV_FIND:
338 {
339 *savename = 0;
340 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
341 if (!*savename)
342 strcpy(savename, "*.LST");
343 if (export_filename(hwnd, savename, 1) && *savename) {
344 if (!strchr(savename, '.'))
345 strcat(savename, ".LST");
346 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
347 }
348 }
349 break;
[2]350
[551]351 case SAV_ADD:
352 case SAV_DEL:
353 case DID_OK:
354 WinEnableWindow(hwnd, FALSE);
355 {
356 PCNRITEM pci;
357 FILE *fp;
358 CHAR *p, *pp, temp;
359 INT attribute = CRA_CURSORED;
360 SHORT sSelect;
[2]361
[551]362 *pattern = 0;
363 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
364 if (!*pattern) {
365 WinEnableWindow(hwnd, TRUE);
366 DosBeep(150, 100);
367 break;
368 }
369 {
370 switch (SHORT1FROMMP(mp1)) {
371 case SAV_ADD:
372 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
373 LM_SEARCHSTRING,
374 MPFROM2SHORT(0, LIT_FIRST),
375 MPFROMP(pattern));
376 if (sSelect < 0) {
377 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
378 MPFROM2SHORT(LIT_SORTASCENDING, 0),
379 MPFROMP(pattern));
380 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
381 }
382 WinEnableWindow(hwnd, TRUE);
383 return 0;
[2]384
[551]385 case SAV_DEL:
386 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
387 LM_QUERYSELECTION,
388 MPFROM2SHORT(LIT_FIRST, 0),
389 MPVOID);
390 if (sSelect >= 0) {
391 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
392 MPFROM2SHORT(sSelect, 0), MPVOID);
393 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
394 }
395 WinEnableWindow(hwnd, TRUE);
396 return 0;
397 }
398 }
399 literal(pattern);
400 if (!*pattern) {
401 WinEnableWindow(hwnd, TRUE);
402 DosBeep(250, 100);
403 break;
404 }
405 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
406 *savename = 0;
407 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
408 bstrip(savename);
409 if (!*savename) {
410 WinEnableWindow(hwnd, TRUE);
411 DosBeep(100, 100);
412 break;
413 }
414 if (stricmp(savename, "PRN") &&
415 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
416 strcat(savename, ".LST");
417 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
418 pci = (PCNRITEM) WinSendMsg(hwndCnr,
419 CM_QUERYRECORDEMPHASIS,
420 MPFROMLONG(CMA_FIRST),
421 MPFROMSHORT(attribute));
422 if (pci && (INT) pci != -1) {
423 if (pci->rc.flRecordAttr & CRA_SELECTED) {
424 attribute = CRA_SELECTED;
425 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
426 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
427 }
428 }
429 if (!pci || (INT) pci == -1)
430 Runtime_Error(pszSrcFile, __LINE__, "no data");
431 else {
432 fp = _fsopen(savename, "r+", SH_DENYWR);
433 if (!fp)
434 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
435 else {
[766]436 fseek(fp, 0, SEEK_SET);
[551]437 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
[847]438 DosSetFileSize((HFILE) fileno(fp), 0);
[551]439 else
[766]440 fseek(fp, 0, SEEK_END);
[551]441 while (pci && (INT) pci != -1) {
442 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
443 p = pattern;
444 while (*p) {
445 if (*p == '%') {
446 p++;
447 switch (*p) {
448 case 's':
[730]449 fputs(pci->pszSubject, fp);
[551]450 break;
451 case 'S':
[730]452 fprintf(fp, "%-40s", pci->pszSubject);
[551]453 break;
454 case 'Z':
[846]455 // 27 Sep 07 SHL fixme to use CommaFmtULL?
456 fprintf(fp, "%-13llu", pci->cbFile);
[551]457 break;
458 case 'z':
[846]459 // 27 Sep 07 SHL fixme to use CommaFmtULL?
460 fprintf(fp, "%llu", pci->cbFile);
[551]461 break;
462 case 'E':
463 fprintf(fp, "%-5u", pci->easize);
464 break;
465 case 'e':
466 fprintf(fp, "%u", pci->easize);
467 break;
468 case 'd':
469 case 'D':
470 fprintf(fp,
471 "%04u/%02u/%02u",
472 pci->date.year, pci->date.month, pci->date.day);
473 break;
474 case 't':
475 case 'T':
476 fprintf(fp,
477 "%02u:%02u:%02u",
478 pci->time.hours,
479 pci->time.minutes, pci->time.seconds);
480 break;
481 case 'l':
[762]482 fputs(pci->pszLongName, fp);
[551]483 break;
484 case 'L':
[762]485 fprintf(fp, "%-40s", pci->pszLongName);
[551]486 break;
487 case 'F':
488 case 'f':
[730]489 if (IsRoot(pci->pszFileName))
490 pp = pci->pszFileName;
[551]491 else {
[730]492 pp = strrchr(pci->pszFileName, '\\');
[551]493 if (pp)
494 pp++;
495 else
[730]496 pp = pci->pszFileName;
[551]497 }
498 if (*p == 'F')
499 fprintf(fp, "%-13s", pp);
500 else
501 fputs(pp, fp);
502 break;
503 case 'p':
[730]504 fputs(pci->pszFileName, fp);
[551]505 break;
506 case 'P':
507 temp = 0;
[730]508 if (!IsRoot(pci->pszFileName)) {
509 pp = strrchr(pci->pszFileName, '\\');
[551]510 if (pp) {
511 temp = *pp;
512 *pp = 0;
513 }
514 }
[730]515 fputs(pci->pszFileName, fp);
[551]516 if (temp)
517 *pp = temp;
518 break;
519 case '$':
[730]520 fputc(*pci->pszFileName, fp);
[551]521 break;
522 case '%':
523 fputc('%', fp);
524 break;
525 }
526 }
527 else
528 fputc(*p, fp);
529 p++;
530 }
531 fputs("\n", fp);
532 }
533 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
534 MPFROMSHORT(attribute));
535 }
536 fclose(fp);
537 }
538 }
[2]539 }
[551]540 WinEnableWindow(hwnd, TRUE);
541 WinDismissDlg(hwnd, 1);
542 break;
543 }
544 return 0;
[2]545 }
[551]546 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]547}
548
[551]549MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
550 MPARAM mp2)
551{
[2]552
553 CHAR **list;
[551]554 CHAR savename[CCHMAXPATH] = "", pattern[81];
[2]555
[551]556 switch (msg) {
557 case WM_INITDLG:
558 if (!mp2) {
559 Runtime_Error(pszSrcFile, __LINE__, "no data");
560 WinDismissDlg(hwnd, 0);
561 }
562 else {
[574]563 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[551]564 list = (CHAR **) mp2;
565 WinSendDlgItemMsg(hwnd,
566 SAV_FILENAME,
567 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
568 WinSendDlgItemMsg(hwnd,
569 SAV_PATTERN,
570 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
571 *savename = *pattern = 0;
572 {
573 ULONG size;
574
575 size = CCHMAXPATH;
576 PrfQueryProfileData(fmprof,
577 appname, "SaveToListName", savename, &size);
[871]578 size = MAX_PATTERN_BYTES + 1;
[551]579 PrfQueryProfileData(fmprof,
580 appname, "SaveToListPattern", pattern, &size);
[2]581 }
[551]582 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
583 if (!*pattern)
584 strcpy(pattern, "%F %s");
585 {
[871]586 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
[2]587
[551]588 fixup(pattern, temp, sizeof(temp), strlen(pattern));
589 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
590 }
591 {
592 FILE *fp;
593 CHAR s[CCHMAXPATH + 14];
[2]594
[551]595 save_dir2(s);
596 if (s[strlen(s) - 1] != '\\')
597 strcat(s, "\\");
598 strcat(s, "PATTERNS.DAT");
599 fp = _fsopen(s, "r", SH_DENYWR);
600 if (fp) {
601 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
602 stripcr(s);
603 if (*s && *s != ';')
604 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
605 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
606 }
607 fclose(fp);
608 }
609 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
610 MPVOID, MPVOID))
611 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
[2]612 }
[551]613 }
614 break;
[2]615
[551]616 case UM_SETDIR:
617 {
618 SHORT sSelect, sMax;
619 CHAR szBuffer[CCHMAXPATH + 14];
620 FILE *fp;
[2]621
[551]622 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
623 SAV_LISTBOX,
624 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
625 if (sMax > 0) {
626 save_dir2(szBuffer);
627 if (szBuffer[strlen(szBuffer) - 1] != '\\')
628 strcat(szBuffer, "\\");
629 strcat(szBuffer, "PATTERNS.DAT");
630 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
631 if (fp) {
632 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
633 for (sSelect = 0; sSelect < sMax; sSelect++) {
634 *szBuffer = 0;
635 WinSendDlgItemMsg(hwnd,
636 SAV_LISTBOX,
637 LM_QUERYITEMTEXT,
638 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
639 if (*szBuffer)
640 fprintf(fp, "%s\n", szBuffer);
641 }
642 fclose(fp);
643 }
[2]644 }
[551]645 else if (!sMax) {
646 save_dir2(szBuffer);
647 if (szBuffer[strlen(szBuffer) - 1] != '\\')
648 strcat(szBuffer, "\\");
649 strcat(szBuffer, "PATTERNS.DAT");
650 unlinkf("%s", szBuffer);
651 }
652 }
653 return 0;
[2]654
[551]655 case WM_CONTROL:
656 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
[2]657
[551]658 SHORT sSelect;
659 CHAR szBuffer[81];
[2]660
[551]661 switch (SHORT2FROMMP(mp1)) {
662 case LN_SELECT:
663 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
664 LM_QUERYSELECTION,
665 MPFROMSHORT(LIT_FIRST), MPVOID);
666 if (sSelect >= 0) {
667 *szBuffer = 0;
668 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
669 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
670 if (*szBuffer)
671 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
672 }
673 break;
[2]674
[551]675 case LN_ENTER:
676 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
677 break;
[2]678 }
[551]679 }
680 return 0;
[2]681
[551]682 case WM_COMMAND:
683 list = (CHAR **) INSTDATA(hwnd);
684 switch (SHORT1FROMMP(mp1)) {
685 case DID_CANCEL:
686 WinDismissDlg(hwnd, 0);
687 break;
[2]688
[551]689 case IDM_HELP:
690 if (hwndHelp)
691 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
692 MPFROM2SHORT(HELP_SAVETOLIST, 0),
693 MPFROMSHORT(HM_RESOURCEID));
694 break;
[2]695
[551]696 case SAV_FIND:
697 {
698 *savename = 0;
699 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
700 if (!*savename)
701 strcpy(savename, "*.LST");
702 if (export_filename(hwnd, savename, 1) && *savename) {
703 if (!strchr(savename, '.'))
704 strcat(savename, ".LST");
705 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
706 }
707 }
708 break;
[2]709
[551]710 case SAV_ADD:
711 case SAV_DEL:
712 case DID_OK:
713 WinEnableWindow(hwnd, FALSE);
714 {
715 FILE *fp;
716 CHAR *p, *pp, temp;
717 INT x = 0;
718 SHORT sSelect;
[841]719 FILEFINDBUF4L ffb4;
[551]720 ULONG nm;
721 HDIR hdir;
[771]722 CHAR longname[CCHMAXPATH], subject[1024];
[2]723
[551]724 *pattern = 0;
725 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
726 if (!*pattern) {
727 WinEnableWindow(hwnd, TRUE);
728 DosBeep(150, 100);
729 break;
730 }
731 {
732 switch (SHORT1FROMMP(mp1)) {
733 case SAV_ADD:
734 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
735 LM_SEARCHSTRING,
736 MPFROM2SHORT(0, LIT_FIRST),
737 MPFROMP(pattern));
738 if (sSelect < 0) {
739 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
740 MPFROM2SHORT(LIT_SORTASCENDING, 0),
741 MPFROMP(pattern));
742 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
743 }
744 WinEnableWindow(hwnd, TRUE);
745 return 0;
[2]746
[551]747 case SAV_DEL:
748 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
749 LM_QUERYSELECTION,
750 MPFROM2SHORT(LIT_FIRST, 0),
751 MPVOID);
752 if (sSelect >= 0) {
753 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
754 MPFROM2SHORT(sSelect, 0), MPVOID);
755 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
756 }
757 WinEnableWindow(hwnd, TRUE);
758 return 0;
759 }
760 }
761 literal(pattern);
762 if (!*pattern) {
763 WinEnableWindow(hwnd, TRUE);
764 DosBeep(250, 100);
765 break;
766 }
767 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
768 *savename = 0;
769 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
770 bstrip(savename);
771 if (!*savename) {
772 WinEnableWindow(hwnd, TRUE);
773 DosBeep(100, 100);
774 break;
775 }
776 if (stricmp(savename, "PRN") &&
777 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
778 strcat(savename, ".LST");
779 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
780 if (!list || !list[0])
781 Runtime_Error(pszSrcFile, __LINE__, "no data");
782 else {
783 fp = _fsopen(savename, "r+", SH_DENYWR);
784 if (!fp)
785 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
786 else {
[766]787 fseek(fp, 0, SEEK_SET);
[551]788 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
[847]789 DosSetFileSize((HFILE) fileno(fp), 0);
[551]790 else
[766]791 fseek(fp, 0, SEEK_END);
[551]792 while (list[x]) {
793 hdir = HDIR_CREATE;
[761]794 nm = 1;
[551]795 *subject = *longname = 0;
[838]796 if (!xDosFindFirst(list[x], &hdir,
797 FILE_NORMAL | FILE_DIRECTORY |
798 FILE_READONLY | FILE_ARCHIVED |
799 FILE_HIDDEN | FILE_SYSTEM,
[841]800 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
[551]801 /* load the object's Subject, if required */
[766]802 if (ffb4.cbList > 4) {
[551]803 APIRET rc;
804 EAOP2 eaop;
805 PGEA2LIST pgealist;
806 PFEA2LIST pfealist;
807 PGEA2 pgea;
808 PFEA2 pfea;
809 CHAR *value;
[2]810
[551]811 pgealist =
812 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
813 if (pgealist) {
814 pgea = &pgealist->list[0];
815 strcpy(pgea->szName, SUBJECT);
816 pgea->cbName = strlen(pgea->szName);
[766]817 pgea->oNextEntryOffset = 0;
[551]818 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
819 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
820 if (pfealist) {
821 pfealist->cbList = 1024;
822 eaop.fpGEA2List = pgealist;
823 eaop.fpFEA2List = pfealist;
[766]824 eaop.oError = 0;
[551]825 rc = DosQueryPathInfo(list[x],
826 FIL_QUERYEASFROMLIST,
827 (PVOID) & eaop,
828 (ULONG) sizeof(EAOP2));
829 if (!rc) {
830 pfea = &eaop.fpFEA2List->list[0];
831 value = pfea->szName + pfea->cbName + 1;
832 value[pfea->cbValue] = 0;
833 if (*(USHORT *) value == EAT_ASCII)
[771]834 strncpy(subject, value + (sizeof(USHORT) * 2), 1023);
835 subject[1023] = 0;
[551]836 }
837 free(pfealist);
838 }
839 free(pgealist);
840 }
841 }
842 /* load the object's longname */
[766]843 if (ffb4.cbList > 4) {
[551]844 APIRET rc;
845 EAOP2 eaop;
846 PGEA2LIST pgealist;
847 PFEA2LIST pfealist;
848 PGEA2 pgea;
849 PFEA2 pfea;
850 CHAR *value;
[2]851
[551]852 pgealist =
853 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
854 if (pgealist) {
855 pgea = &pgealist->list[0];
856 strcpy(pgea->szName, LONGNAME);
857 pgea->cbName = strlen(pgea->szName);
[766]858 pgea->oNextEntryOffset = 0;
[551]859 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
860 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
861 if (pfealist) {
862 pfealist->cbList = 1024;
863 eaop.fpGEA2List = pgealist;
864 eaop.fpFEA2List = pfealist;
865 eaop.oError = 0L;
866 rc = DosQueryPathInfo(list[x],
867 FIL_QUERYEASFROMLIST,
868 (PVOID) & eaop,
869 (ULONG) sizeof(EAOP2));
870 if (!rc) {
871 pfea = &eaop.fpFEA2List->list[0];
872 value = pfea->szName + pfea->cbName + 1;
873 value[pfea->cbValue] = 0;
874 if (*(USHORT *) value == EAT_ASCII)
875 strncpy(longname, value +
876 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
877 longname[CCHMAXPATHCOMP - 1] = 0;
878 }
879 free(pfealist);
880 }
881 free(pgealist);
882 }
883 }
[2]884
[551]885 p = pattern;
886 while (*p) {
887 if (*p == '%') {
888 p++;
889 switch (*p) {
890 case 's':
891 fputs(subject, fp);
892 break;
893 case 'S':
894 fprintf(fp, "%-40s", subject);
895 break;
896 case 'Z':
[846]897 // 27 Sep 07 SHL fixme to use CommaFmtULL?
898 fprintf(fp, "%-13llu", ffb4.cbFile);
[551]899 break;
900 case 'z':
[846]901 // 27 Sep 07 SHL fixme to use CommaFmtULL?
902 fprintf(fp, "%llu", ffb4.cbFile);
[551]903 break;
904 case 'E':
905 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
906 break;
907 case 'e':
908 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
909 break;
910 case 'd':
911 case 'D':
912 fprintf(fp,
913 "%04u/%02u/%02u",
914 ffb4.fdateLastWrite.year + 1980,
915 ffb4.fdateLastWrite.month,
916 ffb4.fdateLastWrite.day);
917 break;
918 case 't':
919 case 'T':
920 fprintf(fp,
921 "%02u:%02u:%02u",
922 ffb4.ftimeLastWrite.hours,
923 ffb4.ftimeLastWrite.minutes,
924 ffb4.ftimeLastWrite.twosecs * 2);
925 break;
926 case 'l':
927 fputs(longname, fp);
928 break;
929 case 'L':
930 fprintf(fp, "%-40s", longname);
931 break;
932 case 'F':
933 case 'f':
934 if (IsRoot(list[x]))
935 pp = list[x];
936 else {
937 pp = strrchr(list[x], '\\');
938 if (pp)
939 pp++;
940 else
941 pp = list[x];
942 }
943 if (*p == 'F')
944 fprintf(fp, "%-13s", pp);
945 else
946 fputs(pp, fp);
947 break;
948 case 'p':
949 fputs(list[x], fp);
950 break;
951 case 'P':
952 temp = 0;
953 if (!IsRoot(list[x])) {
954 pp = strrchr(list[x], '\\');
955 if (pp) {
956 temp = *pp;
957 *pp = 0;
958 }
959 }
960 fputs(list[x], fp);
961 if (temp)
962 *pp = temp;
963 break;
964 case '$':
965 fputc(*list[x], fp);
966 break;
967 case '%':
968 fputc('%', fp);
969 break;
970 }
971 }
972 else
973 fputc(*p, fp);
974 p++;
975 }
976 fputs("\n", fp);
977 DosFindClose(hdir);
978 }
979 x++;
980 }
981 fclose(fp);
982 }
983 }
[2]984 }
[551]985 WinEnableWindow(hwnd, TRUE);
986 WinDismissDlg(hwnd, 1);
987 break;
988 }
989 return 0;
[2]990 }
[551]991 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]992}
[793]993
994#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
995#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboard,ListToClipboardHab)
996#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
997#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.