2 Copyright © 2012, The AROS Development Team. All rights reserved.
6 #include <proto/exec.h>
15 #include <aros/debug.h>
19 #define ARG_TEMPLATE "FILENAME,PROFILE/K,NOGUI/S,ARGUMENTS/F"
31 static void clean_exit(struct Req
*req
, CONST_STRPTR s
)
33 LONG retval
= RETURN_OK
;
42 if (req
->rda
) FreeArgs(req
->rda
);
49 static struct Req
*alloc_req(void)
51 return AllocVec(sizeof (struct Req
), MEMF_ANY
| MEMF_CLEAR
);
54 static BOOL
handle_args(struct Req
*req
, int argc
, char **argv
)
58 IPTR args
[ARG_COUNT
] = {0};
60 req
->rda
= ReadArgs(ARG_TEMPLATE
, args
, NULL
);
63 PrintFault(IoErr(), argv
[0]);
67 req
->filename
= (STRPTR
)args
[ARG_FILENAME
];
68 req
->profile
= (STRPTR
)args
[ARG_PROFILE
];
69 req
->nogui
= args
[ARG_NOGUI
] ? TRUE
: FALSE
;
70 req
->arguments
= (STRPTR
)args
[ARG_ARGUMENTS
];
75 // FIXME: it should be possible to use R as default tool
81 static BOOL
get_template(struct Req
*req
)
86 BPTR output_fh
= NULL
;
88 TEXT out_file_name
[30];
89 TEXT in_file_name
[30];
96 if (req
->filename
== NULL
)
101 for (i
= 0; i
< 20 && output_fh
== NULL
; i
++)
103 sprintf(out_file_name
, "t:%08u.request.outfile", i
);
104 output_fh
= Open(out_file_name
, MODE_NEWFILE
);
106 if (output_fh
== NULL
)
111 for (i
= 0; i
< 20 && input_fh
== NULL
; i
++)
113 sprintf(in_file_name
, "t:%08u.request.infile", i
);
114 input_fh
= Open(in_file_name
, MODE_NEWFILE
);
116 if (input_fh
== NULL
)
121 input_fh
= Open(in_file_name
, MODE_OLDFILE
);
122 if (input_fh
== NULL
)
127 // append "*>NIL: ?" to the command
128 strlcpy(cmd
, req
->filename
, sizeof cmd
);
129 strlcat(cmd
, " *>NIL: ?", sizeof cmd
);
131 // shut up DOS error message
132 struct Process
*me
= (struct Process
*)FindTask(NULL
);
133 APTR oldwin
= me
->pr_WindowPtr
;
134 me
->pr_WindowPtr
= (APTR
)-1;
136 // Execute the command
137 cmd_res
= Execute(cmd
, input_fh
, output_fh
);
138 D(bug("[R] Execute() returned: %d\n", cmd_res
));
140 // restore window ptr
141 me
->pr_WindowPtr
= oldwin
;
143 // go to the beginning of the output file and read the template
144 Seek(output_fh
, 0, OFFSET_BEGINNING
);
145 if (FGets(output_fh
, req
->cmd_template
, sizeof req
->cmd_template
))
147 D(bug("[R] template read: %s\n", req
->cmd_template
));
155 DeleteFile(in_file_name
);
160 DeleteFile(out_file_name
);
167 static BOOL
parse_template(struct Req
*req
)
169 TEXT
*chr
= req
->cmd_template
;
172 if (req
->cmd_template
[0] == '\0')
175 while (req
->arg_cnt
< MAX_ARG_CNT
)
178 TEXT
*name_start
= chr
;
179 while (isalnum(*chr
) || *chr
== '=')
182 len
= chr
- name_start
;
186 if (len
>= MAX_NAME_CNT
- 1)
187 len
= MAX_NAME_CNT
- 1;
189 memcpy(req
->cargs
[req
->arg_cnt
].argname
, name_start
, len
);
197 req
->cargs
[req
->arg_cnt
].a_flag
= TRUE
;
201 req
->cargs
[req
->arg_cnt
].f_flag
= TRUE
;
205 req
->cargs
[req
->arg_cnt
].k_flag
= TRUE
;
209 req
->cargs
[req
->arg_cnt
].m_flag
= TRUE
;
213 req
->cargs
[req
->arg_cnt
].n_flag
= TRUE
;
217 req
->cargs
[req
->arg_cnt
].s_flag
= TRUE
;
234 static void execute_command(void)
240 int main(int argc
, char **argv
)
242 struct Req
*req
= alloc_req();
244 clean_exit(req
, "Can't allocate struct Req\n");
246 if (! handle_args(req
, argc
, argv
))
247 clean_exit(req
, "Failed to parse arguments\n");
249 if (! get_template(req
))
250 clean_exit(req
, "Failed to get template\n");
252 if (! parse_template(req
))
253 clean_exit(req
, "Failed to parse the template\n");
259 clean_exit(req
, NULL
);