1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Man page to HTML conversion program.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2017 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 2004-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers.
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #include <cups/string-private.h>
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/array-private.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <unistd.h>
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker
19*5e7646d2SAndroid Build Coastguard Worker /*
20*5e7646d2SAndroid Build Coastguard Worker * Local globals...
21*5e7646d2SAndroid Build Coastguard Worker */
22*5e7646d2SAndroid Build Coastguard Worker
23*5e7646d2SAndroid Build Coastguard Worker static const char /* Start/end tags for fonts */
24*5e7646d2SAndroid Build Coastguard Worker * const start_fonts[] = { "", "<b>", "<i>" },
25*5e7646d2SAndroid Build Coastguard Worker * const end_fonts[] = { "", "</b>", "</i>" };
26*5e7646d2SAndroid Build Coastguard Worker
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker /*
29*5e7646d2SAndroid Build Coastguard Worker * Local functions...
30*5e7646d2SAndroid Build Coastguard Worker */
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker static void html_alternate(const char *s, const char *first, const char *second, FILE *fp);
33*5e7646d2SAndroid Build Coastguard Worker static void html_fputs(const char *s, int *font, FILE *fp);
34*5e7646d2SAndroid Build Coastguard Worker static void html_putc(int ch, FILE *fp);
35*5e7646d2SAndroid Build Coastguard Worker static void strmove(char *d, const char *s);
36*5e7646d2SAndroid Build Coastguard Worker
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker /*
39*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Convert a man page to HTML.
40*5e7646d2SAndroid Build Coastguard Worker */
41*5e7646d2SAndroid Build Coastguard Worker
42*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])43*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line args */
44*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
45*5e7646d2SAndroid Build Coastguard Worker {
46*5e7646d2SAndroid Build Coastguard Worker FILE *infile, /* Input file */
47*5e7646d2SAndroid Build Coastguard Worker *outfile; /* Output file */
48*5e7646d2SAndroid Build Coastguard Worker char line[1024], /* Line from file */
49*5e7646d2SAndroid Build Coastguard Worker *lineptr, /* Pointer into line */
50*5e7646d2SAndroid Build Coastguard Worker anchor[1024], /* Anchor */
51*5e7646d2SAndroid Build Coastguard Worker name[1024], /* Man page name */
52*5e7646d2SAndroid Build Coastguard Worker ddpost[256]; /* Tagged list post markup */
53*5e7646d2SAndroid Build Coastguard Worker int section = -1, /* Man page section */
54*5e7646d2SAndroid Build Coastguard Worker pre = 0, /* Preformatted */
55*5e7646d2SAndroid Build Coastguard Worker font = 0, /* Current font */
56*5e7646d2SAndroid Build Coastguard Worker linenum = 0; /* Current line number */
57*5e7646d2SAndroid Build Coastguard Worker float list_indent = 0.0f, /* Current list indentation */
58*5e7646d2SAndroid Build Coastguard Worker nested_indent = 0.0f; /* Nested list indentation, if any */
59*5e7646d2SAndroid Build Coastguard Worker const char *list = NULL, /* Current list, if any */
60*5e7646d2SAndroid Build Coastguard Worker *nested = NULL; /* Nested list, if any */
61*5e7646d2SAndroid Build Coastguard Worker const char *post = NULL; /* Text to add after the current line */
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker
64*5e7646d2SAndroid Build Coastguard Worker /*
65*5e7646d2SAndroid Build Coastguard Worker * Check arguments...
66*5e7646d2SAndroid Build Coastguard Worker */
67*5e7646d2SAndroid Build Coastguard Worker
68*5e7646d2SAndroid Build Coastguard Worker if (argc > 3)
69*5e7646d2SAndroid Build Coastguard Worker {
70*5e7646d2SAndroid Build Coastguard Worker fputs("Usage: mantohtml [filename.man [filename.html]]\n", stderr);
71*5e7646d2SAndroid Build Coastguard Worker return (1);
72*5e7646d2SAndroid Build Coastguard Worker }
73*5e7646d2SAndroid Build Coastguard Worker
74*5e7646d2SAndroid Build Coastguard Worker /*
75*5e7646d2SAndroid Build Coastguard Worker * Open files as needed...
76*5e7646d2SAndroid Build Coastguard Worker */
77*5e7646d2SAndroid Build Coastguard Worker
78*5e7646d2SAndroid Build Coastguard Worker if (argc > 1)
79*5e7646d2SAndroid Build Coastguard Worker {
80*5e7646d2SAndroid Build Coastguard Worker if ((infile = fopen(argv[1], "r")) == NULL)
81*5e7646d2SAndroid Build Coastguard Worker {
82*5e7646d2SAndroid Build Coastguard Worker perror(argv[1]);
83*5e7646d2SAndroid Build Coastguard Worker return (1);
84*5e7646d2SAndroid Build Coastguard Worker }
85*5e7646d2SAndroid Build Coastguard Worker }
86*5e7646d2SAndroid Build Coastguard Worker else
87*5e7646d2SAndroid Build Coastguard Worker infile = stdin;
88*5e7646d2SAndroid Build Coastguard Worker
89*5e7646d2SAndroid Build Coastguard Worker if (argc > 2)
90*5e7646d2SAndroid Build Coastguard Worker {
91*5e7646d2SAndroid Build Coastguard Worker if ((outfile = fopen(argv[2], "w")) == NULL)
92*5e7646d2SAndroid Build Coastguard Worker {
93*5e7646d2SAndroid Build Coastguard Worker perror(argv[2]);
94*5e7646d2SAndroid Build Coastguard Worker fclose(infile);
95*5e7646d2SAndroid Build Coastguard Worker return (1);
96*5e7646d2SAndroid Build Coastguard Worker }
97*5e7646d2SAndroid Build Coastguard Worker }
98*5e7646d2SAndroid Build Coastguard Worker else
99*5e7646d2SAndroid Build Coastguard Worker outfile = stdout;
100*5e7646d2SAndroid Build Coastguard Worker
101*5e7646d2SAndroid Build Coastguard Worker /*
102*5e7646d2SAndroid Build Coastguard Worker * Read from input and write the output...
103*5e7646d2SAndroid Build Coastguard Worker */
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker fputs("<!DOCTYPE HTML>\n"
106*5e7646d2SAndroid Build Coastguard Worker "<html>\n"
107*5e7646d2SAndroid Build Coastguard Worker "<!-- SECTION: Man Pages -->\n"
108*5e7646d2SAndroid Build Coastguard Worker "<head>\n"
109*5e7646d2SAndroid Build Coastguard Worker "\t<link rel=\"stylesheet\" type=\"text/css\" "
110*5e7646d2SAndroid Build Coastguard Worker "href=\"../cups-printable.css\">\n", outfile);
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
113*5e7646d2SAndroid Build Coastguard Worker
114*5e7646d2SAndroid Build Coastguard Worker while (fgets(line, sizeof(line), infile))
115*5e7646d2SAndroid Build Coastguard Worker {
116*5e7646d2SAndroid Build Coastguard Worker size_t linelen = strlen(line); /* Length of line */
117*5e7646d2SAndroid Build Coastguard Worker
118*5e7646d2SAndroid Build Coastguard Worker if (linelen > 0 && line[linelen - 1] == '\n')
119*5e7646d2SAndroid Build Coastguard Worker line[linelen - 1] = '\0';
120*5e7646d2SAndroid Build Coastguard Worker
121*5e7646d2SAndroid Build Coastguard Worker linenum ++;
122*5e7646d2SAndroid Build Coastguard Worker
123*5e7646d2SAndroid Build Coastguard Worker if (line[0] == '.')
124*5e7646d2SAndroid Build Coastguard Worker {
125*5e7646d2SAndroid Build Coastguard Worker /*
126*5e7646d2SAndroid Build Coastguard Worker * Strip leading whitespace...
127*5e7646d2SAndroid Build Coastguard Worker */
128*5e7646d2SAndroid Build Coastguard Worker
129*5e7646d2SAndroid Build Coastguard Worker while (line[1] == ' ' || line[1] == '\t')
130*5e7646d2SAndroid Build Coastguard Worker strmove(line + 1, line + 2);
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker /*
133*5e7646d2SAndroid Build Coastguard Worker * Process man page commands...
134*5e7646d2SAndroid Build Coastguard Worker */
135*5e7646d2SAndroid Build Coastguard Worker
136*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(line, ".TH ", 4) && section < 0)
137*5e7646d2SAndroid Build Coastguard Worker {
138*5e7646d2SAndroid Build Coastguard Worker /*
139*5e7646d2SAndroid Build Coastguard Worker * Grab man page title...
140*5e7646d2SAndroid Build Coastguard Worker */
141*5e7646d2SAndroid Build Coastguard Worker
142*5e7646d2SAndroid Build Coastguard Worker sscanf(line + 4, "%s%d", name, §ion);
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile,
145*5e7646d2SAndroid Build Coastguard Worker "\t<title>%s(%d)</title>\n"
146*5e7646d2SAndroid Build Coastguard Worker "</head>\n"
147*5e7646d2SAndroid Build Coastguard Worker "<body>\n"
148*5e7646d2SAndroid Build Coastguard Worker "<h1 class=\"title\">%s(%d)</h1>\n"
149*5e7646d2SAndroid Build Coastguard Worker "%s",
150*5e7646d2SAndroid Build Coastguard Worker name, section, name, section, start_fonts[font]);
151*5e7646d2SAndroid Build Coastguard Worker }
152*5e7646d2SAndroid Build Coastguard Worker else if (section < 0)
153*5e7646d2SAndroid Build Coastguard Worker continue;
154*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".SH ", 4) || !strncmp(line, ".SS ", 4))
155*5e7646d2SAndroid Build Coastguard Worker {
156*5e7646d2SAndroid Build Coastguard Worker /*
157*5e7646d2SAndroid Build Coastguard Worker * Grab heading...
158*5e7646d2SAndroid Build Coastguard Worker */
159*5e7646d2SAndroid Build Coastguard Worker
160*5e7646d2SAndroid Build Coastguard Worker int first = 1;
161*5e7646d2SAndroid Build Coastguard Worker
162*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
163*5e7646d2SAndroid Build Coastguard Worker font = 0;
164*5e7646d2SAndroid Build Coastguard Worker
165*5e7646d2SAndroid Build Coastguard Worker if (list)
166*5e7646d2SAndroid Build Coastguard Worker {
167*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
168*5e7646d2SAndroid Build Coastguard Worker list = NULL;
169*5e7646d2SAndroid Build Coastguard Worker }
170*5e7646d2SAndroid Build Coastguard Worker
171*5e7646d2SAndroid Build Coastguard Worker if (line[2] == 'H')
172*5e7646d2SAndroid Build Coastguard Worker fputs("<h2 class=\"title\"><a name=\"", outfile);
173*5e7646d2SAndroid Build Coastguard Worker else
174*5e7646d2SAndroid Build Coastguard Worker fputs("<h3><a name=\"", outfile);
175*5e7646d2SAndroid Build Coastguard Worker
176*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
177*5e7646d2SAndroid Build Coastguard Worker {
178*5e7646d2SAndroid Build Coastguard Worker fputs(anchor, outfile);
179*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker else
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker for (lineptr = line + 4; *lineptr; lineptr ++)
184*5e7646d2SAndroid Build Coastguard Worker if (*lineptr == '\"')
185*5e7646d2SAndroid Build Coastguard Worker continue;
186*5e7646d2SAndroid Build Coastguard Worker else if (isalnum(*lineptr & 255))
187*5e7646d2SAndroid Build Coastguard Worker html_putc(*lineptr, outfile);
188*5e7646d2SAndroid Build Coastguard Worker else
189*5e7646d2SAndroid Build Coastguard Worker html_putc('_', outfile);
190*5e7646d2SAndroid Build Coastguard Worker }
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker fputs("\">", outfile);
193*5e7646d2SAndroid Build Coastguard Worker
194*5e7646d2SAndroid Build Coastguard Worker for (lineptr = line + 4; *lineptr; lineptr ++)
195*5e7646d2SAndroid Build Coastguard Worker {
196*5e7646d2SAndroid Build Coastguard Worker if (*lineptr == '\"')
197*5e7646d2SAndroid Build Coastguard Worker continue;
198*5e7646d2SAndroid Build Coastguard Worker else if (*lineptr == ' ')
199*5e7646d2SAndroid Build Coastguard Worker {
200*5e7646d2SAndroid Build Coastguard Worker html_putc(' ', outfile);
201*5e7646d2SAndroid Build Coastguard Worker
202*5e7646d2SAndroid Build Coastguard Worker first = 1;
203*5e7646d2SAndroid Build Coastguard Worker }
204*5e7646d2SAndroid Build Coastguard Worker else
205*5e7646d2SAndroid Build Coastguard Worker {
206*5e7646d2SAndroid Build Coastguard Worker if (first)
207*5e7646d2SAndroid Build Coastguard Worker html_putc(*lineptr, outfile);
208*5e7646d2SAndroid Build Coastguard Worker else
209*5e7646d2SAndroid Build Coastguard Worker html_putc(tolower(*lineptr & 255), outfile);
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker first = 0;
212*5e7646d2SAndroid Build Coastguard Worker }
213*5e7646d2SAndroid Build Coastguard Worker }
214*5e7646d2SAndroid Build Coastguard Worker
215*5e7646d2SAndroid Build Coastguard Worker if (line[2] == 'H')
216*5e7646d2SAndroid Build Coastguard Worker fputs("</a></h2>\n", outfile);
217*5e7646d2SAndroid Build Coastguard Worker else
218*5e7646d2SAndroid Build Coastguard Worker fputs("</a></h3>\n", outfile);
219*5e7646d2SAndroid Build Coastguard Worker }
220*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".B ", 3))
221*5e7646d2SAndroid Build Coastguard Worker {
222*5e7646d2SAndroid Build Coastguard Worker /*
223*5e7646d2SAndroid Build Coastguard Worker * Grab bold text...
224*5e7646d2SAndroid Build Coastguard Worker */
225*5e7646d2SAndroid Build Coastguard Worker
226*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
227*5e7646d2SAndroid Build Coastguard Worker font = 0;
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
230*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
231*5e7646d2SAndroid Build Coastguard Worker
232*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 3, "b", "b", outfile);
233*5e7646d2SAndroid Build Coastguard Worker
234*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
235*5e7646d2SAndroid Build Coastguard Worker {
236*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
237*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
238*5e7646d2SAndroid Build Coastguard Worker }
239*5e7646d2SAndroid Build Coastguard Worker
240*5e7646d2SAndroid Build Coastguard Worker if (post)
241*5e7646d2SAndroid Build Coastguard Worker {
242*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
243*5e7646d2SAndroid Build Coastguard Worker post = NULL;
244*5e7646d2SAndroid Build Coastguard Worker }
245*5e7646d2SAndroid Build Coastguard Worker }
246*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".I ", 3))
247*5e7646d2SAndroid Build Coastguard Worker {
248*5e7646d2SAndroid Build Coastguard Worker /*
249*5e7646d2SAndroid Build Coastguard Worker * Grab italic text...
250*5e7646d2SAndroid Build Coastguard Worker */
251*5e7646d2SAndroid Build Coastguard Worker
252*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
253*5e7646d2SAndroid Build Coastguard Worker font = 0;
254*5e7646d2SAndroid Build Coastguard Worker
255*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
256*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 3, "i", "i", outfile);
259*5e7646d2SAndroid Build Coastguard Worker
260*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
261*5e7646d2SAndroid Build Coastguard Worker {
262*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
263*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
264*5e7646d2SAndroid Build Coastguard Worker }
265*5e7646d2SAndroid Build Coastguard Worker
266*5e7646d2SAndroid Build Coastguard Worker if (post)
267*5e7646d2SAndroid Build Coastguard Worker {
268*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
269*5e7646d2SAndroid Build Coastguard Worker post = NULL;
270*5e7646d2SAndroid Build Coastguard Worker }
271*5e7646d2SAndroid Build Coastguard Worker }
272*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".BI ", 4))
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker /*
275*5e7646d2SAndroid Build Coastguard Worker * Alternating bold and italic text...
276*5e7646d2SAndroid Build Coastguard Worker */
277*5e7646d2SAndroid Build Coastguard Worker
278*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
279*5e7646d2SAndroid Build Coastguard Worker font = 0;
280*5e7646d2SAndroid Build Coastguard Worker
281*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
282*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "b", "i", outfile);
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
287*5e7646d2SAndroid Build Coastguard Worker {
288*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
289*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
290*5e7646d2SAndroid Build Coastguard Worker }
291*5e7646d2SAndroid Build Coastguard Worker
292*5e7646d2SAndroid Build Coastguard Worker if (post)
293*5e7646d2SAndroid Build Coastguard Worker {
294*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
295*5e7646d2SAndroid Build Coastguard Worker post = NULL;
296*5e7646d2SAndroid Build Coastguard Worker }
297*5e7646d2SAndroid Build Coastguard Worker }
298*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".BR ", 4))
299*5e7646d2SAndroid Build Coastguard Worker {
300*5e7646d2SAndroid Build Coastguard Worker /*
301*5e7646d2SAndroid Build Coastguard Worker * Alternating bold and roman (plain) text...
302*5e7646d2SAndroid Build Coastguard Worker */
303*5e7646d2SAndroid Build Coastguard Worker
304*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
305*5e7646d2SAndroid Build Coastguard Worker font = 0;
306*5e7646d2SAndroid Build Coastguard Worker
307*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
308*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
309*5e7646d2SAndroid Build Coastguard Worker
310*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "b", NULL, outfile);
311*5e7646d2SAndroid Build Coastguard Worker
312*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
313*5e7646d2SAndroid Build Coastguard Worker {
314*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
315*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
316*5e7646d2SAndroid Build Coastguard Worker }
317*5e7646d2SAndroid Build Coastguard Worker
318*5e7646d2SAndroid Build Coastguard Worker if (post)
319*5e7646d2SAndroid Build Coastguard Worker {
320*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
321*5e7646d2SAndroid Build Coastguard Worker post = NULL;
322*5e7646d2SAndroid Build Coastguard Worker }
323*5e7646d2SAndroid Build Coastguard Worker }
324*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".IB ", 4))
325*5e7646d2SAndroid Build Coastguard Worker {
326*5e7646d2SAndroid Build Coastguard Worker /*
327*5e7646d2SAndroid Build Coastguard Worker * Alternating italic and bold text...
328*5e7646d2SAndroid Build Coastguard Worker */
329*5e7646d2SAndroid Build Coastguard Worker
330*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
331*5e7646d2SAndroid Build Coastguard Worker font = 0;
332*5e7646d2SAndroid Build Coastguard Worker
333*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
334*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
335*5e7646d2SAndroid Build Coastguard Worker
336*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "i", "b", outfile);
337*5e7646d2SAndroid Build Coastguard Worker
338*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
339*5e7646d2SAndroid Build Coastguard Worker {
340*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
341*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
342*5e7646d2SAndroid Build Coastguard Worker }
343*5e7646d2SAndroid Build Coastguard Worker
344*5e7646d2SAndroid Build Coastguard Worker if (post)
345*5e7646d2SAndroid Build Coastguard Worker {
346*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
347*5e7646d2SAndroid Build Coastguard Worker post = NULL;
348*5e7646d2SAndroid Build Coastguard Worker }
349*5e7646d2SAndroid Build Coastguard Worker }
350*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".IR ", 4))
351*5e7646d2SAndroid Build Coastguard Worker {
352*5e7646d2SAndroid Build Coastguard Worker /*
353*5e7646d2SAndroid Build Coastguard Worker * Alternating italic and roman (plain) text...
354*5e7646d2SAndroid Build Coastguard Worker */
355*5e7646d2SAndroid Build Coastguard Worker
356*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
357*5e7646d2SAndroid Build Coastguard Worker font = 0;
358*5e7646d2SAndroid Build Coastguard Worker
359*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
360*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
361*5e7646d2SAndroid Build Coastguard Worker
362*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "i", NULL, outfile);
363*5e7646d2SAndroid Build Coastguard Worker
364*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
365*5e7646d2SAndroid Build Coastguard Worker {
366*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
367*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
368*5e7646d2SAndroid Build Coastguard Worker }
369*5e7646d2SAndroid Build Coastguard Worker
370*5e7646d2SAndroid Build Coastguard Worker if (post)
371*5e7646d2SAndroid Build Coastguard Worker {
372*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
373*5e7646d2SAndroid Build Coastguard Worker post = NULL;
374*5e7646d2SAndroid Build Coastguard Worker }
375*5e7646d2SAndroid Build Coastguard Worker }
376*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".RB ", 4))
377*5e7646d2SAndroid Build Coastguard Worker {
378*5e7646d2SAndroid Build Coastguard Worker /*
379*5e7646d2SAndroid Build Coastguard Worker * Alternating roman (plain) and bold text...
380*5e7646d2SAndroid Build Coastguard Worker */
381*5e7646d2SAndroid Build Coastguard Worker
382*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
383*5e7646d2SAndroid Build Coastguard Worker font = 0;
384*5e7646d2SAndroid Build Coastguard Worker
385*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
386*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
387*5e7646d2SAndroid Build Coastguard Worker
388*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, NULL, "b", outfile);
389*5e7646d2SAndroid Build Coastguard Worker
390*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
391*5e7646d2SAndroid Build Coastguard Worker {
392*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
393*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
394*5e7646d2SAndroid Build Coastguard Worker }
395*5e7646d2SAndroid Build Coastguard Worker
396*5e7646d2SAndroid Build Coastguard Worker if (post)
397*5e7646d2SAndroid Build Coastguard Worker {
398*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
399*5e7646d2SAndroid Build Coastguard Worker post = NULL;
400*5e7646d2SAndroid Build Coastguard Worker }
401*5e7646d2SAndroid Build Coastguard Worker }
402*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".RI ", 4))
403*5e7646d2SAndroid Build Coastguard Worker {
404*5e7646d2SAndroid Build Coastguard Worker /*
405*5e7646d2SAndroid Build Coastguard Worker * Alternating roman (plain) and italic text...
406*5e7646d2SAndroid Build Coastguard Worker */
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
409*5e7646d2SAndroid Build Coastguard Worker font = 0;
410*5e7646d2SAndroid Build Coastguard Worker
411*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
412*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
413*5e7646d2SAndroid Build Coastguard Worker
414*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, NULL, "i", outfile);
415*5e7646d2SAndroid Build Coastguard Worker
416*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
417*5e7646d2SAndroid Build Coastguard Worker {
418*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
419*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
420*5e7646d2SAndroid Build Coastguard Worker }
421*5e7646d2SAndroid Build Coastguard Worker
422*5e7646d2SAndroid Build Coastguard Worker if (post)
423*5e7646d2SAndroid Build Coastguard Worker {
424*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
425*5e7646d2SAndroid Build Coastguard Worker post = NULL;
426*5e7646d2SAndroid Build Coastguard Worker }
427*5e7646d2SAndroid Build Coastguard Worker }
428*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".SB ", 4))
429*5e7646d2SAndroid Build Coastguard Worker {
430*5e7646d2SAndroid Build Coastguard Worker /*
431*5e7646d2SAndroid Build Coastguard Worker * Alternating small and bold text...
432*5e7646d2SAndroid Build Coastguard Worker */
433*5e7646d2SAndroid Build Coastguard Worker
434*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
435*5e7646d2SAndroid Build Coastguard Worker font = 0;
436*5e7646d2SAndroid Build Coastguard Worker
437*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
438*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
439*5e7646d2SAndroid Build Coastguard Worker
440*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "small", "b", outfile);
441*5e7646d2SAndroid Build Coastguard Worker
442*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
443*5e7646d2SAndroid Build Coastguard Worker {
444*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
445*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
446*5e7646d2SAndroid Build Coastguard Worker }
447*5e7646d2SAndroid Build Coastguard Worker
448*5e7646d2SAndroid Build Coastguard Worker if (post)
449*5e7646d2SAndroid Build Coastguard Worker {
450*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
451*5e7646d2SAndroid Build Coastguard Worker post = NULL;
452*5e7646d2SAndroid Build Coastguard Worker }
453*5e7646d2SAndroid Build Coastguard Worker }
454*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".SM ", 4))
455*5e7646d2SAndroid Build Coastguard Worker {
456*5e7646d2SAndroid Build Coastguard Worker /*
457*5e7646d2SAndroid Build Coastguard Worker * Small text...
458*5e7646d2SAndroid Build Coastguard Worker */
459*5e7646d2SAndroid Build Coastguard Worker
460*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
461*5e7646d2SAndroid Build Coastguard Worker font = 0;
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
464*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\">", anchor);
465*5e7646d2SAndroid Build Coastguard Worker
466*5e7646d2SAndroid Build Coastguard Worker html_alternate(line + 4, "small", "small", outfile);
467*5e7646d2SAndroid Build Coastguard Worker
468*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
469*5e7646d2SAndroid Build Coastguard Worker {
470*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", outfile);
471*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
472*5e7646d2SAndroid Build Coastguard Worker }
473*5e7646d2SAndroid Build Coastguard Worker
474*5e7646d2SAndroid Build Coastguard Worker if (post)
475*5e7646d2SAndroid Build Coastguard Worker {
476*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
477*5e7646d2SAndroid Build Coastguard Worker post = NULL;
478*5e7646d2SAndroid Build Coastguard Worker }
479*5e7646d2SAndroid Build Coastguard Worker }
480*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(line, ".LP") || !strcmp(line, ".PP") || !strcmp(line, ".P"))
481*5e7646d2SAndroid Build Coastguard Worker {
482*5e7646d2SAndroid Build Coastguard Worker /*
483*5e7646d2SAndroid Build Coastguard Worker * New paragraph...
484*5e7646d2SAndroid Build Coastguard Worker */
485*5e7646d2SAndroid Build Coastguard Worker
486*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
487*5e7646d2SAndroid Build Coastguard Worker font = 0;
488*5e7646d2SAndroid Build Coastguard Worker
489*5e7646d2SAndroid Build Coastguard Worker if (list)
490*5e7646d2SAndroid Build Coastguard Worker {
491*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
492*5e7646d2SAndroid Build Coastguard Worker list = NULL;
493*5e7646d2SAndroid Build Coastguard Worker }
494*5e7646d2SAndroid Build Coastguard Worker
495*5e7646d2SAndroid Build Coastguard Worker fputs("<p>", outfile);
496*5e7646d2SAndroid Build Coastguard Worker
497*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
498*5e7646d2SAndroid Build Coastguard Worker {
499*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\"></a>", anchor);
500*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
501*5e7646d2SAndroid Build Coastguard Worker }
502*5e7646d2SAndroid Build Coastguard Worker }
503*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(line, ".RS") || !strncmp(line, ".RS ", 4))
504*5e7646d2SAndroid Build Coastguard Worker {
505*5e7646d2SAndroid Build Coastguard Worker /*
506*5e7646d2SAndroid Build Coastguard Worker * Indent...
507*5e7646d2SAndroid Build Coastguard Worker */
508*5e7646d2SAndroid Build Coastguard Worker
509*5e7646d2SAndroid Build Coastguard Worker float amount = 3.0; /* Indentation */
510*5e7646d2SAndroid Build Coastguard Worker
511*5e7646d2SAndroid Build Coastguard Worker if (line[3])
512*5e7646d2SAndroid Build Coastguard Worker amount = (float)atof(line + 4);
513*5e7646d2SAndroid Build Coastguard Worker
514*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
515*5e7646d2SAndroid Build Coastguard Worker font = 0;
516*5e7646d2SAndroid Build Coastguard Worker
517*5e7646d2SAndroid Build Coastguard Worker if (list)
518*5e7646d2SAndroid Build Coastguard Worker {
519*5e7646d2SAndroid Build Coastguard Worker nested = list;
520*5e7646d2SAndroid Build Coastguard Worker list = NULL;
521*5e7646d2SAndroid Build Coastguard Worker nested_indent = list_indent;
522*5e7646d2SAndroid Build Coastguard Worker list_indent = 0.0f;
523*5e7646d2SAndroid Build Coastguard Worker }
524*5e7646d2SAndroid Build Coastguard Worker
525*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<div style=\"margin-left: %.1fem;\">\n", amount - nested_indent);
526*5e7646d2SAndroid Build Coastguard Worker }
527*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(line, ".RE"))
528*5e7646d2SAndroid Build Coastguard Worker {
529*5e7646d2SAndroid Build Coastguard Worker /*
530*5e7646d2SAndroid Build Coastguard Worker * Unindent...
531*5e7646d2SAndroid Build Coastguard Worker */
532*5e7646d2SAndroid Build Coastguard Worker
533*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
534*5e7646d2SAndroid Build Coastguard Worker font = 0;
535*5e7646d2SAndroid Build Coastguard Worker
536*5e7646d2SAndroid Build Coastguard Worker fputs("</div>\n", outfile);
537*5e7646d2SAndroid Build Coastguard Worker
538*5e7646d2SAndroid Build Coastguard Worker if (nested)
539*5e7646d2SAndroid Build Coastguard Worker {
540*5e7646d2SAndroid Build Coastguard Worker list = nested;
541*5e7646d2SAndroid Build Coastguard Worker nested = NULL;
542*5e7646d2SAndroid Build Coastguard Worker
543*5e7646d2SAndroid Build Coastguard Worker list_indent = nested_indent;
544*5e7646d2SAndroid Build Coastguard Worker nested_indent = 0.0f;
545*5e7646d2SAndroid Build Coastguard Worker }
546*5e7646d2SAndroid Build Coastguard Worker }
547*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(line, ".HP") || !strncmp(line, ".HP ", 4))
548*5e7646d2SAndroid Build Coastguard Worker {
549*5e7646d2SAndroid Build Coastguard Worker /*
550*5e7646d2SAndroid Build Coastguard Worker * Hanging paragraph...
551*5e7646d2SAndroid Build Coastguard Worker *
552*5e7646d2SAndroid Build Coastguard Worker * .HP i
553*5e7646d2SAndroid Build Coastguard Worker */
554*5e7646d2SAndroid Build Coastguard Worker
555*5e7646d2SAndroid Build Coastguard Worker float amount = 3.0; /* Indentation */
556*5e7646d2SAndroid Build Coastguard Worker
557*5e7646d2SAndroid Build Coastguard Worker if (line[3])
558*5e7646d2SAndroid Build Coastguard Worker amount = (float)atof(line + 4);
559*5e7646d2SAndroid Build Coastguard Worker
560*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
561*5e7646d2SAndroid Build Coastguard Worker font = 0;
562*5e7646d2SAndroid Build Coastguard Worker
563*5e7646d2SAndroid Build Coastguard Worker if (list)
564*5e7646d2SAndroid Build Coastguard Worker {
565*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
566*5e7646d2SAndroid Build Coastguard Worker list = NULL;
567*5e7646d2SAndroid Build Coastguard Worker }
568*5e7646d2SAndroid Build Coastguard Worker
569*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<p style=\"margin-left: %.1fem; text-indent: %.1fem\">", amount, -amount);
570*5e7646d2SAndroid Build Coastguard Worker
571*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
572*5e7646d2SAndroid Build Coastguard Worker {
573*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\"></a>", anchor);
574*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
575*5e7646d2SAndroid Build Coastguard Worker }
576*5e7646d2SAndroid Build Coastguard Worker
577*5e7646d2SAndroid Build Coastguard Worker if (line[1] == 'T')
578*5e7646d2SAndroid Build Coastguard Worker post = "<br>\n";
579*5e7646d2SAndroid Build Coastguard Worker }
580*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(line, ".TP") || !strncmp(line, ".TP ", 4))
581*5e7646d2SAndroid Build Coastguard Worker {
582*5e7646d2SAndroid Build Coastguard Worker /*
583*5e7646d2SAndroid Build Coastguard Worker * Tagged list...
584*5e7646d2SAndroid Build Coastguard Worker *
585*5e7646d2SAndroid Build Coastguard Worker * .TP i
586*5e7646d2SAndroid Build Coastguard Worker */
587*5e7646d2SAndroid Build Coastguard Worker
588*5e7646d2SAndroid Build Coastguard Worker float amount = 3.0; /* Indentation */
589*5e7646d2SAndroid Build Coastguard Worker
590*5e7646d2SAndroid Build Coastguard Worker if (line[3])
591*5e7646d2SAndroid Build Coastguard Worker amount = (float)atof(line + 4);
592*5e7646d2SAndroid Build Coastguard Worker
593*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
594*5e7646d2SAndroid Build Coastguard Worker font = 0;
595*5e7646d2SAndroid Build Coastguard Worker
596*5e7646d2SAndroid Build Coastguard Worker if (list && strcmp(list, "dl"))
597*5e7646d2SAndroid Build Coastguard Worker {
598*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
599*5e7646d2SAndroid Build Coastguard Worker list = NULL;
600*5e7646d2SAndroid Build Coastguard Worker }
601*5e7646d2SAndroid Build Coastguard Worker
602*5e7646d2SAndroid Build Coastguard Worker if (!list)
603*5e7646d2SAndroid Build Coastguard Worker {
604*5e7646d2SAndroid Build Coastguard Worker fputs("<dl class=\"man\">\n", outfile);
605*5e7646d2SAndroid Build Coastguard Worker list = "dl";
606*5e7646d2SAndroid Build Coastguard Worker list_indent = amount;
607*5e7646d2SAndroid Build Coastguard Worker }
608*5e7646d2SAndroid Build Coastguard Worker
609*5e7646d2SAndroid Build Coastguard Worker fputs("<dt>", outfile);
610*5e7646d2SAndroid Build Coastguard Worker snprintf(ddpost, sizeof(ddpost), "<dd style=\"margin-left: %.1fem\">", amount);
611*5e7646d2SAndroid Build Coastguard Worker post = ddpost;
612*5e7646d2SAndroid Build Coastguard Worker
613*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
614*5e7646d2SAndroid Build Coastguard Worker {
615*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\"></a>", anchor);
616*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
617*5e7646d2SAndroid Build Coastguard Worker }
618*5e7646d2SAndroid Build Coastguard Worker }
619*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".IP ", 4))
620*5e7646d2SAndroid Build Coastguard Worker {
621*5e7646d2SAndroid Build Coastguard Worker /*
622*5e7646d2SAndroid Build Coastguard Worker * Indented paragraph...
623*5e7646d2SAndroid Build Coastguard Worker *
624*5e7646d2SAndroid Build Coastguard Worker * .IP x i
625*5e7646d2SAndroid Build Coastguard Worker */
626*5e7646d2SAndroid Build Coastguard Worker
627*5e7646d2SAndroid Build Coastguard Worker float amount = 3.0; /* Indentation */
628*5e7646d2SAndroid Build Coastguard Worker const char *newlist = NULL; /* New list style */
629*5e7646d2SAndroid Build Coastguard Worker const char *newtype = NULL; /* New list numbering type */
630*5e7646d2SAndroid Build Coastguard Worker
631*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
632*5e7646d2SAndroid Build Coastguard Worker font = 0;
633*5e7646d2SAndroid Build Coastguard Worker
634*5e7646d2SAndroid Build Coastguard Worker lineptr = line + 4;
635*5e7646d2SAndroid Build Coastguard Worker while (isspace(*lineptr & 255))
636*5e7646d2SAndroid Build Coastguard Worker lineptr ++;
637*5e7646d2SAndroid Build Coastguard Worker
638*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(lineptr, "\\(bu", 4) || !strncmp(lineptr, "\\(em", 4))
639*5e7646d2SAndroid Build Coastguard Worker {
640*5e7646d2SAndroid Build Coastguard Worker /*
641*5e7646d2SAndroid Build Coastguard Worker * Bullet list...
642*5e7646d2SAndroid Build Coastguard Worker */
643*5e7646d2SAndroid Build Coastguard Worker
644*5e7646d2SAndroid Build Coastguard Worker newlist = "ul";
645*5e7646d2SAndroid Build Coastguard Worker }
646*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(*lineptr & 255))
647*5e7646d2SAndroid Build Coastguard Worker {
648*5e7646d2SAndroid Build Coastguard Worker /*
649*5e7646d2SAndroid Build Coastguard Worker * Numbered list...
650*5e7646d2SAndroid Build Coastguard Worker */
651*5e7646d2SAndroid Build Coastguard Worker
652*5e7646d2SAndroid Build Coastguard Worker newlist = "ol";
653*5e7646d2SAndroid Build Coastguard Worker }
654*5e7646d2SAndroid Build Coastguard Worker else if (islower(*lineptr & 255))
655*5e7646d2SAndroid Build Coastguard Worker {
656*5e7646d2SAndroid Build Coastguard Worker /*
657*5e7646d2SAndroid Build Coastguard Worker * Lowercase alpha list...
658*5e7646d2SAndroid Build Coastguard Worker */
659*5e7646d2SAndroid Build Coastguard Worker
660*5e7646d2SAndroid Build Coastguard Worker newlist = "ol";
661*5e7646d2SAndroid Build Coastguard Worker newtype = "a";
662*5e7646d2SAndroid Build Coastguard Worker }
663*5e7646d2SAndroid Build Coastguard Worker else if (isupper(*lineptr & 255))
664*5e7646d2SAndroid Build Coastguard Worker {
665*5e7646d2SAndroid Build Coastguard Worker /*
666*5e7646d2SAndroid Build Coastguard Worker * Lowercase alpha list...
667*5e7646d2SAndroid Build Coastguard Worker */
668*5e7646d2SAndroid Build Coastguard Worker
669*5e7646d2SAndroid Build Coastguard Worker newlist = "ol";
670*5e7646d2SAndroid Build Coastguard Worker newtype = "A";
671*5e7646d2SAndroid Build Coastguard Worker }
672*5e7646d2SAndroid Build Coastguard Worker
673*5e7646d2SAndroid Build Coastguard Worker while (!isspace(*lineptr & 255))
674*5e7646d2SAndroid Build Coastguard Worker lineptr ++;
675*5e7646d2SAndroid Build Coastguard Worker while (isspace(*lineptr & 255))
676*5e7646d2SAndroid Build Coastguard Worker lineptr ++;
677*5e7646d2SAndroid Build Coastguard Worker
678*5e7646d2SAndroid Build Coastguard Worker if (isdigit(*lineptr & 255))
679*5e7646d2SAndroid Build Coastguard Worker amount = (float)atof(lineptr);
680*5e7646d2SAndroid Build Coastguard Worker
681*5e7646d2SAndroid Build Coastguard Worker if (newlist && list && strcmp(newlist, list))
682*5e7646d2SAndroid Build Coastguard Worker {
683*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
684*5e7646d2SAndroid Build Coastguard Worker list = NULL;
685*5e7646d2SAndroid Build Coastguard Worker }
686*5e7646d2SAndroid Build Coastguard Worker
687*5e7646d2SAndroid Build Coastguard Worker if (newlist && !list)
688*5e7646d2SAndroid Build Coastguard Worker {
689*5e7646d2SAndroid Build Coastguard Worker if (newtype)
690*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<%s type=\"%s\">\n", newlist, newtype);
691*5e7646d2SAndroid Build Coastguard Worker else
692*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<%s>\n", newlist);
693*5e7646d2SAndroid Build Coastguard Worker
694*5e7646d2SAndroid Build Coastguard Worker list = newlist;
695*5e7646d2SAndroid Build Coastguard Worker }
696*5e7646d2SAndroid Build Coastguard Worker
697*5e7646d2SAndroid Build Coastguard Worker if (list)
698*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<li style=\"margin-left: %.1fem;\">", amount);
699*5e7646d2SAndroid Build Coastguard Worker else
700*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<p style=\"margin-left: %.1fem;\">", amount);
701*5e7646d2SAndroid Build Coastguard Worker
702*5e7646d2SAndroid Build Coastguard Worker if (anchor[0])
703*5e7646d2SAndroid Build Coastguard Worker {
704*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "<a name=\"%s\"></a>", anchor);
705*5e7646d2SAndroid Build Coastguard Worker anchor[0] = '\0';
706*5e7646d2SAndroid Build Coastguard Worker }
707*5e7646d2SAndroid Build Coastguard Worker }
708*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".br", 3))
709*5e7646d2SAndroid Build Coastguard Worker {
710*5e7646d2SAndroid Build Coastguard Worker /*
711*5e7646d2SAndroid Build Coastguard Worker * Grab line break...
712*5e7646d2SAndroid Build Coastguard Worker */
713*5e7646d2SAndroid Build Coastguard Worker
714*5e7646d2SAndroid Build Coastguard Worker fputs("<br>\n", outfile);
715*5e7646d2SAndroid Build Coastguard Worker }
716*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".de ", 4))
717*5e7646d2SAndroid Build Coastguard Worker {
718*5e7646d2SAndroid Build Coastguard Worker /*
719*5e7646d2SAndroid Build Coastguard Worker * Define macro - ignore...
720*5e7646d2SAndroid Build Coastguard Worker */
721*5e7646d2SAndroid Build Coastguard Worker
722*5e7646d2SAndroid Build Coastguard Worker while (fgets(line, sizeof(line), infile))
723*5e7646d2SAndroid Build Coastguard Worker {
724*5e7646d2SAndroid Build Coastguard Worker linenum ++;
725*5e7646d2SAndroid Build Coastguard Worker
726*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(line, "..", 2))
727*5e7646d2SAndroid Build Coastguard Worker break;
728*5e7646d2SAndroid Build Coastguard Worker }
729*5e7646d2SAndroid Build Coastguard Worker }
730*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".ds ", 4) || !strncmp(line, ".rm ", 4) ||
731*5e7646d2SAndroid Build Coastguard Worker !strncmp(line, ".tr ", 4) || !strncmp(line, ".hy ", 4) ||
732*5e7646d2SAndroid Build Coastguard Worker !strncmp(line, ".IX ", 4) || !strncmp(line, ".PD", 3) ||
733*5e7646d2SAndroid Build Coastguard Worker !strncmp(line, ".Sp", 3))
734*5e7646d2SAndroid Build Coastguard Worker {
735*5e7646d2SAndroid Build Coastguard Worker /*
736*5e7646d2SAndroid Build Coastguard Worker * Ignore unused commands...
737*5e7646d2SAndroid Build Coastguard Worker */
738*5e7646d2SAndroid Build Coastguard Worker }
739*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3) || !strncmp(line, ".EX", 3))
740*5e7646d2SAndroid Build Coastguard Worker {
741*5e7646d2SAndroid Build Coastguard Worker /*
742*5e7646d2SAndroid Build Coastguard Worker * Start preformatted...
743*5e7646d2SAndroid Build Coastguard Worker */
744*5e7646d2SAndroid Build Coastguard Worker
745*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
746*5e7646d2SAndroid Build Coastguard Worker font = 0;
747*5e7646d2SAndroid Build Coastguard Worker
748*5e7646d2SAndroid Build Coastguard Worker // if (list)
749*5e7646d2SAndroid Build Coastguard Worker // {
750*5e7646d2SAndroid Build Coastguard Worker // fprintf(outfile, "</%s>\n", list);
751*5e7646d2SAndroid Build Coastguard Worker // list = NULL;
752*5e7646d2SAndroid Build Coastguard Worker // }
753*5e7646d2SAndroid Build Coastguard Worker
754*5e7646d2SAndroid Build Coastguard Worker pre = 1;
755*5e7646d2SAndroid Build Coastguard Worker fputs("<pre class=\"man\">\n", outfile);
756*5e7646d2SAndroid Build Coastguard Worker }
757*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3) || !strncmp(line, ".EE", 3))
758*5e7646d2SAndroid Build Coastguard Worker {
759*5e7646d2SAndroid Build Coastguard Worker /*
760*5e7646d2SAndroid Build Coastguard Worker * End preformatted...
761*5e7646d2SAndroid Build Coastguard Worker */
762*5e7646d2SAndroid Build Coastguard Worker
763*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[font], outfile);
764*5e7646d2SAndroid Build Coastguard Worker font = 0;
765*5e7646d2SAndroid Build Coastguard Worker
766*5e7646d2SAndroid Build Coastguard Worker if (pre)
767*5e7646d2SAndroid Build Coastguard Worker {
768*5e7646d2SAndroid Build Coastguard Worker pre = 0;
769*5e7646d2SAndroid Build Coastguard Worker fputs("</pre>\n", outfile);
770*5e7646d2SAndroid Build Coastguard Worker }
771*5e7646d2SAndroid Build Coastguard Worker }
772*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".\\}", 3))
773*5e7646d2SAndroid Build Coastguard Worker {
774*5e7646d2SAndroid Build Coastguard Worker /*
775*5e7646d2SAndroid Build Coastguard Worker * Ignore close block...
776*5e7646d2SAndroid Build Coastguard Worker */
777*5e7646d2SAndroid Build Coastguard Worker }
778*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".ie", 3) || !strncmp(line, ".if", 3) ||
779*5e7646d2SAndroid Build Coastguard Worker !strncmp(line, ".el", 3))
780*5e7646d2SAndroid Build Coastguard Worker {
781*5e7646d2SAndroid Build Coastguard Worker /*
782*5e7646d2SAndroid Build Coastguard Worker * If/else - ignore...
783*5e7646d2SAndroid Build Coastguard Worker */
784*5e7646d2SAndroid Build Coastguard Worker
785*5e7646d2SAndroid Build Coastguard Worker if (strchr(line, '{') != NULL)
786*5e7646d2SAndroid Build Coastguard Worker {
787*5e7646d2SAndroid Build Coastguard Worker /*
788*5e7646d2SAndroid Build Coastguard Worker * Skip whole block...
789*5e7646d2SAndroid Build Coastguard Worker */
790*5e7646d2SAndroid Build Coastguard Worker
791*5e7646d2SAndroid Build Coastguard Worker while (fgets(line, sizeof(line), infile))
792*5e7646d2SAndroid Build Coastguard Worker {
793*5e7646d2SAndroid Build Coastguard Worker linenum ++;
794*5e7646d2SAndroid Build Coastguard Worker
795*5e7646d2SAndroid Build Coastguard Worker if (strchr(line, '}') != NULL)
796*5e7646d2SAndroid Build Coastguard Worker break;
797*5e7646d2SAndroid Build Coastguard Worker }
798*5e7646d2SAndroid Build Coastguard Worker }
799*5e7646d2SAndroid Build Coastguard Worker }
800*5e7646d2SAndroid Build Coastguard Worker #if 0
801*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ". ", 4))
802*5e7646d2SAndroid Build Coastguard Worker {
803*5e7646d2SAndroid Build Coastguard Worker /*
804*5e7646d2SAndroid Build Coastguard Worker * Grab ...
805*5e7646d2SAndroid Build Coastguard Worker */
806*5e7646d2SAndroid Build Coastguard Worker }
807*5e7646d2SAndroid Build Coastguard Worker #endif /* 0 */
808*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, ".\\\"#", 4))
809*5e7646d2SAndroid Build Coastguard Worker {
810*5e7646d2SAndroid Build Coastguard Worker /*
811*5e7646d2SAndroid Build Coastguard Worker * Anchor for HTML output...
812*5e7646d2SAndroid Build Coastguard Worker */
813*5e7646d2SAndroid Build Coastguard Worker
814*5e7646d2SAndroid Build Coastguard Worker strlcpy(anchor, line + 4, sizeof(anchor));
815*5e7646d2SAndroid Build Coastguard Worker }
816*5e7646d2SAndroid Build Coastguard Worker else if (strncmp(line, ".\\\"", 3))
817*5e7646d2SAndroid Build Coastguard Worker {
818*5e7646d2SAndroid Build Coastguard Worker /*
819*5e7646d2SAndroid Build Coastguard Worker * Unknown...
820*5e7646d2SAndroid Build Coastguard Worker */
821*5e7646d2SAndroid Build Coastguard Worker
822*5e7646d2SAndroid Build Coastguard Worker if ((lineptr = strchr(line, ' ')) != NULL)
823*5e7646d2SAndroid Build Coastguard Worker *lineptr = '\0';
824*5e7646d2SAndroid Build Coastguard Worker else if ((lineptr = strchr(line, '\n')) != NULL)
825*5e7646d2SAndroid Build Coastguard Worker *lineptr = '\0';
826*5e7646d2SAndroid Build Coastguard Worker
827*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d.\n", line, linenum);
828*5e7646d2SAndroid Build Coastguard Worker }
829*5e7646d2SAndroid Build Coastguard Worker
830*5e7646d2SAndroid Build Coastguard Worker /*
831*5e7646d2SAndroid Build Coastguard Worker * Skip continuation lines...
832*5e7646d2SAndroid Build Coastguard Worker */
833*5e7646d2SAndroid Build Coastguard Worker
834*5e7646d2SAndroid Build Coastguard Worker lineptr = line + strlen(line) - 1;
835*5e7646d2SAndroid Build Coastguard Worker if (lineptr >= line && *lineptr == '\\')
836*5e7646d2SAndroid Build Coastguard Worker {
837*5e7646d2SAndroid Build Coastguard Worker while (fgets(line, sizeof(line), infile))
838*5e7646d2SAndroid Build Coastguard Worker {
839*5e7646d2SAndroid Build Coastguard Worker linenum ++;
840*5e7646d2SAndroid Build Coastguard Worker lineptr = line + strlen(line) - 2;
841*5e7646d2SAndroid Build Coastguard Worker
842*5e7646d2SAndroid Build Coastguard Worker if (lineptr < line || *lineptr != '\\')
843*5e7646d2SAndroid Build Coastguard Worker break;
844*5e7646d2SAndroid Build Coastguard Worker }
845*5e7646d2SAndroid Build Coastguard Worker }
846*5e7646d2SAndroid Build Coastguard Worker }
847*5e7646d2SAndroid Build Coastguard Worker else
848*5e7646d2SAndroid Build Coastguard Worker {
849*5e7646d2SAndroid Build Coastguard Worker /*
850*5e7646d2SAndroid Build Coastguard Worker * Process man page text...
851*5e7646d2SAndroid Build Coastguard Worker */
852*5e7646d2SAndroid Build Coastguard Worker
853*5e7646d2SAndroid Build Coastguard Worker html_fputs(line, &font, outfile);
854*5e7646d2SAndroid Build Coastguard Worker putc('\n', outfile);
855*5e7646d2SAndroid Build Coastguard Worker
856*5e7646d2SAndroid Build Coastguard Worker if (post)
857*5e7646d2SAndroid Build Coastguard Worker {
858*5e7646d2SAndroid Build Coastguard Worker fputs(post, outfile);
859*5e7646d2SAndroid Build Coastguard Worker post = NULL;
860*5e7646d2SAndroid Build Coastguard Worker }
861*5e7646d2SAndroid Build Coastguard Worker }
862*5e7646d2SAndroid Build Coastguard Worker }
863*5e7646d2SAndroid Build Coastguard Worker
864*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "%s\n", end_fonts[font]);
865*5e7646d2SAndroid Build Coastguard Worker font = 0;
866*5e7646d2SAndroid Build Coastguard Worker
867*5e7646d2SAndroid Build Coastguard Worker if (list)
868*5e7646d2SAndroid Build Coastguard Worker {
869*5e7646d2SAndroid Build Coastguard Worker fprintf(outfile, "</%s>\n", list);
870*5e7646d2SAndroid Build Coastguard Worker list = NULL;
871*5e7646d2SAndroid Build Coastguard Worker }
872*5e7646d2SAndroid Build Coastguard Worker
873*5e7646d2SAndroid Build Coastguard Worker fputs("</body>\n"
874*5e7646d2SAndroid Build Coastguard Worker "</html>\n", outfile);
875*5e7646d2SAndroid Build Coastguard Worker
876*5e7646d2SAndroid Build Coastguard Worker /*
877*5e7646d2SAndroid Build Coastguard Worker * Close files...
878*5e7646d2SAndroid Build Coastguard Worker */
879*5e7646d2SAndroid Build Coastguard Worker
880*5e7646d2SAndroid Build Coastguard Worker if (infile != stdin)
881*5e7646d2SAndroid Build Coastguard Worker fclose(infile);
882*5e7646d2SAndroid Build Coastguard Worker
883*5e7646d2SAndroid Build Coastguard Worker if (outfile != stdout)
884*5e7646d2SAndroid Build Coastguard Worker fclose(outfile);
885*5e7646d2SAndroid Build Coastguard Worker
886*5e7646d2SAndroid Build Coastguard Worker /*
887*5e7646d2SAndroid Build Coastguard Worker * Return with no errors...
888*5e7646d2SAndroid Build Coastguard Worker */
889*5e7646d2SAndroid Build Coastguard Worker
890*5e7646d2SAndroid Build Coastguard Worker return (0);
891*5e7646d2SAndroid Build Coastguard Worker }
892*5e7646d2SAndroid Build Coastguard Worker
893*5e7646d2SAndroid Build Coastguard Worker
894*5e7646d2SAndroid Build Coastguard Worker /*
895*5e7646d2SAndroid Build Coastguard Worker * 'html_alternate()' - Alternate words between two styles of text.
896*5e7646d2SAndroid Build Coastguard Worker */
897*5e7646d2SAndroid Build Coastguard Worker
898*5e7646d2SAndroid Build Coastguard Worker static void
html_alternate(const char * s,const char * first,const char * second,FILE * fp)899*5e7646d2SAndroid Build Coastguard Worker html_alternate(const char *s, /* I - String */
900*5e7646d2SAndroid Build Coastguard Worker const char *first, /* I - First style or NULL */
901*5e7646d2SAndroid Build Coastguard Worker const char *second, /* I - Second style of NULL */
902*5e7646d2SAndroid Build Coastguard Worker FILE *fp) /* I - File */
903*5e7646d2SAndroid Build Coastguard Worker {
904*5e7646d2SAndroid Build Coastguard Worker int i = 0; /* Which style */
905*5e7646d2SAndroid Build Coastguard Worker int quote = 0; /* Saw quote? */
906*5e7646d2SAndroid Build Coastguard Worker int dolinks, /* Do hyperlinks to other man pages? */
907*5e7646d2SAndroid Build Coastguard Worker link = 0; /* Doing a link now? */
908*5e7646d2SAndroid Build Coastguard Worker
909*5e7646d2SAndroid Build Coastguard Worker
910*5e7646d2SAndroid Build Coastguard Worker /*
911*5e7646d2SAndroid Build Coastguard Worker * Skip leading whitespace...
912*5e7646d2SAndroid Build Coastguard Worker */
913*5e7646d2SAndroid Build Coastguard Worker
914*5e7646d2SAndroid Build Coastguard Worker while (isspace(*s & 255))
915*5e7646d2SAndroid Build Coastguard Worker s ++;
916*5e7646d2SAndroid Build Coastguard Worker
917*5e7646d2SAndroid Build Coastguard Worker dolinks = first && !strcmp(first, "b") && !second;
918*5e7646d2SAndroid Build Coastguard Worker
919*5e7646d2SAndroid Build Coastguard Worker while (*s)
920*5e7646d2SAndroid Build Coastguard Worker {
921*5e7646d2SAndroid Build Coastguard Worker if (!i && dolinks)
922*5e7646d2SAndroid Build Coastguard Worker {
923*5e7646d2SAndroid Build Coastguard Worker /*
924*5e7646d2SAndroid Build Coastguard Worker * See if we need to make a link to a man page...
925*5e7646d2SAndroid Build Coastguard Worker */
926*5e7646d2SAndroid Build Coastguard Worker
927*5e7646d2SAndroid Build Coastguard Worker const char *end; /* End of current word */
928*5e7646d2SAndroid Build Coastguard Worker const char *next; /* Start of next word */
929*5e7646d2SAndroid Build Coastguard Worker
930*5e7646d2SAndroid Build Coastguard Worker for (end = s; *end && !isspace(*end & 255); end ++);
931*5e7646d2SAndroid Build Coastguard Worker for (next = end; isspace(*next & 255); next ++);
932*5e7646d2SAndroid Build Coastguard Worker
933*5e7646d2SAndroid Build Coastguard Worker if (isalnum(*s & 255) && *next == '(')
934*5e7646d2SAndroid Build Coastguard Worker {
935*5e7646d2SAndroid Build Coastguard Worker /*
936*5e7646d2SAndroid Build Coastguard Worker * See if the man file is available locally...
937*5e7646d2SAndroid Build Coastguard Worker */
938*5e7646d2SAndroid Build Coastguard Worker
939*5e7646d2SAndroid Build Coastguard Worker char name[1024], /* Name */
940*5e7646d2SAndroid Build Coastguard Worker manfile[1024], /* Man page filename */
941*5e7646d2SAndroid Build Coastguard Worker manurl[1024]; /* Man page URL */
942*5e7646d2SAndroid Build Coastguard Worker
943*5e7646d2SAndroid Build Coastguard Worker strlcpy(name, s, sizeof(name));
944*5e7646d2SAndroid Build Coastguard Worker if ((size_t)(end - s) < sizeof(name))
945*5e7646d2SAndroid Build Coastguard Worker name[end - s] = '\0';
946*5e7646d2SAndroid Build Coastguard Worker
947*5e7646d2SAndroid Build Coastguard Worker snprintf(manfile, sizeof(manfile), "%s.man", name);
948*5e7646d2SAndroid Build Coastguard Worker snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages", name);
949*5e7646d2SAndroid Build Coastguard Worker
950*5e7646d2SAndroid Build Coastguard Worker if (!access(manfile, 0))
951*5e7646d2SAndroid Build Coastguard Worker {
952*5e7646d2SAndroid Build Coastguard Worker /*
953*5e7646d2SAndroid Build Coastguard Worker * Local man page, do a link...
954*5e7646d2SAndroid Build Coastguard Worker */
955*5e7646d2SAndroid Build Coastguard Worker
956*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "<a href=\"%s\">", manurl);
957*5e7646d2SAndroid Build Coastguard Worker link = 1;
958*5e7646d2SAndroid Build Coastguard Worker }
959*5e7646d2SAndroid Build Coastguard Worker }
960*5e7646d2SAndroid Build Coastguard Worker }
961*5e7646d2SAndroid Build Coastguard Worker
962*5e7646d2SAndroid Build Coastguard Worker if (!i && first)
963*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "<%s>", first);
964*5e7646d2SAndroid Build Coastguard Worker else if (i && second)
965*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "<%s>", second);
966*5e7646d2SAndroid Build Coastguard Worker
967*5e7646d2SAndroid Build Coastguard Worker while ((!isspace(*s & 255) || quote) && *s)
968*5e7646d2SAndroid Build Coastguard Worker {
969*5e7646d2SAndroid Build Coastguard Worker if (*s == '\"')
970*5e7646d2SAndroid Build Coastguard Worker quote = !quote;
971*5e7646d2SAndroid Build Coastguard Worker
972*5e7646d2SAndroid Build Coastguard Worker if (*s == '\\' && s[1])
973*5e7646d2SAndroid Build Coastguard Worker {
974*5e7646d2SAndroid Build Coastguard Worker s ++;
975*5e7646d2SAndroid Build Coastguard Worker html_putc(*s++, fp);
976*5e7646d2SAndroid Build Coastguard Worker }
977*5e7646d2SAndroid Build Coastguard Worker else
978*5e7646d2SAndroid Build Coastguard Worker html_putc(*s++, fp);
979*5e7646d2SAndroid Build Coastguard Worker }
980*5e7646d2SAndroid Build Coastguard Worker
981*5e7646d2SAndroid Build Coastguard Worker if (!i && first)
982*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "</%s>", first);
983*5e7646d2SAndroid Build Coastguard Worker else if (i && second)
984*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "</%s>", second);
985*5e7646d2SAndroid Build Coastguard Worker
986*5e7646d2SAndroid Build Coastguard Worker if (i && link)
987*5e7646d2SAndroid Build Coastguard Worker {
988*5e7646d2SAndroid Build Coastguard Worker fputs("</a>", fp);
989*5e7646d2SAndroid Build Coastguard Worker link = 0;
990*5e7646d2SAndroid Build Coastguard Worker }
991*5e7646d2SAndroid Build Coastguard Worker
992*5e7646d2SAndroid Build Coastguard Worker i = 1 - i;
993*5e7646d2SAndroid Build Coastguard Worker
994*5e7646d2SAndroid Build Coastguard Worker /*
995*5e7646d2SAndroid Build Coastguard Worker * Skip trailing whitespace...
996*5e7646d2SAndroid Build Coastguard Worker */
997*5e7646d2SAndroid Build Coastguard Worker
998*5e7646d2SAndroid Build Coastguard Worker while (isspace(*s & 255))
999*5e7646d2SAndroid Build Coastguard Worker s ++;
1000*5e7646d2SAndroid Build Coastguard Worker }
1001*5e7646d2SAndroid Build Coastguard Worker
1002*5e7646d2SAndroid Build Coastguard Worker putc('\n', fp);
1003*5e7646d2SAndroid Build Coastguard Worker }
1004*5e7646d2SAndroid Build Coastguard Worker
1005*5e7646d2SAndroid Build Coastguard Worker /*
1006*5e7646d2SAndroid Build Coastguard Worker * 'html_fputs()' - Output a string, quoting as needed HTML entities.
1007*5e7646d2SAndroid Build Coastguard Worker */
1008*5e7646d2SAndroid Build Coastguard Worker
1009*5e7646d2SAndroid Build Coastguard Worker static void
html_fputs(const char * s,int * font,FILE * fp)1010*5e7646d2SAndroid Build Coastguard Worker html_fputs(const char *s, /* I - String */
1011*5e7646d2SAndroid Build Coastguard Worker int *font, /* IO - Font */
1012*5e7646d2SAndroid Build Coastguard Worker FILE *fp) /* I - File */
1013*5e7646d2SAndroid Build Coastguard Worker {
1014*5e7646d2SAndroid Build Coastguard Worker while (*s)
1015*5e7646d2SAndroid Build Coastguard Worker {
1016*5e7646d2SAndroid Build Coastguard Worker if (*s == '\\')
1017*5e7646d2SAndroid Build Coastguard Worker {
1018*5e7646d2SAndroid Build Coastguard Worker s ++;
1019*5e7646d2SAndroid Build Coastguard Worker if (!*s)
1020*5e7646d2SAndroid Build Coastguard Worker break;
1021*5e7646d2SAndroid Build Coastguard Worker
1022*5e7646d2SAndroid Build Coastguard Worker if (*s == 'f')
1023*5e7646d2SAndroid Build Coastguard Worker {
1024*5e7646d2SAndroid Build Coastguard Worker int newfont; /* New font */
1025*5e7646d2SAndroid Build Coastguard Worker
1026*5e7646d2SAndroid Build Coastguard Worker s ++;
1027*5e7646d2SAndroid Build Coastguard Worker if (!*s)
1028*5e7646d2SAndroid Build Coastguard Worker break;
1029*5e7646d2SAndroid Build Coastguard Worker
1030*5e7646d2SAndroid Build Coastguard Worker if (!font)
1031*5e7646d2SAndroid Build Coastguard Worker {
1032*5e7646d2SAndroid Build Coastguard Worker s ++;
1033*5e7646d2SAndroid Build Coastguard Worker continue;
1034*5e7646d2SAndroid Build Coastguard Worker }
1035*5e7646d2SAndroid Build Coastguard Worker
1036*5e7646d2SAndroid Build Coastguard Worker switch (*s++)
1037*5e7646d2SAndroid Build Coastguard Worker {
1038*5e7646d2SAndroid Build Coastguard Worker case 'R' :
1039*5e7646d2SAndroid Build Coastguard Worker case 'P' :
1040*5e7646d2SAndroid Build Coastguard Worker newfont = 0;
1041*5e7646d2SAndroid Build Coastguard Worker break;
1042*5e7646d2SAndroid Build Coastguard Worker
1043*5e7646d2SAndroid Build Coastguard Worker case 'b' :
1044*5e7646d2SAndroid Build Coastguard Worker case 'B' :
1045*5e7646d2SAndroid Build Coastguard Worker newfont = 1;
1046*5e7646d2SAndroid Build Coastguard Worker break;
1047*5e7646d2SAndroid Build Coastguard Worker
1048*5e7646d2SAndroid Build Coastguard Worker case 'i' :
1049*5e7646d2SAndroid Build Coastguard Worker case 'I' :
1050*5e7646d2SAndroid Build Coastguard Worker newfont = 2;
1051*5e7646d2SAndroid Build Coastguard Worker break;
1052*5e7646d2SAndroid Build Coastguard Worker
1053*5e7646d2SAndroid Build Coastguard Worker default :
1054*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "mantohtml: Unknown font \"\\f%c\" ignored.\n", s[-1]);
1055*5e7646d2SAndroid Build Coastguard Worker newfont = *font;
1056*5e7646d2SAndroid Build Coastguard Worker break;
1057*5e7646d2SAndroid Build Coastguard Worker }
1058*5e7646d2SAndroid Build Coastguard Worker
1059*5e7646d2SAndroid Build Coastguard Worker if (newfont != *font)
1060*5e7646d2SAndroid Build Coastguard Worker {
1061*5e7646d2SAndroid Build Coastguard Worker fputs(end_fonts[*font], fp);
1062*5e7646d2SAndroid Build Coastguard Worker *font = newfont;
1063*5e7646d2SAndroid Build Coastguard Worker fputs(start_fonts[*font], fp);
1064*5e7646d2SAndroid Build Coastguard Worker }
1065*5e7646d2SAndroid Build Coastguard Worker }
1066*5e7646d2SAndroid Build Coastguard Worker else if (*s == '*')
1067*5e7646d2SAndroid Build Coastguard Worker {
1068*5e7646d2SAndroid Build Coastguard Worker /*
1069*5e7646d2SAndroid Build Coastguard Worker * Substitute macro...
1070*5e7646d2SAndroid Build Coastguard Worker */
1071*5e7646d2SAndroid Build Coastguard Worker
1072*5e7646d2SAndroid Build Coastguard Worker s ++;
1073*5e7646d2SAndroid Build Coastguard Worker if (!*s)
1074*5e7646d2SAndroid Build Coastguard Worker break;
1075*5e7646d2SAndroid Build Coastguard Worker
1076*5e7646d2SAndroid Build Coastguard Worker switch (*s++)
1077*5e7646d2SAndroid Build Coastguard Worker {
1078*5e7646d2SAndroid Build Coastguard Worker case 'R' :
1079*5e7646d2SAndroid Build Coastguard Worker fputs("®", fp);
1080*5e7646d2SAndroid Build Coastguard Worker break;
1081*5e7646d2SAndroid Build Coastguard Worker
1082*5e7646d2SAndroid Build Coastguard Worker case '(' :
1083*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(s, "lq", 2))
1084*5e7646d2SAndroid Build Coastguard Worker fputs("“", fp);
1085*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "rq", 2))
1086*5e7646d2SAndroid Build Coastguard Worker fputs("”", fp);
1087*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "Tm", 2))
1088*5e7646d2SAndroid Build Coastguard Worker fputs("<sup>TM</sup>", fp);
1089*5e7646d2SAndroid Build Coastguard Worker else
1090*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "mantohtml: Unknown macro \"\\*(%2s\" ignored.\n", s);
1091*5e7646d2SAndroid Build Coastguard Worker
1092*5e7646d2SAndroid Build Coastguard Worker if (*s)
1093*5e7646d2SAndroid Build Coastguard Worker s ++;
1094*5e7646d2SAndroid Build Coastguard Worker if (*s)
1095*5e7646d2SAndroid Build Coastguard Worker s ++;
1096*5e7646d2SAndroid Build Coastguard Worker break;
1097*5e7646d2SAndroid Build Coastguard Worker
1098*5e7646d2SAndroid Build Coastguard Worker default :
1099*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "mantohtml: Unknown macro \"\\*%c\" ignored.\n", s[-1]);
1100*5e7646d2SAndroid Build Coastguard Worker break;
1101*5e7646d2SAndroid Build Coastguard Worker }
1102*5e7646d2SAndroid Build Coastguard Worker }
1103*5e7646d2SAndroid Build Coastguard Worker else if (*s == '(')
1104*5e7646d2SAndroid Build Coastguard Worker {
1105*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(s, "(em", 3))
1106*5e7646d2SAndroid Build Coastguard Worker {
1107*5e7646d2SAndroid Build Coastguard Worker fputs("—", fp);
1108*5e7646d2SAndroid Build Coastguard Worker s += 3;
1109*5e7646d2SAndroid Build Coastguard Worker }
1110*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "(en", 3))
1111*5e7646d2SAndroid Build Coastguard Worker {
1112*5e7646d2SAndroid Build Coastguard Worker fputs("–", fp);
1113*5e7646d2SAndroid Build Coastguard Worker s += 3;
1114*5e7646d2SAndroid Build Coastguard Worker }
1115*5e7646d2SAndroid Build Coastguard Worker else
1116*5e7646d2SAndroid Build Coastguard Worker {
1117*5e7646d2SAndroid Build Coastguard Worker putc(*s, fp);
1118*5e7646d2SAndroid Build Coastguard Worker s ++;
1119*5e7646d2SAndroid Build Coastguard Worker }
1120*5e7646d2SAndroid Build Coastguard Worker }
1121*5e7646d2SAndroid Build Coastguard Worker else if (*s == '[')
1122*5e7646d2SAndroid Build Coastguard Worker {
1123*5e7646d2SAndroid Build Coastguard Worker /*
1124*5e7646d2SAndroid Build Coastguard Worker * Substitute escaped character...
1125*5e7646d2SAndroid Build Coastguard Worker */
1126*5e7646d2SAndroid Build Coastguard Worker
1127*5e7646d2SAndroid Build Coastguard Worker s ++;
1128*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(s, "co]", 3))
1129*5e7646d2SAndroid Build Coastguard Worker fputs("©", fp);
1130*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "de]", 3))
1131*5e7646d2SAndroid Build Coastguard Worker fputs("°", fp);
1132*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "rg]", 3))
1133*5e7646d2SAndroid Build Coastguard Worker fputs("®", fp);
1134*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "tm]", 3))
1135*5e7646d2SAndroid Build Coastguard Worker fputs("<sup>TM</sup>", fp);
1136*5e7646d2SAndroid Build Coastguard Worker
1137*5e7646d2SAndroid Build Coastguard Worker if (*s)
1138*5e7646d2SAndroid Build Coastguard Worker s ++;
1139*5e7646d2SAndroid Build Coastguard Worker if (*s)
1140*5e7646d2SAndroid Build Coastguard Worker s ++;
1141*5e7646d2SAndroid Build Coastguard Worker if (*s)
1142*5e7646d2SAndroid Build Coastguard Worker s ++;
1143*5e7646d2SAndroid Build Coastguard Worker }
1144*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(s[0]) && isdigit(s[1]) &&
1145*5e7646d2SAndroid Build Coastguard Worker isdigit(s[2]))
1146*5e7646d2SAndroid Build Coastguard Worker {
1147*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "&#%d;", ((s[0] - '0') * 8 + s[1] - '0') * 8 + s[2] - '0');
1148*5e7646d2SAndroid Build Coastguard Worker s += 3;
1149*5e7646d2SAndroid Build Coastguard Worker }
1150*5e7646d2SAndroid Build Coastguard Worker else
1151*5e7646d2SAndroid Build Coastguard Worker {
1152*5e7646d2SAndroid Build Coastguard Worker if (*s != '\\' && *s != '\"' && *s != '\'' && *s != '-')
1153*5e7646d2SAndroid Build Coastguard Worker {
1154*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "mantohtml: Unrecognized escape \"\\%c\" ignored.\n", *s);
1155*5e7646d2SAndroid Build Coastguard Worker html_putc('\\', fp);
1156*5e7646d2SAndroid Build Coastguard Worker }
1157*5e7646d2SAndroid Build Coastguard Worker
1158*5e7646d2SAndroid Build Coastguard Worker html_putc(*s++, fp);
1159*5e7646d2SAndroid Build Coastguard Worker }
1160*5e7646d2SAndroid Build Coastguard Worker }
1161*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(s, "http://", 7) || !strncmp(s, "https://", 8) || !strncmp(s, "ftp://", 6))
1162*5e7646d2SAndroid Build Coastguard Worker {
1163*5e7646d2SAndroid Build Coastguard Worker /*
1164*5e7646d2SAndroid Build Coastguard Worker * Embed URL...
1165*5e7646d2SAndroid Build Coastguard Worker */
1166*5e7646d2SAndroid Build Coastguard Worker
1167*5e7646d2SAndroid Build Coastguard Worker char temp[1024]; /* Temporary string */
1168*5e7646d2SAndroid Build Coastguard Worker const char *end = s + 6; /* End of URL */
1169*5e7646d2SAndroid Build Coastguard Worker
1170*5e7646d2SAndroid Build Coastguard Worker while (*end && !isspace(*end & 255))
1171*5e7646d2SAndroid Build Coastguard Worker end ++;
1172*5e7646d2SAndroid Build Coastguard Worker
1173*5e7646d2SAndroid Build Coastguard Worker if (end[-1] == ',' || end[-1] == '.' || end[-1] == ')')
1174*5e7646d2SAndroid Build Coastguard Worker end --;
1175*5e7646d2SAndroid Build Coastguard Worker
1176*5e7646d2SAndroid Build Coastguard Worker strlcpy(temp, s, sizeof(temp));
1177*5e7646d2SAndroid Build Coastguard Worker if ((size_t)(end -s) < sizeof(temp))
1178*5e7646d2SAndroid Build Coastguard Worker temp[end - s] = '\0';
1179*5e7646d2SAndroid Build Coastguard Worker
1180*5e7646d2SAndroid Build Coastguard Worker fprintf(fp, "<a href=\"%s\">%s</a>", temp, temp);
1181*5e7646d2SAndroid Build Coastguard Worker s = end;
1182*5e7646d2SAndroid Build Coastguard Worker }
1183*5e7646d2SAndroid Build Coastguard Worker else
1184*5e7646d2SAndroid Build Coastguard Worker html_putc(*s++ & 255, fp);
1185*5e7646d2SAndroid Build Coastguard Worker }
1186*5e7646d2SAndroid Build Coastguard Worker }
1187*5e7646d2SAndroid Build Coastguard Worker
1188*5e7646d2SAndroid Build Coastguard Worker
1189*5e7646d2SAndroid Build Coastguard Worker /*
1190*5e7646d2SAndroid Build Coastguard Worker * 'html_putc()' - Put a single character, using entities as needed.
1191*5e7646d2SAndroid Build Coastguard Worker */
1192*5e7646d2SAndroid Build Coastguard Worker
1193*5e7646d2SAndroid Build Coastguard Worker static void
html_putc(int ch,FILE * fp)1194*5e7646d2SAndroid Build Coastguard Worker html_putc(int ch, /* I - Character */
1195*5e7646d2SAndroid Build Coastguard Worker FILE *fp) /* I - File */
1196*5e7646d2SAndroid Build Coastguard Worker {
1197*5e7646d2SAndroid Build Coastguard Worker if (ch == '&')
1198*5e7646d2SAndroid Build Coastguard Worker fputs("&", fp);
1199*5e7646d2SAndroid Build Coastguard Worker else if (ch == '<')
1200*5e7646d2SAndroid Build Coastguard Worker fputs("<", fp);
1201*5e7646d2SAndroid Build Coastguard Worker else
1202*5e7646d2SAndroid Build Coastguard Worker putc(ch, fp);
1203*5e7646d2SAndroid Build Coastguard Worker }
1204*5e7646d2SAndroid Build Coastguard Worker
1205*5e7646d2SAndroid Build Coastguard Worker
1206*5e7646d2SAndroid Build Coastguard Worker /*
1207*5e7646d2SAndroid Build Coastguard Worker * 'strmove()' - Move characters within a string.
1208*5e7646d2SAndroid Build Coastguard Worker */
1209*5e7646d2SAndroid Build Coastguard Worker
1210*5e7646d2SAndroid Build Coastguard Worker static void
strmove(char * d,const char * s)1211*5e7646d2SAndroid Build Coastguard Worker strmove(char *d, /* I - Destination */
1212*5e7646d2SAndroid Build Coastguard Worker const char *s) /* I - Source */
1213*5e7646d2SAndroid Build Coastguard Worker {
1214*5e7646d2SAndroid Build Coastguard Worker while (*s)
1215*5e7646d2SAndroid Build Coastguard Worker *d++ = *s++;
1216*5e7646d2SAndroid Build Coastguard Worker
1217*5e7646d2SAndroid Build Coastguard Worker *d = '\0';
1218*5e7646d2SAndroid Build Coastguard Worker }
1219