ref: ae93e5a896bb530f4b4d18dba1ebb53cb8bb640b
dir: /roff.c/
/* * neatroff troff clone * * Copyright (C) 2012-2014 Ali Gholami Rudi <ali at rudi dot ir> * * This program is released under the Modified BSD license. */ #include <stdarg.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include "roff.h" void errmsg(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } void errdie(char *msg) { fprintf(stderr, msg); exit(1); } void *xmalloc(long len) { void *m = malloc(len); if (!m) errdie("neatroff: malloc() failed\n"); return m; } static int xopens(char *path) { FILE *filp = fopen(path, "r"); if (filp) fclose(filp); return filp != NULL; } static char *usage = "Usage: neatroff [options] input\n\n" "Options:\n" " -mx \tinclude macro x\n" " -C \tenable compatibility mode\n" " -Tdev \tset output device\n" " -Fdir \tset font directory (" TROFFFDIR ")\n" " -Mdir \tset macro directory (" TROFFMDIR ")\n"; int main(int argc, char **argv) { char fontdir[PATHLEN] = TROFFFDIR; char macrodir[PATHLEN] = TROFFMDIR; char dev[PATHLEN] = "utf"; char path[PATHLEN]; int i; int ret; for (i = 1; i < argc; i++) { if (argv[i][0] != '-' || !argv[i][1]) break; switch (argv[i][1]) { case 'C': n_cp = 1; break; case 'm': sprintf(path, "%s/%s.tmac", macrodir, argv[i] + 2); if (!xopens(path)) sprintf(path, "%s/tmac.%s", macrodir, argv[i] + 2); in_queue(path); break; case 'F': strcpy(fontdir, argv[i][2] ? argv[i] + 2 : argv[++i]); break; case 'M': strcpy(macrodir, argv[i][2] ? argv[i] + 2 : argv[++i]); break; case 'T': strcpy(dev, argv[i][2] ? argv[i] + 2 : argv[++i]); break; default: printf("%s", usage); return 0; } } if (dev_open(fontdir, dev)) { fprintf(stderr, "neatroff: cannot open device %s\n", dev); return 1; } hyph_init(); env_init(); tr_init(); if (i == argc) in_queue(NULL); /* reading from standard input */ for (; i < argc; i++) in_queue(!strcmp("-", argv[i]) ? NULL : argv[i]); str_set(map(".P"), macrodir); out("s%d\n", n_s); out("f%d\n", n_f); ret = render(); out("V%d\n", n_p); env_done(); dev_close(); return ret; }