xref: /aosp_15_r20/external/libcups/man/mantohtml.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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, &section);
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("&reg;", 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("&ldquo;", fp);
1085*5e7646d2SAndroid Build Coastguard Worker 	      else if (!strncmp(s, "rq", 2))
1086*5e7646d2SAndroid Build Coastguard Worker 		fputs("&rdquo;", 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("&mdash;", 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("&ndash;", 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("&copy;", fp);
1130*5e7646d2SAndroid Build Coastguard Worker 	else if (!strncmp(s, "de]", 3))
1131*5e7646d2SAndroid Build Coastguard Worker 	  fputs("&deg;", fp);
1132*5e7646d2SAndroid Build Coastguard Worker         else if (!strncmp(s, "rg]", 3))
1133*5e7646d2SAndroid Build Coastguard Worker 	  fputs("&reg;", 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("&amp;", fp);
1199*5e7646d2SAndroid Build Coastguard Worker   else if (ch == '<')
1200*5e7646d2SAndroid Build Coastguard Worker     fputs("&lt;", 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