hyph: handle special characters
[neatroff.git] / roff.c
blob79a204b571b4657323c35a14f03055dc1aaad665
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 *mextend(void *old, long oldsz, long newsz, int memsz)
30 void *new = xmalloc(newsz * memsz);
31 memcpy(new, old, oldsz * memsz);
32 memset(new + oldsz * memsz, 0, (newsz - oldsz) * memsz);
33 free(old);
34 return new;
37 void *xmalloc(long len)
39 void *m = malloc(len);
40 if (!m)
41 errdie("neatroff: malloc() failed\n");
42 return m;
45 static int xopens(char *path)
47 FILE *filp = fopen(path, "r");
48 if (filp)
49 fclose(filp);
50 return filp != NULL;
53 static char *usage =
54 "Usage: neatroff [options] input\n\n"
55 "Options:\n"
56 " -mx \tinclude macro x\n"
57 " -C \tenable compatibility mode\n"
58 " -Tdev \tset output device\n"
59 " -Fdir \tset font directory (" TROFFFDIR ")\n"
60 " -Mdir \tset macro directory (" TROFFMDIR ")\n";
62 int main(int argc, char **argv)
64 char path[PATHLEN];
65 char *fontdir = TROFFFDIR;
66 char *macrodir = TROFFMDIR;
67 char *dev = "utf";
68 int i;
69 int ret;
70 for (i = 1; i < argc; i++) {
71 if (argv[i][0] != '-' || !argv[i][1])
72 break;
73 switch (argv[i][1]) {
74 case 'C':
75 n_cp = 1;
76 break;
77 case 'm':
78 snprintf(path, sizeof(path), "%s/%s.tmac",
79 macrodir, argv[i] + 2);
80 if (!xopens(path))
81 snprintf(path, sizeof(path), "%s/tmac.%s",
82 macrodir, argv[i] + 2);
83 if (!xopens(path))
84 snprintf(path, sizeof(path), "%s/%s",
85 macrodir, argv[i] + 2);
86 in_queue(path);
87 break;
88 case 'F':
89 fontdir = argv[i][2] ? argv[i] + 2 : argv[++i];
90 break;
91 case 'M':
92 macrodir = argv[i][2] ? argv[i] + 2 : argv[++i];
93 break;
94 case 'T':
95 dev = argv[i][2] ? argv[i] + 2 : argv[++i];
96 break;
97 default:
98 printf("%s", usage);
99 return 0;
102 if (dev_open(fontdir, dev)) {
103 fprintf(stderr, "neatroff: cannot open device %s\n", dev);
104 return 1;
106 hyph_init();
107 env_init();
108 tr_init();
109 if (i == argc)
110 in_queue(NULL); /* reading from standard input */
111 for (; i < argc; i++)
112 in_queue(!strcmp("-", argv[i]) ? NULL : argv[i]);
113 out("s%d\n", n_s);
114 out("f%d\n", n_f);
115 ret = render();
116 out("V%d\n", n_p);
117 hyph_done();
118 tr_done();
119 env_done();
120 dev_close();
121 map_done();
122 return ret;