|
|
1.1 root 1: #include <ctype.h>
2:
3: #include "dirwrap.h"
4: #include "uifc.h"
5: #include "ciolib.h"
6: #include "mouse.h"
7: #include "keys.h"
8:
9: #include "filepick.h"
10:
11: enum {
12: DIR_LIST
13: ,FILE_LIST
14: ,MASK_FIELD
15: ,CURRENT_PATH
16: ,FIELD_LIST_TERM
17: };
18:
19: void drawfpwindow(uifcapi_t *api)
20: {
21: char lbuf[1024];
22: int i;
23: int j;
24: int listheight=0;
25: int height;
26: int width;
27: char shade[1024];
28:
29: width=SCRN_RIGHT-SCRN_LEFT+1;
30:
31: height=api->scrn_len-3;
32: /* Make sure it's odd */
33: if(!(width%2))
34: width--;
35:
36: listheight=height-7;
37:
38: i=0;
39: lbuf[i++]='\xc9';
40: lbuf[i++]=api->hclr|(api->bclr<<4);
41: for(j=1;j<width-1;j++) {
42: lbuf[i++]='\xcd';
43: lbuf[i++]=api->hclr|(api->bclr<<4);
44: }
45: if(api->mode&UIFC_MOUSE && width>6) {
46: lbuf[2]='[';
47: lbuf[3]=api->hclr|(api->bclr<<4);
48: lbuf[4]=0xfe;
49: lbuf[5]=api->lclr|(api->bclr<<4);
50: lbuf[6]=']';
51: lbuf[7]=api->hclr|(api->bclr<<4);
52: lbuf[8]='[';
53: lbuf[9]=api->hclr|(api->bclr<<4);
54: lbuf[10]='?';
55: lbuf[11]=api->lclr|(api->bclr<<4);
56: lbuf[12]=']';
57: lbuf[13]=api->hclr|(api->bclr<<4);
58: api->buttony=SCRN_TOP;
59: api->exitstart=SCRN_LEFT+1;
60: api->exitend=SCRN_LEFT+3;
61: api->helpstart=SCRN_LEFT+4;
62: api->helpend=SCRN_LEFT+6;
63: }
64: lbuf[i++]='\xbb';
65: lbuf[i]=api->hclr|(api->bclr<<4);
66: puttext(SCRN_LEFT,SCRN_TOP,SCRN_LEFT+width-1,SCRN_TOP,lbuf);
67: lbuf[5]=api->hclr|(api->bclr<<4);
68: lbuf[11]=api->hclr|(api->bclr<<4);
69: for(j=2;j<14;j+=2)
70: lbuf[j]='\xcd';
71: lbuf[0]='\xc8';
72: lbuf[(width-1)*2]='\xbc';
73: puttext(SCRN_LEFT,SCRN_TOP+height-1
74: ,SCRN_LEFT+width-1,SCRN_TOP+height-1,lbuf);
75: lbuf[0]='\xcc';
76: lbuf[(width-1)*2]='\xb9';
77: lbuf[width-1]='\xcb';
78: puttext(SCRN_LEFT,SCRN_TOP+2,SCRN_LEFT+width-1,SCRN_TOP+2,lbuf);
79: lbuf[width-1]='\xca';
80: puttext(SCRN_LEFT,SCRN_TOP+3+listheight
81: ,SCRN_LEFT+width-1,SCRN_TOP+3+listheight,lbuf);
82: lbuf[0]='\xba';
83: lbuf[(width-1)*2]='\xba';
84: for(j=2;j<(width-1)*2;j+=2)
85: lbuf[j]=' ';
86: puttext(SCRN_LEFT,SCRN_TOP+1,
87: SCRN_LEFT+width-1,SCRN_TOP+1,lbuf);
88: puttext(SCRN_LEFT,SCRN_TOP+height-2,
89: SCRN_LEFT+width-1,SCRN_TOP+height-2,lbuf);
90: puttext(SCRN_LEFT,SCRN_TOP+height-3,
91: SCRN_LEFT+width-1,SCRN_TOP+height-3,lbuf);
92: lbuf[width-1]='\xba';
93: for(j=0;j<listheight;j++)
94: puttext(SCRN_LEFT,SCRN_TOP+3+j
95: ,SCRN_LEFT+width-1,SCRN_TOP+3+j,lbuf);
96:
97:
98: /* Shadow */
99: if(api->bclr==BLUE) {
100: gettext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1
101: ,SCRN_TOP+(height-1),shade);
102: for(j=1;j<1024;j+=2)
103: shade[j]=DARKGRAY;
104: puttext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1
105: ,SCRN_TOP+(height-1),shade);
106: gettext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1
107: ,SCRN_TOP+height,shade);
108: for(j=1;j<width*2;j+=2)
109: shade[j]=DARKGRAY;
110: puttext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1
111: ,SCRN_TOP+height,shade);
112: }
113: }
114:
115: void free_opt_list(char ***opts)
116: {
117: char **p;
118:
119: if(*opts==NULL)
120: return;
121: for(p=*opts; *p && (*p)[0]; p++) {
122: if(*p)
123: FREE_AND_NULL((*p));
124: }
125: FREE_AND_NULL(*opts);
126: }
127:
128: char *insensitive_mask(char *mask)
129: {
130: #ifdef __unix__
131: char *in;
132: char *out;
133: static char nmask[MAX_PATH*4+1];
134:
135: out=nmask;
136: for(in=mask; *in; in++) {
137: if(isalpha(*in)) {
138: *(out++)='[';
139: *(out++)=tolower(*in);
140: *(out++)=toupper(*in);
141: *(out++)=']';
142: }
143: else
144: *(out++)=*in;
145: }
146: *out=0;
147: return(nmask);
148: #else
149: return(mask);
150: #endif
151: }
152:
153: char *getdirname(char *path)
154: {
155: char *p1;
156: char *p2;
157:
158: p1=strrchr(path,'/');
159: #ifdef _WIN32
160: p2=strrchr(path,'\\');
161: if(p2 > p1)
162: p1=p2;
163: #endif
164: p2 = path;
165: if(p1 > path) {
166: for(p2=p1-1; p2>=path && !IS_PATH_DELIM(*p2); p2--);
167: if(IS_PATH_DELIM(*p2) && *(p2+1))
168: p2++;
169: }
170: return(p2);
171: }
172:
173: char **get_file_opt_list(char **fns, int files, int dirsonly, int root)
174: {
175: char **opts;
176: int i;
177: int j=0;
178:
179: opts=(char **)malloc((files+2)*sizeof(char *));
180: if(opts==NULL)
181: return(NULL);
182: memset(opts, 0, (files+2)*sizeof(char *));
183: if(dirsonly) {
184: if(!root)
185: opts[j++]=strdup("..");
186: }
187: for(i=0;i<files;i++) {
188: if(isdir(fns[i])) {
189: if(dirsonly)
190: opts[j++]=strdup(getdirname(fns[i]));
191: }
192: else {
193: if(!dirsonly)
194: opts[j++]=strdup(getfname(fns[i]));
195: }
196: }
197: opts[j]="";
198: return(opts);
199: }
200:
201: void display_current_path(uifcapi_t *api, char *path)
202: {
203: char dpath[MAX_PATH+2];
204: int width;
205: int height;
206: char *p;
207:
208: height=api->scrn_len-3;
209: width=SCRN_RIGHT-SCRN_LEFT-3;
210: SAFECOPY(dpath, path);
211: while(strlen(dpath) > width) {
212: /* Just remove paths from the start. */
213: dpath[0]='.';
214: dpath[1]='.';
215: dpath[2]='.';
216: memmove(dpath+3, dpath+(strlen(dpath)-width+4), width-1);
217: }
218: /* For Win32, convert all "confusing" / to \\ */
219: #ifdef _WIN32
220: for(p=dpath; *p; p++) {
221: if(*p=='/')
222: *p='\\';
223: }
224: #endif
225:
226: api->printf(SCRN_LEFT+2, SCRN_TOP+height-2, api->lclr|(api->bclr<<4), "%-*s", width, dpath);
227: }
228:
229: int mousetofield(int currfield, int opts, int height, int width, int listheight, int listwidth, int *dcur, int *dbar, int *fcur, int *fbar)
230: {
231: int newfield;
232: int nbar;
233: int bardif;
234: struct mouse_event mevnt;
235:
236: newfield=currfield;
237: if(getmouse(&mevnt)==0) {
238: if(mevnt.endx >= SCRN_LEFT + 1
239: && mevnt.endx <= SCRN_LEFT + listwidth
240: && mevnt.endy >= SCRN_TOP + 3
241: && mevnt.endy <= SCRN_TOP + 2 + listheight) {
242: newfield = DIR_LIST;
243: if(mevnt.endx == SCRN_LEFT + 1)
244: ungetmouse(&mevnt);
245: else {
246: bardif = (mevnt.starty - SCRN_TOP - 3) - *dbar;
247: *dbar += bardif;
248: *dcur += bardif;
249: }
250: }
251: if(mevnt.endx >= SCRN_LEFT + 1 + listwidth + 1
252: && mevnt.endx <= SCRN_LEFT + 1 + listwidth * 2
253: && mevnt.endy >= SCRN_TOP + 3
254: && mevnt.endy <= SCRN_TOP + 2 + listheight) {
255: newfield = FILE_LIST;
256: if(mevnt.endx == SCRN_LEFT + 1 + listwidth + 1)
257: ungetmouse(&mevnt);
258: else {
259: bardif = (mevnt.starty - SCRN_TOP - 3) - *fbar;
260: *fbar += bardif;
261: *fcur += bardif;
262: }
263: }
264: if(!(opts & UIFC_FP_MSKNOCHG)
265: && (mevnt.endx >= SCRN_LEFT + 1
266: && mevnt.endx <= SCRN_LEFT + width - 2
267: && mevnt.endy == SCRN_TOP + height - 3)) {
268: newfield = MASK_FIELD;
269: ungetmouse(&mevnt);
270: }
271: if(opts & UIFC_FP_ALLOWENTRY
272: && mevnt.endx >= SCRN_LEFT + 1
273: && mevnt.endx <= SCRN_LEFT + width - 2
274: && mevnt.endy == SCRN_TOP + height - 2) {
275: newfield = CURRENT_PATH;
276: ungetmouse(&mevnt);
277: }
278: }
279: return(newfield);
280: }
281:
282: int filepick(uifcapi_t *api, char *title, struct file_pick *fp, char *dir, char *msk, int opts)
283: {
284: char cfile[MAX_PATH*5+1]; /* Current full path to file */
285: char cpath[MAX_PATH+1]; /* Current path */
286: char drive[3];
287: char tdir[MAX_PATH+1];
288: char fname[MAX_PATH+1];
289: char ext[MAX_PATH+1];
290: char cmsk[MAX_PATH*4+1]; /* Current file mask */
291: char cglob[MAX_PATH*4+1]; /* File glob patter */
292: char dglob[MAX_PATH*4+1]; /* Directory glob pattern */
293: char *p;
294: glob_t fgl; /* Files */
295: glob_t dgl; /* Directories */
296: int dircur=0;
297: int dirbar=0;
298: int filecur=0;
299: int filebar=0;
300: int listwidth;
301: char **dir_list=NULL;
302: char **file_list=NULL;
303: int currfield=DIR_LIST;
304: int lastfield=DIR_LIST;
305: int i;
306: int root=0; /* Is this the root of the file system? */
307: /* On *nix, this just means no .. on Win32,
308: * Something should be done about drive letters. */
309: int reread=FALSE;
310: int lbclr;
311: char *lastpath=NULL;
312: char *tmplastpath=NULL;
313: char *tmppath=NULL;
314: int width;
315: int height;
316: char *YesNo[]={"Yes", "No", ""};
317: int finished=FALSE;
318: int retval=0;
319: int fieldmove;
320:
321: height=api->scrn_len-3;
322: width=SCRN_RIGHT-SCRN_LEFT-3;
323:
324: lbclr=api->lbclr;
325:
326: /* No struct passed */
327: if(fp==NULL)
328: return(-1);
329:
330: /* Illegal options */
331: if((opts & UIFC_FP_MULTI)==UIFC_FP_MULTI && (opts & (UIFC_FP_ALLOWENTRY|UIFC_FP_OVERPROMPT|UIFC_FP_CREATPROMPT)))
332: return(-1);
333:
334: fp->files=0;
335: fp->selected=NULL;
336:
337: /* No initial path specified */
338: if(dir==NULL || !dir[0])
339: SAFECOPY(cpath,".");
340:
341: FULLPATH(cpath,((dir==NULL||dir[0]==0)?".":dir),sizeof(cpath));
342: backslash(cpath);
343:
344: if(msk==NULL || msk[0]==0) {
345: SAFECOPY(cmsk,"*");
346: }
347: else {
348: SAFECOPY(cmsk,msk);
349: }
350: listwidth=SCRN_RIGHT-SCRN_LEFT+1;
351: listwidth-=listwidth%2;
352: listwidth-=3;
353: listwidth/=2;
354: /* Draw the file picker itself... */
355: hold_update = TRUE;
356: drawfpwindow(api);
357: /* Display the title centered */
358: i=strlen(title);
359: if(i>width-4)
360: i=width-4;
361: api->printf(SCRN_LEFT+2, SCRN_TOP+1, api->hclr|(api->bclr<<4), "%*s%-*s", (width-i)/2-2, "", i, title);
362: api->printf(SCRN_LEFT+2, SCRN_TOP+height-3, api->hclr|(api->bclr<<4), "Mask: ");
363: while(!finished) {
364: hold_update = TRUE;
365: api->printf(SCRN_LEFT+8, SCRN_TOP+height-3, api->lclr|(api->bclr<<4), "%-*s", width-7, cmsk);
366: tmppath=strdup(cpath);
367: if(tmppath != NULL)
368: FULLPATH(cpath,tmppath,sizeof(cpath));
369: FREE_AND_NULL(tmppath);
370:
371: #ifdef __unix__
372: if(cpath[0]==0) {
373: cpath[0]='/';
374: cpath[1]=0;
375: }
376: #endif
377: backslash(cpath);
378: sprintf(cglob,"%s%s",cpath,(opts&UIFC_FP_MSKCASE)?cmsk:insensitive_mask(cmsk));
379: sprintf(dglob,"%s*",cpath);
380: switch(currfield) {
381: case DIR_LIST:
382: if(lastfield==DIR_LIST)
383: sprintf(cfile,"%s%s",cpath,cmsk);
384: break;
385: }
386:
387: #ifdef __unix__
388: if(cpath[0]==0) {
389: cpath[0]='/';
390: cpath[1]=0;
391: }
392: if(cpath[1]==0)
393: root=TRUE;
394: else
395: root=FALSE;
396: #else
397: /* #error Need to do something about root paths (in get_file_opt_list() too!) */
398: #endif
399: if(glob(dglob, GLOB_MARK, NULL, &dgl)!=0 && !isdir(cpath)) {
400: if(lastpath==NULL) {
401: fp->files=0;
402: retval=-1;
403: goto cleanup;
404: }
405: hold_update=FALSE;
406: api->msg("Cannot read directory!");
407: SAFECOPY(cpath, lastpath);
408: FREE_AND_NULL(lastpath);
409: currfield=lastfield;
410: continue;
411: }
412: if(glob(cglob, 0, NULL, &fgl)!=0)
413: fgl.gl_pathc=0;
414: api->list_height=api->scrn_len-3-7;
415: dir_list=get_file_opt_list(dgl.gl_pathv, dgl.gl_pathc, TRUE, root);
416: file_list=get_file_opt_list(fgl.gl_pathv, fgl.gl_pathc, FALSE, root);
417: globfree(&dgl);
418: globfree(&fgl);
419: reread=FALSE;
420: dircur=dirbar=filecur=filebar=0;
421: while(!reread) {
422: hold_update=TRUE;
423: display_current_path(api, cfile);
424: api->lbclr=api->lclr|(api->bclr<<4);
425: api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1,3,listwidth,&dircur,&dirbar,NULL,dir_list);
426: api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list);
427: api->lbclr=lbclr;
428: lastfield=currfield;
429: fieldmove=0;
430: hold_update = FALSE;
431: switch(currfield) {
432: case DIR_LIST:
433: i=api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE,1,3,listwidth,&dircur,&dirbar,NULL,dir_list);
434: if(i==-1) { /* ESC */
435: retval=fp->files=0;
436: goto cleanup;
437: }
438: if(i==-2-'\t') /* TAB */
439: fieldmove=1;
440: if(i==-3842) /* Backtab */
441: fieldmove=-1;
442: if(i==-2-CIO_KEY_MOUSE)
443: currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar);
444: if(i>=0) {
445: FREE_AND_NULL(lastpath);
446: lastpath=strdup(cpath);
447: strcat(cpath,dir_list[i]);
448: reread=TRUE;
449: sprintf(cfile,"%s%s",cpath,cmsk);
450: }
451: break;
452: case FILE_LIST:
453: i=api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list);
454: if(i==-1) {
455: retval=fp->files=0;
456: goto cleanup;
457: }
458: if(i>=0) {
459: sprintf(cfile,"%s%s",cpath,file_list[i]);
460: if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI) {
461: retval=fp->files=1;
462: fp->selected=(char **)malloc(sizeof(char *));
463: if(fp->selected==NULL) {
464: fp->files=0;
465: retval=-1;
466: goto cleanup;
467: }
468: fp->selected[0]=strdup(cfile);
469: if(fp->selected[0]==NULL) {
470: FREE_AND_NULL(fp->selected);
471: fp->files=0;
472: retval=-1;
473: goto cleanup;
474: }
475: api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list);
476: finished=reread=TRUE;
477: }
478: }
479: if(i==-2-'\t')
480: fieldmove=1;
481: if(i==-3842) /* Backtab */
482: fieldmove=-1;
483: if(i==-2-CIO_KEY_MOUSE)
484: currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar);
485: break;
486: case CURRENT_PATH:
487: FREE_AND_NULL(tmplastpath);
488: tmplastpath=strdup(cpath);
489: api->getstrxy(SCRN_LEFT+2, SCRN_TOP+height-2, width-1, cfile, sizeof(cfile)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i);
490: if(i==ESC) {
491: retval=fp->files=0;
492: goto cleanup;
493: }
494: if((opts & (UIFC_FP_FILEEXIST|UIFC_FP_PATHEXIST)) && !fexist(cfile)) {
495: FREE_AND_NULL(tmplastpath);
496: api->msg("No such path/file!");
497: continue;
498: }
499: if(isdir(cfile))
500: backslash(cfile);
501: _splitpath(cfile, drive, tdir, fname, ext);
502: sprintf(cpath,"%s%s",drive,tdir);
503: if(!isdir(cpath)) {
504: FREE_AND_NULL(tmplastpath);
505: api->msg("No such path!");
506: continue;
507: }
508: if(i==CIO_KEY_MOUSE)
509: currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar);
510: if(i==3840)
511: fieldmove=-1;
512: else {
513: if(currfield == CURRENT_PATH)
514: fieldmove=1;
515: }
516: sprintf(cfile,"%s%s%s%s",drive,tdir,fname,ext);
517: if(strchr(fname,'*') !=NULL || strchr(fname,'?') !=NULL
518: || strchr(ext,'*') !=NULL || strchr(ext,'?') !=NULL
519: || (isdir(cfile) && !(opts & UIFC_FP_DIRSEL) && (i=='\r' || i=='\n'))
520: || (!isdir(cfile) && i!='\r' && i!='\n')) {
521: if(opts & UIFC_FP_MSKNOCHG) {
522: sprintf(cfile,"%s%s%s",drive,tdir,cmsk);
523: FREE_AND_NULL(tmplastpath);
524: api->msg("File mask cannot be changed");
525: continue;
526: }
527: else {
528: if(!isdir(cfile))
529: sprintf(cmsk, "%s%s", fname, ext);
530: reread=TRUE;
531: }
532: break;
533: }
534: else {
535: if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && (i=='\r' || i!='\n'))
536: fieldmove=0;
537: }
538: if((currfield != CURRENT_PATH) || fieldmove)
539: break;
540: if(isdir(cfile)) {
541: if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i != 3840) {
542: if(opts & UIFC_FP_DIRSEL) {
543: finished=reread=TRUE;
544: retval=fp->files=1;
545: fp->selected=(char **)malloc(sizeof(char *));
546: if(fp->selected==NULL) {
547: fp->files=0;
548: retval=-1;
549: goto cleanup;
550: }
551: fp->selected[0]=strdup(cfile);
552: if(fp->selected[0]==NULL) {
553: free(fp->selected);
554: fp->files=0;
555: retval=-1;
556: goto cleanup;
557: }
558: }
559: }
560: SAFECOPY(cpath, cfile);
561: backslash(cfile);
562: strcat(cfile,cmsk);
563: }
564: if(tmplastpath != NULL) {
565: if(strcmp(tmplastpath, cpath)) {
566: reread=TRUE;
567: FREE_AND_NULL(lastpath);
568: lastpath=tmplastpath;
569: tmplastpath=NULL;
570: }
571: }
572: FREE_AND_NULL(tmplastpath);
573: if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i!=3840) {
574: retval=fp->files=1;
575: fp->selected=(char **)malloc(sizeof(char *));
576: if(fp->selected==NULL) {
577: fp->files=0;
578: retval=-1;
579: goto cleanup;
580: }
581: fp->selected[0]=strdup(cfile);
582: if(fp->selected[0]==NULL) {
583: FREE_AND_NULL(fp->selected);
584: fp->files=0;
585: retval=-1;
586: goto cleanup;
587: }
588: finished=reread=TRUE;
589: }
590: break;
591: case MASK_FIELD:
592: p=strdup(cmsk);
593: api->getstrxy(SCRN_LEFT+8, SCRN_TOP+height-3, width-7, cmsk, sizeof(cmsk)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i);
594: if(i==CIO_KEY_MOUSE)
595: currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar);
596: if(i==ESC) {
597: retval=fp->files=0;
598: goto cleanup;
599: }
600: if(strcmp(cmsk, p)) {
601: sprintf(cfile,"%s%s",cpath,cmsk);
602: reread=TRUE;
603: }
604: FREE_AND_NULL(p);
605: if(i==3840)
606: fieldmove=-1;
607: else
608: fieldmove=1;
609: break;
610: }
611: currfield+=fieldmove;
612: if(currfield<0)
613: currfield=FIELD_LIST_TERM-1;
614: while(1) {
615: if(currfield==MASK_FIELD && (opts & UIFC_FP_MSKNOCHG)) {
616: currfield+=fieldmove;
617: continue;
618: }
619: if(currfield==CURRENT_PATH && !(opts & UIFC_FP_ALLOWENTRY)) {
620: currfield+=fieldmove;
621: continue;
622: }
623: break;
624: }
625: if(currfield==FIELD_LIST_TERM)
626: currfield=DIR_LIST;
627: }
628: free_opt_list(&file_list);
629: free_opt_list(&dir_list);
630: if(finished) {
631: if((opts & UIFC_FP_OVERPROMPT) && fexist(cfile)) {
632: if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File exists, overwrite?", YesNo)!=0)
633: finished=FALSE;
634: }
635: if((opts & UIFC_FP_CREATPROMPT) && !fexist(cfile)) {
636: if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File does not exist, create?", YesNo)!=0)
637: finished=FALSE;
638: }
639: }
640: }
641:
642: cleanup: /* Cleans up allocated variables returns from function */
643: FREE_AND_NULL(lastpath);
644: FREE_AND_NULL(tmppath);
645: FREE_AND_NULL(tmplastpath);
646: free_opt_list(&file_list);
647: free_opt_list(&dir_list);
648: return(retval);
649: }
650:
651: int filepick_free(struct file_pick *fp)
652: {
653: int i;
654:
655: for(i=0; i<fp->files; i++) {
656: FREE_AND_NULL(fp->selected[i]);
657: }
658: FREE_AND_NULL(fp->selected);
659: return(0);
660: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.