use m4_normalize on the output strings to remove trailing spaces/tabs and consolidate...
[AROS.git] / workbench / c / RequestChoice.c
blob951ac8ff6fcd6b0eaf1732ddbc6ee7e836d0c259
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: RequestChoice CLI command
6 Lang: English
7 */
9 /*****************************************************************************
11 NAME
13 RequestChoice
15 SYNOPSIS
17 TITLE/A,BODY/A,GADGETS/A/M,PUBSCREEN/K
19 LOCATION
23 FUNCTION
25 Allows AmigaDOS scripts to have access to the EasyRequest() function
26 for input.
28 INPUTS
30 TITLE - The text to display in the title bar of the requester.
32 BODY - The text to display in the body of the requester.
34 GADGETS - The text for each of the buttons.
36 PUBSCREEN - The name of the public screen to open the requester
37 upon.
39 RESULT
41 Standard DOS return codes.
43 NOTES
45 To place a newline into the body of the requester use *n or *N.
47 To place a quotation mark in the body of the requester use *".
49 The CLI template gives the GADGETS option as ALWAYS given; this
50 is different from the original program. This way, we do not have
51 to check to see if the gadgets have been given.
53 EXAMPLE
55 RequestChoice "This is a title" "This is*Na body" Okay|Cancel
57 This is self-explanitory, except for the "*N". This is the
58 equivalent of using a '\n' in C to get a newline in the body
59 of the requester. This requester will open on the Workbench
60 screen.
62 RequestChoice Title="This is a title" Body="This is*Na body"
63 Gadgets=Okay|Cancel PubScreen=DOPUS.1
65 This will do exactly the same as before except that it will
66 open on the Directory Opus public screen.
68 BUGS
70 SEE ALSO
72 intuition.library/EasyRequestArgs()
74 INTERNALS
76 HISTORY
78 ******************************************************************************/
80 #include <proto/dos.h>
81 #include <proto/exec.h>
82 #include <proto/intuition.h>
84 #include <dos/dos.h>
85 #include <dos/rdargs.h>
86 #include <exec/libraries.h>
87 #include <exec/memory.h>
88 #include <exec/types.h>
89 #include <intuition/intuition.h>
90 #include <intuition/screens.h>
92 #include <string.h>
94 #define ARG_TEMPLATE "TITLE/A,BODY/A,GADGETS/A/M,PUBSCREEN/K"
95 #define ARG_TITLE 0
96 #define ARG_BODY 1
97 #define ARG_GADGETS 2
98 #define ARG_PUBSCREEN 3
99 #define TOTAL_ARGS 4
101 const TEXT version[] = "$VER: RequestChoice 41.3 (3.4.2014)\n";
103 static char ERROR_HEADER[] = "RequestChoice";
105 static int Do_RequestChoice(STRPTR, STRPTR, STRPTR *, STRPTR);
106 static STRPTR FilterBodyText(STRPTR Body);
107 static STRPTR ComposeGadgetText(STRPTR * Gadgets);
109 int __nocommandline;
111 int main(void)
113 struct RDArgs * rda;
114 IPTR * args[TOTAL_ARGS] = { NULL, NULL, NULL, NULL };
115 int Return_Value;
117 Return_Value = RETURN_OK;
119 rda = ReadArgs(ARG_TEMPLATE, (IPTR *)args, NULL);
120 if (rda)
122 Return_Value = Do_RequestChoice((STRPTR)args[ARG_TITLE],
123 (STRPTR)args[ARG_BODY],
124 (STRPTR *)args[ARG_GADGETS],
125 (STRPTR)args[ARG_PUBSCREEN]);
126 FreeArgs(rda);
128 else
130 PrintFault(IoErr(), ERROR_HEADER);
131 Return_Value = RETURN_FAIL;
134 return (Return_Value);
135 } /* main */
138 STRPTR ComposeGadgetText(STRPTR *);
140 int Do_RequestChoice(STRPTR Title,
141 STRPTR Body,
142 STRPTR * Gadgets,
143 STRPTR PubScreen)
145 struct Screen * Scr;
146 struct EasyStruct ChoiceES;
147 STRPTR GadgetText;
148 STRPTR BodyText;
149 LONG Result;
150 int Return_Value;
152 Return_Value = RETURN_OK;
153 Result = 0L;
155 GadgetText = ComposeGadgetText(Gadgets);
156 if (!GadgetText)
157 return RETURN_FAIL;
159 BodyText = FilterBodyText(Body);
160 if (!BodyText)
161 return RETURN_FAIL;
163 /* Make sure we can open the requester on the specified screen.
165 * If the PubScreen argument is not specified it will contain
166 * NULL, and hence open on the Workbench screen.
168 Scr = (struct Screen *)LockPubScreen((UBYTE *)PubScreen);
169 if (Scr != NULL)
171 ChoiceES.es_StructSize = sizeof(struct EasyStruct);
172 ChoiceES.es_Flags = 0L;
173 ChoiceES.es_Title = Title;
174 ChoiceES.es_TextFormat = BodyText;
175 ChoiceES.es_GadgetFormat = GadgetText;
177 /* Open the requester.
179 Result = EasyRequestArgs(Scr->FirstWindow, &ChoiceES, NULL, NULL);
180 if (Result != -1)
182 Printf("%ld\n", Result);
184 else
186 Return_Value = RETURN_FAIL;
187 PrintFault(ERROR_NO_FREE_STORE, ERROR_HEADER);
189 UnlockPubScreen(NULL, Scr);
191 else
193 Return_Value = RETURN_FAIL;
194 PrintFault(ERROR_NO_FREE_STORE, ERROR_HEADER);
197 FreeVec(GadgetText);
198 FreeVec(BodyText);
200 return Return_Value;
202 } /* Do_RequestChoice */
205 // Combine gadget strings and separate them by "|".
206 // Replace all "%" by "%%" because EasyRequest
207 // uses printf-like formatting.
208 static STRPTR ComposeGadgetText(STRPTR * Gadgets)
210 STRPTR GadgetText, BufferPos;
211 int GadgetLength = 0;
212 int CurrentGadget;
213 int PercentCnt = 0;
214 int StrLen;
215 int i;
217 for (CurrentGadget = 0; Gadgets[CurrentGadget]; CurrentGadget++)
219 StrLen = strlen(Gadgets[CurrentGadget]);
220 GadgetLength += StrLen + 1;
222 // Count "%"
223 for (i = 0; i < StrLen; i++)
225 if (Gadgets[CurrentGadget][i] == '%')
227 PercentCnt++;
232 GadgetLength += PercentCnt;
234 GadgetText = AllocVec(GadgetLength, MEMF_ANY);
235 if (!GadgetText)
237 PrintFault(ERROR_NO_FREE_STORE, ERROR_HEADER);
238 return NULL;
241 BufferPos = GadgetText;
242 for (CurrentGadget = 0; Gadgets[CurrentGadget]; CurrentGadget++)
244 int LabelLength = strlen(Gadgets[CurrentGadget]);
246 for (i = 0; i < LabelLength; i++)
248 if (Gadgets[CurrentGadget][i] == '%')
250 *BufferPos = '%';
251 BufferPos++;
252 *BufferPos = '%';
253 BufferPos++;
255 else
257 *BufferPos = Gadgets[CurrentGadget][i];
258 BufferPos++;
261 if (Gadgets[CurrentGadget + 1])
263 *BufferPos = '|';
264 BufferPos++;
266 else
267 *BufferPos = '\0';
270 return GadgetText;
272 } /* ComposeGadgetText */
275 // Replace % by %% because EasyRequest uses
276 // printf-like formatting characters.
277 // Result string must be freed with FreeVec().
278 static STRPTR FilterBodyText(STRPTR Body)
280 STRPTR GadgetText;
281 int GadgetLength = 0;
282 int StrLen;
283 int PercentCnt = 0;
284 int i, j;
286 if (!Body)
287 return NULL;
289 // Count % characters
290 StrLen = strlen(Body);
291 for (i = 0; i < StrLen; i++)
293 if (Body[i] == '%')
295 PercentCnt++;
299 GadgetLength = StrLen + PercentCnt + 1;
301 GadgetText = AllocVec(GadgetLength, MEMF_ANY);
302 if (!GadgetText)
304 PrintFault(IoErr(), ERROR_HEADER);
305 return NULL;
308 for (i = 0, j = 0; i < StrLen; i++)
310 if (Body[i] == '%')
312 GadgetText[j++] = '%';
313 GadgetText[j++] = '%';
315 else
317 GadgetText[j++] = Body[i];
321 GadgetText[j] = '\0';
323 return GadgetText;
325 } /* FilterBodyText */