-/* Write out the code to parse aux subcommand SBC. */
-static void
-dump_aux_subcommand (const subcommand *sbc)
-{
- if (sbc->type == SBC_PLAIN )
- {
- specifier *spec;
-
- for (spec = sbc->spec; spec; spec = spec->next)
- {
- char buf[80];
- sprintf(buf,"p->%s%s",st_lower(sbc->prefix),spec->varname);
-
- dump (0, "msg(MM,\"%s is %%s\",",sbc->name);
- dump (0, "(%s < 1000)?\"not set\":settings[%s - 1000]", buf, buf);
-
- dump (0, ");");
- }
- }
- else if (sbc->type == SBC_STRING)
- {
- dump (0, "msg(MM,\"%s is \\\"%%s\\\"\",p->s_%s);", sbc->name,st_lower(sbc->name) );
- }
- else if (sbc->type == SBC_INT)
- {
- dump (1, "{");
- dump (0, "int i;");
- dump (1, "for (i = 0; i < MAXLISTS; ++i)");
- dump (0, "msg(MM,\"%s is %%ld\",p->n_%s[i]);", sbc->name,st_lower(sbc->name) );
- outdent();
- dump (-1, "}");
- }
- else if (sbc->type == SBC_CUSTOM)
- {
- dump (0, "aux_%scustom_%s(p);",st_lower(prefix),make_identifier(sbc->name));
- }
- else
- assert(0);
-}
-
-
-
-/* Write out auxilliary parser. */
-static void
-dump_aux_parser (void)
-{
- int f=0;
- subcommand *sbc;
- aux_subcommand *asbc;
-
- /* Write out English strings for all the identifiers in the symbol table. */
- {
- int f, k;
- symbol *sym;
- char *buf = NULL;
-
- /* Note the squirmings necessary to make sure that the last string
- is not followed by a comma (is it necessary to do that ?? ) */
- for (sym = symtab, f = k = 0; sym; sym = sym->next)
- if (!sym->unique && !is_keyword (sym->name))
- {
- if (!f)
- {
- dump (0, "/* Strings for subcommand specifiers. */");
- dump (1, "static const char *settings[]=");
- dump (1, "{");
- f = 1;
- }
-
- if (buf == NULL)
- buf = xmalloc (1024);
- else
- dump (0, buf);
-
- sprintf (buf, "\"%s\",",sym->name);
- }
- if (buf)
- {
- buf[strlen (buf) - 1] = 0;
- dump (0, buf);
- free (buf);
- }
- if (f)
- {
- dump (-1, "};");
- dump (-1, nullstr);
- }
- }
-
-
- indent = 0;
-
- dump (0, "static int");
- dump (0, "aux_parse_%s (struct cmd_%s *p)", make_identifier (cmdname),
- make_identifier (cmdname));
- dump (1, "{");
-
- dump (1, "for (;;)");
- dump (1, "{");
-
-
- for (sbc = subcommands; sbc; sbc = sbc->next)
- {
- dump (1, "%sif (%s)", f ? "else " : "", make_match (sbc->name));
- f = 1;
- dump (1, "{");
-
- dump_aux_subcommand (sbc);
-
- dump (-1, "}");
- outdent ();
- }
-
- for (asbc = aux_subcommands ; asbc ; asbc = asbc->next)
- {
- dump (1, "%sif (%s)", f ? "else " : "", make_match (asbc->name));
- f = 1;
- dump (1, "{");
- dump(0,"aux_%s();",make_identifier(asbc->value));
- dump (-1, "}");
- outdent ();
- }
-
- dump (1, "if (!lex_match ('/'))");
- dump (0, "break;");
- dump (-2, "}");
- outdent ();
- dump (0, nullstr);
- dump (1, "if (token != '.')");
- dump (1, "{");
- dump (0, "lex_error (_(\"expecting end of command\"));");
- dump (0, "goto lossage;");
- dump (-1, "}");
- dump (0, nullstr);
- dump (-1, "return 1;");
- dump (0, nullstr);
- dump (-1, "lossage:");
- indent ();
- dump (0, "free_%s (p);", make_identifier (cmdname));
- dump (0, "return 0;");
- dump (-1, "} /* aux_parse_%s (struct cmd_%s *p) */",
- make_identifier (cmdname), make_identifier (cmdname));
- dump (0, nullstr);
-}
-
-