Commit a85d5f9660294b4d9852a091da45db0617f5bc6a
1 parent
e812d17c
Exists in
master
and in
5 other branches
Trabalhando na inicializacao do interpretador rexx
Showing
2 changed files
with
98 additions
and
3 deletions
Show diff stats
src/plugins/rx3270/pluginmain.cc
@@ -25,6 +25,11 @@ | @@ -25,6 +25,11 @@ | ||
25 | * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | 25 | * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) |
26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
27 | * | 27 | * |
28 | + * Referencias: | ||
29 | + * | ||
30 | + * * http://www.oorexx.org/docs/rexxpg/x14097.htm | ||
31 | + * * http://www.oorexx.org/docs/rexxpg/c2539.htm | ||
32 | + * | ||
28 | */ | 33 | */ |
29 | 34 | ||
30 | #define ENABLE_NLS | 35 | #define ENABLE_NLS |
@@ -217,8 +222,96 @@ | @@ -217,8 +222,96 @@ | ||
217 | extern "C" | 222 | extern "C" |
218 | { | 223 | { |
219 | 224 | ||
220 | - static void call_rexx_script(const gchar *filename) | 225 | + static RXSTRING * build_args(const gchar **arg, size_t *argc) |
226 | + { | ||
227 | + size_t sz = g_strv_length((gchar **)arg); | ||
228 | + size_t szText = 0; | ||
229 | + gchar * ptr; | ||
230 | + int f; | ||
231 | + RXSTRING * rxArgs; | ||
232 | + | ||
233 | + for(f=0;f< (int) sz;f++) | ||
234 | + szText += strlen(arg[f])+1; | ||
235 | + | ||
236 | + *argc = sz; | ||
237 | + rxArgs = (RXSTRING *) g_malloc0((sizeof(RXSTRING) * (sz+1))+szText); | ||
238 | + ptr = (gchar *) &(rxArgs[sz+1]); | ||
239 | + | ||
240 | + for(f=0;f< (int) sz;f++) | ||
241 | + { | ||
242 | + strcpy(ptr,arg[f]); | ||
243 | + | ||
244 | + rxArgs[f].strptr = ptr; | ||
245 | + rxArgs[f].strlength = strlen(ptr); | ||
246 | + ptr += ((size_t) rxArgs[f].strlength+1); | ||
247 | + } | ||
248 | + | ||
249 | + return rxArgs; | ||
250 | + } | ||
251 | + | ||
252 | + static void call_rexx_script(GtkAction *action, GtkWidget *widget, const gchar *filename) | ||
221 | { | 253 | { |
254 | + gchar * args = (gchar *) g_object_get_data(G_OBJECT(action),"args"); | ||
255 | + | ||
256 | + RXSTRING * rxArgs; | ||
257 | + int ret; | ||
258 | + short rc; | ||
259 | + size_t argc = 0; | ||
260 | + RXSTRING retstr; | ||
261 | + unsigned char userArea[10]; | ||
262 | + | ||
263 | + if(args) | ||
264 | + { | ||
265 | + gchar ** arg = g_strsplit(args,",",-1); | ||
266 | + rxArgs = build_args((const gchar **)arg,&argc); | ||
267 | + g_strfreev(arg); | ||
268 | + } | ||
269 | + else | ||
270 | + { | ||
271 | + static const gchar *arg[] = { "", NULL }; | ||
272 | + rxArgs = build_args(arg,&argc); | ||
273 | + } | ||
274 | + | ||
275 | + // set up default return | ||
276 | + memset(&retstr,0,sizeof(retstr)); | ||
277 | + | ||
278 | + memset(userArea,' ',10); | ||
279 | + userArea[9] = 0; | ||
280 | + | ||
281 | + ret = RexxStart( argc, // argument count | ||
282 | + (PCONSTRXSTRING) rxArgs, // argument array | ||
283 | + (char *) filename, // REXX procedure name | ||
284 | + (PRXSTRING) 0, // no instore used | ||
285 | + PACKAGE_NAME, // default address name | ||
286 | + RXCOMMAND, // calling as a subcommand | ||
287 | + NULL, // EXITs for this call | ||
288 | + &rc, // converted return code | ||
289 | + &retstr); // returned result | ||
290 | + | ||
291 | + if(ret) | ||
292 | + { | ||
293 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
294 | + GTK_DIALOG_DESTROY_WITH_PARENT, | ||
295 | + GTK_MESSAGE_ERROR, | ||
296 | + GTK_BUTTONS_CANCEL, | ||
297 | + "%s", _( "Can't start script" )); | ||
298 | + | ||
299 | + gtk_window_set_title(GTK_WINDOW(dialog),_( "Startup error" )); | ||
300 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_("Error %d starting rexx script"),ret); | ||
301 | + | ||
302 | + gtk_dialog_run(GTK_DIALOG (dialog)); | ||
303 | + gtk_widget_destroy(dialog); | ||
304 | + | ||
305 | + } | ||
306 | + else | ||
307 | + { | ||
308 | + RexxWaitForTermination(); | ||
309 | + } | ||
310 | + | ||
311 | + if(RXSTRPTR(retstr)) | ||
312 | + RexxFreeMemory(RXSTRPTR(retstr)); | ||
313 | + | ||
314 | + g_free(rxArgs); | ||
222 | 315 | ||
223 | } | 316 | } |
224 | 317 | ||
@@ -249,7 +342,7 @@ extern "C" | @@ -249,7 +342,7 @@ extern "C" | ||
249 | if(filename) | 342 | if(filename) |
250 | { | 343 | { |
251 | // Has filename, call it directly | 344 | // Has filename, call it directly |
252 | - call_rexx_script(filename); | 345 | + call_rexx_script(action,widget,filename); |
253 | } | 346 | } |
254 | else | 347 | else |
255 | { | 348 | { |
@@ -280,7 +373,7 @@ extern "C" | @@ -280,7 +373,7 @@ extern "C" | ||
280 | 373 | ||
281 | if(filename) | 374 | if(filename) |
282 | { | 375 | { |
283 | - call_rexx_script(filename); | 376 | + call_rexx_script(action,widget,filename); |
284 | g_free(filename); | 377 | g_free(filename); |
285 | } | 378 | } |
286 | 379 |
src/plugins/rx3270/rxapimain.cc