15 #include <grass/config.h>
23 #include <sys/types.h>
25 #if defined(HAVE_LANGINFO_H)
28 #if defined(__MINGW32__) && defined(USE_NLS)
29 #include <localcharset.h>
35 #include <grass/gis.h>
36 #include <grass/glocale.h>
37 #include <grass/spawn.h>
39 #include "parser_local_proto.h"
42 static const char *src_enc;
51 static void print_escaped_for_xml(FILE *fp,
const char *str)
54 iconv_t conv = iconv_open(
"UTF-8", src_enc);
57 if (conv != (iconv_t)-1) {
58 char *src = (
char *)str;
59 size_t srclen = strlen(src);
60 size_t dstlen = srclen * 4 + 1;
61 char *dst = G_alloca(dstlen);
66 ret = iconv(conv, (
char **)&src, &srclen, &dst, &dstlen);
67 if (ret != (
size_t)-1 && srclen == 0) {
95 if (conv != (iconv_t)-1)
110 const char *encoding =
NULL;
119 #if defined(HAVE_LANGINFO_H)
120 encoding = nl_langinfo(CODESET);
121 #elif defined(_WIN32) && defined(USE_NLS)
122 encoding = locale_charset();
125 if (!encoding || strlen(encoding) == 0)
138 fprintf(stdout,
"<?xml version=\"1.0\" encoding=\"%s\"?>\n", encoding);
139 fprintf(stdout,
"<!DOCTYPE task SYSTEM \"grass-interface.dtd\">\n");
141 fprintf(stdout,
"<task name=\"%s\">\n",
st->pgm_name);
143 if (
st->module_info.label) {
144 fprintf(stdout,
"\t<label>\n\t\t");
145 print_escaped_for_xml(stdout,
st->module_info.label);
146 fprintf(stdout,
"\n\t</label>\n");
149 if (
st->module_info.description) {
150 fprintf(stdout,
"\t<description>\n\t\t");
151 print_escaped_for_xml(stdout,
st->module_info.description);
152 fprintf(stdout,
"\n\t</description>\n");
155 if (
st->module_info.keywords) {
156 fprintf(stdout,
"\t<keywords>\n\t\t");
158 fprintf(stdout,
"\n\t</keywords>\n");
171 opt = &
st->first_option;
172 while (opt !=
NULL) {
193 "multiple=\"%s\">\n",
194 opt->key, type, opt->required == YES ?
"yes" :
"no",
195 opt->multiple == YES ?
"yes" :
"no");
198 fprintf(stdout,
"\t\t<label>\n\t\t\t");
199 print_escaped_for_xml(stdout, opt->label);
200 fprintf(stdout,
"\n\t\t</label>\n");
203 if (opt->description) {
204 fprintf(stdout,
"\t\t<description>\n\t\t\t");
205 print_escaped_for_xml(stdout, opt->description);
206 fprintf(stdout,
"\n\t\t</description>\n");
210 fprintf(stdout,
"\t\t<keydesc>\n");
211 top = G_calloc(strlen(opt->key_desc) + 1, 1);
212 strcpy(top, opt->key_desc);
213 s = strtok(top,
",");
214 for (i = 1; s !=
NULL; i++) {
215 fprintf(stdout,
"\t\t\t<item order=\"%d\">", i);
216 print_escaped_for_xml(stdout, s);
217 fprintf(stdout,
"</item>\n");
218 s = strtok(
NULL,
",");
220 fprintf(stdout,
"\t\t</keydesc>\n");
224 if (opt->gisprompt) {
225 const char *atts[] = {
"age",
"element",
"prompt",
NULL};
226 top = G_calloc(strlen(opt->gisprompt) + 1, 1);
227 strcpy(top, opt->gisprompt);
228 s = strtok(top,
",");
229 fprintf(stdout,
"\t\t<gisprompt ");
230 for (i = 0; s !=
NULL && atts[i] !=
NULL; i++) {
231 fprintf(stdout,
"%s=\"%s\" ", atts[i], s);
232 s = strtok(
NULL,
",");
234 fprintf(stdout,
"/>\n");
239 fprintf(stdout,
"\t\t<default>\n\t\t\t");
240 print_escaped_for_xml(stdout, opt->def);
241 fprintf(stdout,
"\n\t\t</default>\n");
250 fprintf(stdout,
"\t\t<values>\n");
251 while (opt->opts[i]) {
252 fprintf(stdout,
"\t\t\t<value>\n");
253 fprintf(stdout,
"\t\t\t\t<name>");
254 print_escaped_for_xml(stdout, opt->opts[i]);
255 fprintf(stdout,
"</name>\n");
256 if (opt->descs && opt->opts[i] && opt->descs[i]) {
257 fprintf(stdout,
"\t\t\t\t<description>");
258 print_escaped_for_xml(stdout, opt->descs[i]);
259 fprintf(stdout,
"</description>\n");
261 fprintf(stdout,
"\t\t\t</value>\n");
264 fprintf(stdout,
"\t\t</values>\n");
266 if (opt->guisection) {
267 fprintf(stdout,
"\t\t<guisection>\n\t\t\t");
268 print_escaped_for_xml(stdout, opt->guisection);
269 fprintf(stdout,
"\n\t\t</guisection>\n");
271 if (opt->guidependency) {
272 fprintf(stdout,
"\t\t<guidependency>\n\t\t\t");
273 print_escaped_for_xml(stdout, opt->guidependency);
274 fprintf(stdout,
"\n\t\t</guidependency>\n");
282 fprintf(stdout,
"\t</parameter>\n");
287 flag = &
st->first_flag;
288 while (flag !=
NULL) {
289 fprintf(stdout,
"\t<flag name=\"%c\">\n", flag->key);
292 fprintf(stdout,
"\t\t<label>\n\t\t\t");
293 print_escaped_for_xml(stdout, flag->label);
294 fprintf(stdout,
"\n\t\t</label>\n");
297 if (flag->suppress_required)
298 fprintf(stdout,
"\t\t<suppress_required/>\n");
300 if (flag->description) {
301 fprintf(stdout,
"\t\t<description>\n\t\t\t");
302 print_escaped_for_xml(stdout, flag->description);
303 fprintf(stdout,
"\n\t\t</description>\n");
305 if (flag->guisection) {
306 fprintf(stdout,
" \t\t<guisection>\n\t\t\t");
307 print_escaped_for_xml(stdout, flag->guisection);
308 fprintf(stdout,
"\n\t\t</guisection>\n");
310 flag = flag->next_flag;
311 fprintf(stdout,
"\t</flag>\n");
326 fprintf(stdout,
"\t<flag name=\"%s\">\n",
"overwrite");
327 fprintf(stdout,
"\t\t<description>\n\t\t\t");
328 print_escaped_for_xml(
329 stdout, _(
"Allow output files to overwrite existing files"));
330 fprintf(stdout,
"\n\t\t</description>\n");
331 fprintf(stdout,
"\t</flag>\n");
335 fprintf(stdout,
"\t<flag name=\"%s\">\n",
"help");
336 fprintf(stdout,
"\t\t<description>\n\t\t\t");
337 print_escaped_for_xml(stdout, _(
"Print usage summary"));
338 fprintf(stdout,
"\n\t\t</description>\n");
339 fprintf(stdout,
"\t</flag>\n");
342 fprintf(stdout,
"\t<flag name=\"%s\">\n",
"verbose");
343 fprintf(stdout,
"\t\t<description>\n\t\t\t");
344 print_escaped_for_xml(stdout, _(
"Verbose module output"));
345 fprintf(stdout,
"\n\t\t</description>\n");
346 fprintf(stdout,
"\t</flag>\n");
349 fprintf(stdout,
"\t<flag name=\"%s\">\n",
"quiet");
350 fprintf(stdout,
"\t\t<description>\n\t\t\t");
351 print_escaped_for_xml(stdout, _(
"Quiet module output"));
352 fprintf(stdout,
"\n\t\t</description>\n");
353 fprintf(stdout,
"\t</flag>\n");
357 fprintf(stdout,
"</task>\n");
void G_free(void *buf)
Free allocated memory.
void G__print_keywords(FILE *fd, void(*format)(FILE *, const char *), int newline)
Print list of keywords (internal use only)
int G__uses_new_gisprompt(void)
void G__describe_option_rules_xml(FILE *fp)
Describe option rules in XML format (internal use only)
void G__usage_xml(void)
Print module usage description in XML format.
const char * G_program_name(void)
Return module name.