-/*
-One possible way of parsing options.
-
-enum
-{
- OPTION_CSM,
- OPTION_CIS,
- ...
-};
-
-struct
-{
- const char *pattern;
- int opt;
- const char *description;
-} options;
-
-static struct options extension_opts[] =
-{
- { "Ncsm", OPTION_CSM,
- "allow (disallow) CSM instruction" },
- { "Ncis", OPTION_CIS,
- "allow (disallow) commersial instruction set" },
- { "Neis", OPTION_EIS,
- "allow (disallow) extended instruction set" },
- ...
- { "all-extensions", OPTION_ALL_EXTENSIONS,
- "allow all instruction set extensions\n\
- (this is the default)" },
- { "no-extensions", OPTION_NO_EXTENSIONS,
- "disallow all instruction set extensions" },
- { "pic", OPTION_PIC,
- "position-independent code" },
-};
-
-static struct options cpu_opts[] =
-{
- { "Ka_11_*", OPTION_KA11, "KA11 CPU. ..." },
- { "Kb_11_*", OPTION_KB11, "KB11 CPU. ..." },
- { "Kd_11_a*", OPTION_KD11A, "KD11-A CPU. ..." },
- { "Kd_11_b*", OPTION_KD11B, "KD11-B CPU. ..." },
- { "Kd_11_d*", OPTION_KD11D, "KD11-D CPU. ..." },
- { "Kd_11_e*", OPTION_KD11E, "KD11-E CPU. ..." },
- { "Kd_11_f*", OPTION_KD11F, "KD11-F CPU. ..." },
- { "Kd_11_h*", OPTION_KD11H, "KD11-H CPU. ..." },
- { "Kd_11_q*", OPTION_KD11Q, "KD11-Q CPU. ..." },
- { "Kd_11_z*", OPTION_KD11Z, "KD11-Z CPU. ..." },
- { "Df_11_*", OPTION_F11, "F11 CPU. ..." },
- { "Dj_11_*", OPTION_J11, "J11 CPU. ..." },
- { "Dt_11_*", OPTION_T11, "T11 CPU. ..." },
-};
-
-static struct options model_opts[] =
-{
- { "P03", OPTION_PDP11_03, "same as ..." },
- { "P04", OPTION_PDP11_04, "same as ..." },
- { "P05", OPTION_PDP11_05, "same as ..." },
- { "P10", OPTION_PDP11_10, "same as ..." },
- { "P15", OPTION_PDP11_15, "same as ..." },
- { "P20", OPTION_PDP11_20, "same as ..." },
- { "P21", OPTION_PDP11_21, "same as ..." },
- { "P24", OPTION_PDP11_24, "same as ..." },
- { "P34", OPTION_PDP11_34, "same as ..." },
- { "P34a", OPTION_PDP11_34A, "same as ..." },
- { "P40", OPTION_PDP11_40, "same as ..." },
- { "P44", OPTION_PDP11_44, "same as ..." },
- { "P45", OPTION_PDP11_45, "same as ..." },
- { "P50", OPTION_PDP11_50, "same as ..." },
- { "P53", OPTION_PDP11_53, "same as ..." },
- { "P55", OPTION_PDP11_55, "same as ..." },
- { "P60", OPTION_PDP11_60, "same as ..." },
- { "P70", OPTION_PDP11_70, "same as ..." },
- { "P73", OPTION_PDP11_73, "same as ..." },
- { "P83", OPTION_PDP11_83, "same as ..." },
- { "P84", OPTION_PDP11_84, "same as ..." },
- { "P93", OPTION_PDP11_93, "same as ..." },
- { "P94", OPTION_PDP11_94, "same as ..." },
-};
-
-struct
-{
- const char *title;
- struct options *opts;
- int num;
-} all_opts[] =
-{
- { "PDP-11 instruction set extentions",
- extension_opts,
- sizeof extension_opts / sizeof extension_opts[0] },
- { "PDP-11 CPU model options",
- cpu_opts,
- sizeof cpu_opts / sizeof cpu_opts[0] },
- { "PDP-11 machine model options",
- model_opts,
- sizeof model_opts / sizeof model_opts[0] },
-};
-
-int
-parse_match (char *arg, char *pattern)
-{
- int yes = 1;
-
- while (*pattern)
- {
- switch (*pattern++)
- {
- case 'N':
- if (strncmp (arg, "no-") == 0)
- {
- yes = 0;
- arg += 3;
- }
- break;
-
- case 'K':
- if (arg[0] == 'k')
- arg++;
- break;
-
- case 'D':
- if (strncmp (arg, "kd", 2) == 0)
- arg +=2;
- break;
-
- case 'P':
- if (strncmp (arg, "pdp-11/", 7) == 0)
- arg += 7;
- else if (strncmp (arg, "pdp11/", 6) == 0)
- arg += 6;
- else if (strncmp (arg, "11/", 3) == 0)
- arg += 3;
- break;
-
- case '_':
- if (arg[0] == "-")
- {
- if (*++arg == 0)
- return 0;
- }
- break;
-
- case '*':
- return 1;
-
- default:
- if (*arg++ != pattern[-1])
- return 0;
- }
- }
-
- return arg[0] == 0;
-}
-
-int
-fprint_opt (stream, pattern)
- FILE *stream;
- const char *pattern;
-{
- int n;
-
- while (*pattern)
- {
- switch (*pattern++)
- {
- case 'N':
- n += fprintf (stream, "(no-)");
- break;
-
- case 'K':
- n += fprintf (stream, "k");
- break;
-
- case 'P':
- n += fprintf (stream "11/");
- break;
-
- case 'D':
- case '_':
- case '*':
- break;
-
- default:
- fputc (pattern[-1], stream);
- n++;
- }
- }
-
- return n;
-}
-
-int
-parse_option (char *arg)
-{
- int i, j;
-
- for (i = 0; i < sizeof all_opts / sizeof all_opts[0]; i++)
- {
- for (j = 0; j < all_opts[i].num; j++)
- {
- if (parse_match (arg, all_opts[i].opts[j].pattern))
- {
- set_option (all_opts[i].opts[j].opt);
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-static void
-fprint_space (stream, n)
- FILE *stream;
- int n;
-{
- while (n--)
- fputc (' ', stream);
-}
-