void do_gfont() { int t = get_token(2); if (t != TEXT && t != QUOTED_TEXT) { lex_error("bad argument to gfont command"); return; } token_buffer += '\0'; set_gfont(token_buffer.contents()); }
int main(int argc, char **argv) { program_name = argv[0]; static char stderr_buf[BUFSIZ]; setbuf(stderr, stderr_buf); int opt; int load_startup_file = 1; static const struct option long_options[] = { { "help", no_argument, 0, CHAR_MAX + 1 }, { "version", no_argument, 0, 'v' }, { NULL, 0, 0, 0 } }; while ((opt = getopt_long(argc, argv, "DCRvd:f:p:s:m:T:M:rN", long_options, NULL)) != EOF) switch (opt) { case 'C': compatible_flag = 1; break; case 'R': // don't load eqnrc load_startup_file = 0; break; case 'M': config_macro_path.command_line_dir(optarg); break; case 'v': printf("GNU eqn (groff) version %s\n", Version_string); exit(0); break; case 'd': if (optarg[0] == '\0' || optarg[1] == '\0') error("-d requires two character argument"); else if (invalid_input_char(optarg[0])) error("bad delimiter `%1'", optarg[0]); else if (invalid_input_char(optarg[1])) error("bad delimiter `%1'", optarg[1]); else { start_delim = optarg[0]; end_delim = optarg[1]; } break; case 'f': set_gfont(optarg); break; case 'T': device = optarg; if (strcmp(device, "ps:html") == 0) { device = "ps"; html = 1; } else if (strcmp(device, "MathML") == 0) { output_format = mathml; load_startup_file = 0; } else if (strcmp(device, "mathml:xhtml") == 0) { device = "MathML"; output_format = mathml; load_startup_file = 0; xhtml = 1; } break; case 's': if (!set_gsize(optarg)) error("invalid size `%1'", optarg); break; case 'p': { int n; if (sscanf(optarg, "%d", &n) == 1) set_script_reduction(n); else error("bad size `%1'", optarg); } break; case 'm': { int n; if (sscanf(optarg, "%d", &n) == 1) set_minimum_size(n); else error("bad size `%1'", optarg); } break; case 'r': one_size_reduction_flag = 1; break; case 'D': warning("-D option is obsolete: use `set draw_lines 1' instead"); draw_flag = 1; break; case 'N': no_newline_in_delim_flag = 1; break; case CHAR_MAX + 1: // --help usage(stdout); exit(0); break; case '?': usage(stderr); exit(1); break; default: assert(0); } init_table(device); init_char_table(); if (output_format == troff) { printf(".if !'\\*(.T'%s' " ".if !'\\*(.T'html' " // the html device uses `-Tps' to render // equations as images ".tm warning: %s should have been given a `-T\\*(.T' option\n", device, program_name); printf(".if '\\*(.T'html' " ".if !'%s'ps' " ".tm warning: %s should have been given a `-Tps' option\n", device, program_name); printf(".if '\\*(.T'html' " ".if !'%s'ps' " ".tm warning: (it is advisable to invoke groff via: groff -Thtml -e)\n", device); } if (load_startup_file) { char *path; FILE *fp = config_macro_path.open_file(STARTUP_FILE, &path); if (fp) { do_file(fp, path); fclose(fp); a_delete path; } } if (optind >= argc) do_file(stdin, "-"); else for (int i = optind; i < argc; i++) if (strcmp(argv[i], "-") == 0) do_file(stdin, "-"); else { errno = 0; FILE *fp = fopen(argv[i], "r"); if (!fp) fatal("can't open `%1': %2", argv[i], strerror(errno)); else { do_file(fp, argv[i]); fclose(fp); } } if (ferror(stdout) || fflush(stdout) < 0) fatal("output error"); return 0; }