source: trunk/dll/saveclip.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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