tr: clean up macrobody()
[neatroff.git] / roff.c
blob36dd06a6f48049e188befc0bdac4476bdf0cca17
1 /*
2 * neatroff troff clone
4 * Copyright (C) 2012-2014 Ali Gholami Rudi <ali at rudi dot ir>
6 * This program is released under the Modified BSD license.
7 */
8 #include <stdarg.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12 #include "roff.h"
14 void errmsg(char *fmt, ...)
16 va_list ap;
17 va_start(ap, fmt);
18 vfprintf(stderr, fmt, ap);
19 va_end(ap);
22 void errdie(char *msg)
24 fprintf(stderr, msg);
25 exit(1);
28 void *xmalloc(long len)
30 void *m = malloc(len);
31 if (!m)
32 errdie("neatroff: malloc() failed\n");
33 return m;
36 static char *usage =
37 "Usage: neatroff [options] input\n\n"
38 "Options:\n"
39 " -mx \tinclude macro x\n"
40 " -C \tenable compatibility mode\n"
41 " -Tdev \tset output device\n"
42 " -Fdir \tset font directory (" TROFFFDIR ")\n"
43 " -Mdir \tset macro directory (" TROFFMDIR ")\n";
45 int main(int argc, char **argv)
47 char fontdir[PATHLEN] = TROFFFDIR;
48 char macrodir[PATHLEN] = TROFFMDIR;
49 char dev[PATHLEN] = "utf";
50 char path[PATHLEN];
51 int i;
52 int ret;
53 for (i = 1; i < argc; i++) {
54 if (argv[i][0] != '-' || !argv[i][1])
55 break;
56 switch (argv[i][1]) {
57 case 'C':
58 n_cp = 1;
59 break;
60 case 'm':
61 sprintf(path, "%s/tmac.%s", macrodir, argv[i] + 2);
62 in_queue(path);
63 break;
64 case 'F':
65 strcpy(fontdir, argv[i][2] ? argv[i] + 2 : argv[++i]);
66 break;
67 case 'M':
68 strcpy(macrodir, argv[i][2] ? argv[i] + 2 : argv[++i]);
69 break;
70 case 'T':
71 strcpy(dev, argv[i][2] ? argv[i] + 2 : argv[++i]);
72 break;
73 default:
74 printf("%s", usage);
75 return 0;
78 if (dev_open(fontdir, dev)) {
79 fprintf(stderr, "neatroff: cannot open device %s\n", dev);
80 return 1;
82 hyph_init();
83 env_init();
84 tr_init();
85 if (i == argc)
86 in_queue(NULL); /* reading from standard input */
87 for (; i < argc; i++)
88 in_queue(!strcmp("-", argv[i]) ? NULL : argv[i]);
89 str_set(map(".P"), macrodir);
90 out("s%d\n", n_s);
91 out("f%d\n", n_f);
92 ret = render();
93 out("V%d\n", n_p);
94 env_done();
95 dev_close();
96 return ret;