use m4_normalize on the output strings to remove trailing spaces/tabs and consolidate...
[AROS.git] / workbench / c / RequestFile.c
blob0c3257cfafe60506a73a242e85a571f36f71156a
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 RequestFile CLI command.
6 */
8 /*****************************************************************************
10 NAME
12 RequestFile
14 SYNOPSIS
16 DRAWER,FILE/K,PATTERN/K,TITLE/K,POSITIVE/K,NEGATIVE/K,
17 ACCEPTPATTERN/K,REJECTPATTERN/K,SAVEMODE/S,MULTISELECT/S,
18 DRAWERSONLY/S,NOICONS/S,PUBSCREEN/K,INITIALVOLUMES/S
20 LOCATION
24 FUNCTION
26 Creates file requester. The selected files will be displayed separated
27 by spaces. If no file is selected the return code is 5 (warn).
29 INPUTS
30 DRAWER -- initial content of drawer field
31 FILE -- initial content of file field
32 PATTERN -- content of pattern field (e.g. #?.c)
33 TITLE -- title of the dialog box
34 POSITIVE -- string for the left button
35 NEGATIVE -- string for the right button
36 ACCEPTPATTERN -- only files which match the pattern are displayed
37 REJECTPATTERN -- files which match the pattern aren't displayed
38 SAVEMODE -- requester is displayed as save requester
39 MULTISELECT -- more than one file can be selected
40 DRAWERSONLY -- only drawers are displayed
41 NOICONS -- no icon files (#?.info) are displayed
42 PUBSCREEN -- requester is opened on the given public screen
43 INITIALVOLUMES -- shows the volumes
45 RESULT
47 Standard DOS error codes.
49 NOTES
51 EXAMPLE
53 BUGS
55 SEE ALSO
57 INTERNALS
59 ******************************************************************************/
61 #include <proto/asl.h>
62 #include <proto/dos.h>
63 #include <proto/exec.h>
65 #include <dos/dos.h>
66 #include <dos/rdargs.h>
67 #include <dos/var.h>
68 #include <dos/dosasl.h>
69 #include <exec/types.h>
70 #include <exec/memory.h>
71 #include <libraries/asl.h>
72 #include <utility/tagitem.h>
73 #include <workbench/startup.h>
75 #include <string.h>
77 #define ARG_TEMPLATE "DRAWER,FILE/K,PATTERN/K,TITLE/K,POSITIVE/K," \
78 "NEGATIVE/K,ACCEPTPATTERN/K,REJECTPATTERN/K," \
79 "SAVEMODE/S,MULTISELECT/S,DRAWERSONLY/S," \
80 "NOICONS/S,PUBSCREEN/K,INITIALVOLUMES/S"
82 #define MAX_PATH_LEN 512
85 enum { ARG_DRAWER = 0, ARG_FILE, ARG_PATTERN, ARG_TITLE, ARG_POSITIVE,
86 ARG_NEGATIVE, ARG_ACCEPTPAT, ARG_REJECTPAT, ARG_SAVEMODE,
87 ARG_MULTISELECT, ARG_DRAWERSONLY, ARG_NOICONS, ARG_PUBSCREEN,
88 ARG_INITIALVOLUMES, TOTAL_ARGS };
90 const TEXT version[] = "$VER: RequestFile 42.4 (3.4.2014)\n";
92 struct TagItem FileTags[] =
94 /* Note: The ordering of these is _important_! */
95 { ASLFR_InitialDrawer , (IPTR) NULL },
96 { ASLFR_InitialFile , (IPTR) NULL },
97 { ASLFR_InitialPattern, (IPTR) NULL },
98 { ASLFR_TitleText , (IPTR) NULL },
99 { ASLFR_PositiveText , (IPTR) NULL },
100 { ASLFR_NegativeText , (IPTR) NULL },
101 { ASLFR_AcceptPattern , (IPTR) NULL },
102 { ASLFR_RejectPattern , (IPTR) NULL },
103 { ASLFR_DoSaveMode , FALSE },
104 { ASLFR_DoMultiSelect , FALSE },
105 { ASLFR_DrawersOnly , FALSE },
106 { ASLFR_RejectIcons , FALSE },
107 { ASLFR_PubScreenName , (IPTR) NULL },
108 { ASLFR_DoPatterns , FALSE },
109 { ASLFR_InitialShowVolumes, TRUE },
110 { TAG_DONE , (IPTR) NULL }
113 int __nocommandline;
115 static UBYTE *ParsePatternArg(IPTR **args, UWORD ArgNum);
117 int main(void)
119 struct RDArgs *rda;
120 struct FileRequester *FileReq;
121 struct WBArg *WBFiles;
122 IPTR *args[TOTAL_ARGS] = { NULL, NULL, NULL, NULL,
123 NULL, NULL, NULL, NULL,
124 NULL, NULL, NULL, NULL,
125 NULL, NULL };
126 int Return_Value = RETURN_OK;
127 char *Buffer;
128 BOOL Success;
129 int i;
131 Buffer = (char *)AllocVec(MAX_PATH_LEN, MEMF_ANY | MEMF_CLEAR);
132 if (Buffer != NULL)
134 rda = ReadArgs(ARG_TEMPLATE, (IPTR *)args, NULL);
135 if(rda != NULL)
137 FileTags[ARG_DRAWER].ti_Data = (IPTR)args[ARG_DRAWER];
138 FileTags[ARG_FILE].ti_Data = (IPTR)args[ARG_FILE];
139 FileTags[ARG_PATTERN].ti_Data = (IPTR)args[ARG_PATTERN];
140 FileTags[ARG_TITLE].ti_Data = (IPTR)args[ARG_TITLE];
141 FileTags[ARG_POSITIVE].ti_Data = (IPTR)args[ARG_POSITIVE];
142 FileTags[ARG_NEGATIVE].ti_Data = (IPTR)args[ARG_NEGATIVE];
143 ParsePatternArg(args, ARG_ACCEPTPAT);
144 ParsePatternArg(args, ARG_REJECTPAT);
145 FileTags[ARG_SAVEMODE].ti_Data = (IPTR)args[ARG_SAVEMODE];
146 FileTags[ARG_MULTISELECT].ti_Data = (IPTR)args[ARG_MULTISELECT];
147 FileTags[ARG_DRAWERSONLY].ti_Data = (IPTR)args[ARG_DRAWERSONLY];
148 FileTags[ARG_NOICONS].ti_Data = (IPTR)args[ARG_NOICONS];
149 FileTags[ARG_PUBSCREEN].ti_Data = (IPTR)args[ARG_PUBSCREEN];
150 FileTags[ARG_PUBSCREEN + 1].ti_Data = args[ARG_PATTERN] != NULL;
151 if (!args[ARG_INITIALVOLUMES])
153 FileTags[ARG_INITIALVOLUMES + 1].ti_Tag = TAG_IGNORE;
156 FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
157 FileTags);
158 if(FileReq != NULL)
160 Success = AslRequest(FileReq, NULL);
162 if(Success != FALSE)
164 if(!(IPTR)args[ARG_MULTISELECT])
166 strncpy(Buffer, FileReq->fr_Drawer, MAX_PATH_LEN);
168 /* FileReq->fr_File is NULL when using DRAWERSONLY */
169 Success = AddPart(Buffer,
170 FileReq->fr_File ? FileReq->fr_File : (STRPTR)"",
171 MAX_PATH_LEN);
173 if(Success != FALSE)
175 Printf("\"%s\"\n", Buffer);
178 else
180 WBFiles = FileReq->fr_ArgList;
182 for (i = 0; i != FileReq->fr_NumArgs; i++)
184 strncpy(Buffer, FileReq->fr_Drawer, MAX_PATH_LEN);
186 Success = AddPart(Buffer,
187 WBFiles[i].wa_Name,
188 MAX_PATH_LEN);
190 if(Success != FALSE)
192 Printf("\"%s\" ", Buffer);
196 PutStr("\n");
199 else
201 if (IoErr() == 0)
203 /* We cancelled it!!
205 Return_Value = RETURN_WARN;
207 SetIoErr(ERROR_BREAK);
209 else
211 PrintFault(IoErr(), NULL);
212 Return_Value = RETURN_FAIL;
216 FreeAslRequest((struct FileRequester *)FileReq);
218 else
220 PrintFault(IoErr(), "RequestFile");
221 Return_Value = RETURN_ERROR;
224 FreeArgs(rda);
226 else
228 PrintFault(IoErr(), "RequestFile");
229 Return_Value = RETURN_ERROR;
232 FreeVec((APTR)FileTags[ARG_ACCEPTPAT].ti_Data);
233 FreeVec((APTR)FileTags[ARG_REJECTPAT].ti_Data);
234 FreeVec(Buffer);
236 else
238 PrintFault(IoErr(), NULL);
239 Return_Value = RETURN_FAIL;
242 return Return_Value;
244 } /* main */
246 static UBYTE *ParsePatternArg(IPTR **args, UWORD ArgNum)
248 if (!args[ArgNum]) /* AROS crashes on strlen(NULL) */
250 FileTags[ArgNum].ti_Tag = TAG_IGNORE;
251 return NULL;
254 UBYTE *PatternBuffer = NULL;
255 LONG PatternBufferSize;
256 STRPTR pattern = (STRPTR)args[ArgNum];
258 PatternBufferSize = 2 * strlen((char *)pattern);
259 PatternBuffer = AllocVec(PatternBufferSize, MEMF_PUBLIC);
260 if (PatternBuffer != NULL)
262 if (ParsePatternNoCase((STRPTR)pattern,
263 PatternBuffer, PatternBufferSize) >= 0)
265 FileTags[ArgNum].ti_Data = (IPTR)PatternBuffer;
267 else
269 FreeVec(PatternBuffer);
270 PatternBuffer = NULL;
271 FileTags[ArgNum].ti_Tag = TAG_IGNORE;
275 return PatternBuffer;