1 | /***************************************
2 | $Header: /home/amb/cxref/RCS/html.c 1.33 1999/06/25 18:12:41 amb Exp $
3 |
4 | C Cross Referencing & Documentation tool. Version 1.5b.
5 |
6 | Writes the HTML output.
7 | ******************/ /******************
8 | Written by Andrew M. Bishop
9 |
10 | This file Copyright 1995,96,97,98,99 Andrew M. Bishop
11 | It may be distributed under the GNU Public License, version 2, or
12 | any higher version. See section COPYING of the GNU Public license
13 | for conditions under which this file may be redistributed.
14 | ***************************************/
15 |
16 | #include <stdlib.h>
17 | #include <stdio.h>
18 | #include <string.h>
19 | #include <sys/types.h>
20 | #include <sys/stat.h>
21 | #include <unistd.h>
22 |
23 | #include "memory.h"
24 | #include "datatype.h"
25 | #include "cxref.h"
26 |
27 | /*+ The file extension to use for the output files. +*/
28 | #define HTML_FILE ".html"
29 | #define HTML_FILE_BACKUP ".html~"
30 |
31 | /*+ The file extension to use for the output source files. +*/
32 | #define HTML_SRC_FILE ".src.html"
33 |
34 | /*+ The name of the output tex file that contains the appendix. +*/
35 | #define HTML_APDX ".apdx"
36 |
37 | /*+ A macro to determine the HTML version we should produce. +*/
38 | #define HTML20 (option_html&1)
39 | #define HTML32 (option_html&2)
40 | #define HTMLSRC (option_html&16)
41 |
42 | /*+ The comments are to be inserted verbatim. +*/
43 | extern int option_verbatim_comments;
44 |
45 | /*+ The type of HTML output to produce. +*/
46 | extern int option_html;
47 |
48 | /*+ The name of the directory for the output. +*/
49 | extern char* option_odir;
50 |
51 | /*+ The base name of the file for the output. +*/
52 | extern char* option_name;
53 |
54 | /*+ The information about the cxref run, +*/
55 | extern char *run_command, /*+ the command line options. +*/
56 | *run_cpp_command; /*+ the cpp command and options. +*/
57 |
58 | /*+ The directories to go back to get to the base output directory. +*/
59 | static char* goback=NULL;
60 |
61 | static void WriteHTMLFilePart(File file);
62 | static void WriteHTMLInclude(Include inc);
63 | static void WriteHTMLSubInclude(Include inc,int depth);
64 | static void WriteHTMLDefine(Define def);
65 | static void WriteHTMLTypedef(Typedef type);
66 | static void WriteHTMLStructUnion(StructUnion su,int depth);
67 | static void WriteHTMLVariable(Variable var);
68 | static void WriteHTMLFunction(Function func);
69 |
70 | static void WriteHTMLDocument(char* name,int appendix);
71 | static void WriteHTMLPreamble(FILE* f,char* title,int sourcefile);
72 | static void WriteHTMLPostamble(FILE* f,int sourcefile);
73 |
74 | void WriteHTMLSource(char *name);
75 |
76 | static char* html(char* c,int verbatim);
77 |
78 | /*+ The output file for the HTML. +*/
79 | static FILE* of;
80 |
81 | /*+ The name of the file. +*/
82 | static char *filename;
83 |
84 |
85 | /*++++++++++++++++++++++++++++++++++++++
86 | Write an html file for a complete File structure and all components.
87 |
88 | File file The File structure to output.
89 | ++++++++++++++++++++++++++++++++++++++*/
90 |
91 | void WriteHTMLFile(File file)
92 | {
93 | char* ofile;
94 | int i;
95 |
96 | filename=file->name;
97 |
98 | /* Write the including file. */
99 |
100 | WriteHTMLDocument(file->name,0);
101 |
102 | /* Open the file */
103 |
104 | ofile=ConcatStrings(4,option_odir,"/",file->name,HTML_FILE);
105 |
106 | of=fopen(ofile,"w");
107 | if(!of)
108 | {
109 | struct stat stat_buf;
110 | int i,ofl=strlen(ofile);
111 |
112 | for(i=strlen(option_odir)+1;i<ofl;i++)
113 | if(ofile[i]=='/')
114 | {
115 | ofile[i]=0;
116 | if(stat(ofile,&stat_buf))
117 | mkdir(ofile,S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
118 | ofile[i]='/';
119 | }
120 |
121 | of=fopen(ofile,"w");
122 | }
123 |
124 | if(!of)
125 | {fprintf(stderr,"cxref: Failed to open the HTML output file '%s'\n",ofile);exit(1);}
126 |
127 | for(goback="",i=strlen(file->name);i>0;i--)
128 | if(file->name[i]=='/')
129 | goback=ConcatStrings(2,goback,"../");
130 |
131 | /* Write out a header. */
132 |
133 | WriteHTMLPreamble(of,ConcatStrings(5,"Cross reference for ",file->name," of ",option_name,"."),0);
134 |
135 | /*+ The file structure is broken into its components and they are each written out. +*/
136 |
137 | WriteHTMLFilePart(file);
138 |
139 | if(file->includes)
140 | {
141 | Include inc =file->includes;
142 | fprintf(of,"\n<hr>\n<h2>Included Files</h2>\n\n");
143 | do{
144 | WriteHTMLInclude(inc);
145 | }
146 | while((inc=inc->next));
147 | }
148 |
149 | if(file->defines)
150 | {
151 | Define def =file->defines;
152 | fprintf(of,"\n<hr>\n<h2>Preprocessor definitions</h2>\n\n");
153 | do{
154 | if(def!=file->defines)
155 | fprintf(of,"<p>\n");
156 | WriteHTMLDefine(def);
157 | }
158 | while((def=def->next));
159 | }
160 |
161 | if(file->typedefs)
162 | {
163 | Typedef type=file->typedefs;
164 | do{
165 | WriteHTMLTypedef(type);
166 | }
167 | while((type=type->next));
168 | }
169 |
170 | if(file->variables)
171 | {
172 | int any_to_mention=0;
173 | Variable var=file->variables;
174 |
175 | do{
176 | if(var->scope&(GLOBAL|LOCAL|EXTERNAL|EXTERN_F))
177 | any_to_mention=1;
178 | }
179 | while((var=var->next));
180 |
181 | if(any_to_mention)
182 | {
183 | int first_ext=1,first_local=1;
184 | Variable var=file->variables;
185 | do{
186 | if(var->scope&GLOBAL)
187 | WriteHTMLVariable(var);
188 | }
189 | while((var=var->next));
190 | var=file->variables;
191 | do{
192 | if(var->scope&(EXTERNAL|EXTERN_F) && !(var->scope&GLOBAL))
193 | {
194 | if(first_ext)
195 | {fprintf(of,"\n<hr>\n<h2>External Variables</h2>\n\n"); first_ext=0;}
196 | else
197 | fprintf(of,"<p>\n");
198 | WriteHTMLVariable(var);
199 | }
200 | }
201 | while((var=var->next));
202 | var=file->variables;
203 | do{
204 | if(var->scope&LOCAL)
205 | {
206 | if(first_local)
207 | {fprintf(of,"\n<hr>\n<h2>Local Variables</h2>\n\n"); first_local=0;}
208 | else
209 | fprintf(of,"<p>\n");
210 | WriteHTMLVariable(var);
211 | }
212 | }
213 | while((var=var->next));
214 | }
215 | }
216 |
217 | if(file->functions)
218 | {
219 | Function func=file->functions;
220 | do{
221 | if(func->scope&(GLOBAL|EXTERNAL))
222 | WriteHTMLFunction(func);
223 | }
224 | while((func=func->next));
225 | func=file->functions;
226 | do{
227 | if(func->scope&LOCAL)
228 | WriteHTMLFunction(func);
229 | }
230 | while((func=func->next));
231 | }
232 |
233 | WriteHTMLPostamble(of,0);
234 |
235 | fclose(of);
236 |
237 | /* Write out the source file. */
238 |
239 | if(HTMLSRC)
240 | WriteHTMLSource(file->name);
241 |
242 | /* Clear the memory in html() */
243 |
244 | html(NULL,0); html(NULL,0); html(NULL,0); html(NULL,0);
245 | }
246 |
247 |
248 | /*++++++++++++++++++++++++++++++++++++++
249 | Write a File structure out.
250 |
251 | File file The File to output.
252 | ++++++++++++++++++++++++++++++++++++++*/
253 |
254 | static void WriteHTMLFilePart(File file)
255 | {
256 | int i;
257 |
258 | if(HTMLSRC)
259 | fprintf(of,"<h1><a name=\"file\" href=\"%s%s%s\">File %s</a></h1>\n",goback,file->name,HTML_SRC_FILE,html(file->name,0));
260 | else
261 | fprintf(of,"<h1><a name=\"file\">File %s</a></h1>\n",html(file->name,0));
262 |
263 | if(file->comment)
264 | if(option_verbatim_comments)
265 | fprintf(of,"<pre>\n%s\n</pre>\n\n",html(file->comment,0));
266 | else
267 | {
268 | char *rcs1=strstr(file->comment,"$Header"),*rcs2=NULL;
269 | if(rcs1)
270 | {
271 | rcs2=strstr(&rcs1[1],"$");
272 | if(rcs2)
273 | {
274 | rcs2[0]=0;
275 | fprintf(of,"<b>RCS %s</b>\n<p>\n",html(&rcs1[1],0));
276 | rcs2[0]='$';
277 | }
278 | }
279 | if(rcs2)
280 | fprintf(of,"%s\n<p>\n",html(&rcs2[2],0));
281 | else
282 | fprintf(of,"%s\n<p>\n",html(file->comment,0));
283 | }
284 |
285 | if(file->inc_in->n)
286 | {
287 | int i;
288 |
289 | if(HTML20)
290 | fprintf(of,"<dl compact>\n");
291 | else
292 | fprintf(of,"<table>\n");
293 | for(i=0;i<file->inc_in->n;i++)
294 | {
295 | if(HTML20 && i==0)
296 | fprintf(of,"<dt>Included in:\n<dd><ul>\n");
297 | else if(HTML32 && i==0)
298 | fprintf(of,"<tr><td>Included in:\n");
299 | else if(HTML32)
300 | fprintf(of,"<tr><td> \n");
301 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#file\">%s</a><br>\n",HTML20?"li":"td",goback,file->inc_in->s[i],html(file->inc_in->s[i],0));
302 | }
303 | if(HTML20)
304 | fprintf(of,"</ul>\n</dl>\n");
305 | else
306 | fprintf(of,"</table>\n");
307 | }
308 |
309 | if(file->f_refs->n || file->v_refs->n)
310 | if(HTML20)
311 | fprintf(of,"<dl compact>\n");
312 | else
313 | fprintf(of,"<table>\n");
314 |
315 | if(file->f_refs->n)
316 | {
317 | int others=0;
318 |
319 | if(HTML20)
320 | fprintf(of,"<dt>References Functions:\n<dd><ul>\n");
321 | else
322 | fprintf(of,"<tr><td>References Functions:\n");
323 |
324 | for(i=0;i<file->f_refs->n;i++)
325 | if(file->f_refs->s2[i])
326 | {
327 | if(HTML32 && i!=others)
328 | fprintf(of,"<tr><td> \n");
329 | if(HTML20)
330 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,file->f_refs->s2[i],file->f_refs->s1[i],html(file->f_refs->s1[i],0),html(file->f_refs->s2[i],0));
331 | else
332 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,file->f_refs->s2[i],file->f_refs->s1[i],html(file->f_refs->s1[i],0),goback,file->f_refs->s2[i],file->f_refs->s1[i],html(file-333 | >f_refs->s2[i],0));
334 | }
335 | else
336 | others++;
337 |
338 | if(others)
339 | {
340 | if(HTML20)
341 | fprintf(of,"<li>");
342 | else if(i==others)
343 | fprintf(of,"<td colspan=2>");
344 | else
345 | fprintf(of,"<tr><td> \n<td colspan=2>");
346 | for(i=0;i<file->f_refs->n;i++)
347 | if(!file->f_refs->s2[i])
348 | fprintf(of,--others?" %s(),":" %s()",html(file->f_refs->s1[i],0));
349 | fprintf(of,"\n");
350 | }
351 |
352 | if(HTML20)
353 | fprintf(of,"</ul>\n");
354 | }
355 |
356 | if(file->v_refs->n)
357 | {
358 | int others=0;
359 |
360 | if(HTML20)
361 | fprintf(of,"<dt>References Variables:\n<dd><ul>\n");
362 | else
363 | fprintf(of,"<tr><td>References Variables:\n");
364 |
365 | for(i=0;i<file->v_refs->n;i++)
366 | if(file->v_refs->s2[i])
367 | {
368 | if(HTML32 && i!=others)
369 | fprintf(of,"<tr><td> \n");
370 | if(HTML20)
371 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#var-%s\">%s : %s</a>\n",goback,file->v_refs->s2[i],file->v_refs->s1[i],html(file->v_refs->s1[i],0),html(file->v_refs->s2[i],0));
372 | else
373 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a><td><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a>\n",goback,file->v_refs->s2[i],file->v_refs->s1[i],html(file->v_refs->s1[i],0),goback,file->v_refs->s2[i],file->v_refs->s1[i],html(file->v_r374 | efs->s2[i],0));
375 | }
376 | else
377 | others++;
378 |
379 | if(others)
380 | {
381 | if(HTML20)
382 | fprintf(of,"<li>");
383 | else if(i==others)
384 | fprintf(of,"<td colspan=2>");
385 | else
386 | fprintf(of,"<tr><td> \n<td colspan=2>");
387 | for(i=0;i<file->v_refs->n;i++)
388 | if(!file->v_refs->s2[i])
389 | fprintf(of,--others?" %s,":" %s",html(file->v_refs->s1[i],0));
390 | fprintf(of,"\n");
391 | }
392 |
393 | if(HTML20)
394 | fprintf(of,"</ul>\n");
395 | }
396 |
397 | if(file->f_refs->n || file->v_refs->n)
398 | if(HTML20)
399 | fprintf(of,"</dl>\n");
400 | else
401 | fprintf(of,"</table>\n");
402 | }
403 |
404 |
405 | /*++++++++++++++++++++++++++++++++++++++
406 | Write an Include structure out.
407 |
408 | Include inc The Include structure to output.
409 | ++++++++++++++++++++++++++++++++++++++*/
410 |
411 | static void WriteHTMLInclude(Include inc)
412 | {
413 | if(inc->comment)
414 | fprintf(of,"%s\n<p>\n",html(inc->comment,0));
415 |
416 | fprintf(of,"<ul>\n");
417 |
418 | if(inc->scope==LOCAL)
419 | fprintf(of,"<li><tt><a href=\"%s%s"HTML_FILE"#file\">#include "%s"</a></tt>\n",goback,inc->name,html(inc->name,0));
420 | else
421 | fprintf(of,"<li><tt>#include <%s></tt>\n",html(inc->name,0));
422 |
423 | if(inc->includes)
424 | WriteHTMLSubInclude(inc->includes,1);
425 |
426 | fprintf(of,"</ul>\n");
427 | }
428 |
429 |
430 | /*++++++++++++++++++++++++++++++++++++++
431 | Write an Sub Include structure out. (An include structure that is included from another file.)
432 |
433 | Include inc The Include structure to output.
434 |
435 | int depth The depth of the include hierarchy.
436 | ++++++++++++++++++++++++++++++++++++++*/
437 |
438 | static void WriteHTMLSubInclude(Include inc,int depth)
439 | {
440 | fprintf(of,"<ul>\n");
441 |
442 | while(inc)
443 | {
444 | if(inc->scope==LOCAL)
445 | fprintf(of,"<li><tt><a href=\"%s%s"HTML_FILE"#file\">#include "%s"</a></tt>\n",goback,inc->name,html(inc->name,0));
446 | else
447 | fprintf(of,"<li><tt>#include <%s></tt>\n",html(inc->name,0));
448 |
449 | if(inc->includes)
450 | WriteHTMLSubInclude(inc->includes,depth+1);
451 |
452 | inc=inc->next;
453 | }
454 |
455 | fprintf(of,"</ul>\n");
456 | }
457 |
458 |
459 | /*++++++++++++++++++++++++++++++++++++++
460 | Write a Define structure out.
461 |
462 | Define def The Define structure to output.
463 | ++++++++++++++++++++++++++++++++++++++*/
464 |
465 | static void WriteHTMLDefine(Define def)
466 | {
467 | int i;
468 | int pargs=0;
469 |
470 | if(def->comment)
471 | fprintf(of,"%s\n<p>\n",html(def->comment,0));
472 |
473 | if(HTMLSRC)
474 | fprintf(of,"<tt><a href=\"%s%s%s#line%d\">#define %s</a>",goback,filename,HTML_SRC_FILE,def->lineno,html(def->name,0));
475 | else
476 | fprintf(of,"<tt>#define %s",html(def->name,0));
477 |
478 | if(def->value)
479 | fprintf(of," %s",html(def->value,0));
480 |
481 | if(def->args->n)
482 | {
483 | fprintf(of,"( ");
484 | for(i=0;i<def->args->n;i++)
485 | fprintf(of,i?", %s":"%s",html(def->args->s1[i],0));
486 | fprintf(of," )");
487 | }
488 | fprintf(of,"</tt><br>\n");
489 |
490 | for(i=0;i<def->args->n;i++)
491 | if(def->args->s2[i])
492 | pargs=1;
493 |
494 | if(pargs)
495 | {
496 | fprintf(of,"<dl compact>\n");
497 | for(i=0;i<def->args->n;i++)
498 | fprintf(of,"<dt><tt>%s</tt>\n<dd>%s\n",html(def->args->s1[i],0),def->args->s2[i]?html(def->args->s2[i],0):"");
499 | fprintf(of,"</dl>\n");
500 | }
501 | }
502 |
503 |
504 | /*++++++++++++++++++++++++++++++++++++++
505 | Write a Typedef structure out.
506 |
507 | Typedef type The Typedef structure to output.
508 | ++++++++++++++++++++++++++++++++++++++*/
509 |
510 | static void WriteHTMLTypedef(Typedef type)
511 | {
512 | fprintf(of,"\n<hr>\n<h2>");
513 |
514 | if(!strncmp("enum",type->name,4))
515 | fprintf(of,"<a name=\"type-enum-%s\">",&type->name[5]);
516 | else
517 | if(!strncmp("union",type->name,5))
518 | fprintf(of,"<a name=\"type-union-%s\">",&type->name[6]);
519 | else
520 | if(!strncmp("struct",type->name,6))
521 | fprintf(of,"<a name=\"type-struct-%s\">",&type->name[7]);
522 | else
523 | fprintf(of,"<a name=\"type-%s\">",type->name);
524 |
525 | if(type->type)
526 | fprintf(of,"Typedef %s",html(type->name,0));
527 | else
528 | fprintf(of,"Type %s",html(type->name,0));
529 |
530 | fprintf(of,"</a></h2>\n");
531 |
532 | if(type->comment)
533 | fprintf(of,"%s\n<p>\n",html(type->comment,0));
534 |
535 | if(type->type)
536 | {
537 | if(HTMLSRC)
538 | fprintf(of,"<tt><a href=\"%s%s%s#line%d\">typedef %s</a></tt><br>\n",goback,filename,HTML_SRC_FILE,type->lineno,html(type->type,0));
539 | else
540 | fprintf(of,"<tt>typedef %s</tt><br>\n",html(type->type,0));
541 | }
542 | else if(type->sutype)
543 | {
544 | if(HTMLSRC)
545 | fprintf(of,"<tt><a href=\"%s%s%s#line%d\">%s</a></tt><br>\n",goback,filename,HTML_SRC_FILE,type->lineno,html(type->sutype->name,0));
546 | else
547 | fprintf(of,"<tt>%s</tt><br>\n",html(type->sutype->name,0));
548 | }
549 |
550 | if(type->sutype)
551 | {
552 | if(HTML20)
553 | fprintf(of,"<ul>\n");
554 | else
555 | fprintf(of,"<table>\n");
556 | WriteHTMLStructUnion(type->sutype,0);
557 | if(HTML20)
558 | fprintf(of,"</ul>\n");
559 | else
560 | fprintf(of,"</table>\n");
561 | }
562 | else
563 | if(type->typexref)
564 | {
565 | fprintf(of,"<dl compact>\n<dt>See:\n<dd><ul>\n");
566 | if(type->typexref->type)
567 | fprintf(of,"<li><a href=\"#type-%s\">Typedef %s</a>\n",type->typexref->name,html(type->typexref->name,0));
568 | else
569 | if(!strncmp("enum",type->typexref->name,4))
570 | fprintf(of,"<li><a href=\"#type-enum-%s\">Type %s</a>\n",&type->typexref->name[5],html(type->typexref->name,0));
571 | else
572 | if(!strncmp("union",type->typexref->name,5))
573 | fprintf(of,"<li><a href=\"#type-union-%s\">Type %s</a>\n",&type->typexref->name[6],html(type->typexref->name,0));
574 | else
575 | if(!strncmp("struct",type->typexref->name,6))
576 | fprintf(of,"<li><a href=\"#type-struct-%s\">Type %s</a>\n",&type->typexref->name[7],html(type->typexref->name,0));
577 | fprintf(of,"</ul>\n</dl>\n");
578 | }
579 | }
580 |
581 |
582 | /*++++++++++++++++++++++++++++++++++++++
583 | Write a structure / union structure out.
584 |
585 | StructUnion su The structure / union to write.
586 |
587 | int depth The current depth within the structure.
588 | ++++++++++++++++++++++++++++++++++++++*/
589 |
590 | static void WriteHTMLStructUnion(StructUnion su, int depth)
591 | {
592 | int i;
593 | char* splitsu=NULL;
594 |
595 | splitsu=strstr(su->name,"{...}");
596 | if(splitsu) splitsu[-1]=0;
597 |
598 | if(HTML20)
599 | {
600 | if(depth && su->comment && !su->comps)
601 | fprintf(of,"<li><tt>%s; </tt>%s<br>\n",html(su->name,0),html(su->comment,0));
602 | else if(!depth || su->comps)
603 | fprintf(of,"<li><tt>%s</tt><br>\n",html(su->name,0));
604 | else
605 | fprintf(of,"<li><tt>%s;</tt><br>\n",html(su->name,0));
606 | }
607 | else
608 | {
609 | fprintf(of,"<tr><td>");
610 | for(i=0;i<depth;i++)
611 | fprintf(of," ");
612 | if(!depth || su->comps)
613 | fprintf(of,"<tt>%s</tt>",html(su->name,0));
614 | else
615 | fprintf(of,"<tt>%s;</tt>",html(su->name,0));
616 | fprintf(of,"<td>");
617 | if(depth && su->comment && !su->comps)
618 | fprintf(of,html(su->comment,0));
619 | else
620 | fprintf(of," ");
621 | fprintf(of,"\n");
622 | }
623 |
624 | if(!depth || su->comps)
625 | {
626 | if(HTML20)
627 | {
628 | fprintf(of,"<ul>\n");
629 | fprintf(of,"<li><tt>{</tt><br>\n");
630 | }
631 | else
632 | {
633 | fprintf(of,"<tr><td>");
634 | for(i=0;i<depth;i++)
635 | fprintf(of," ");
636 | fprintf(of," <tt>{</tt>");
637 | fprintf(of,"<td> \n");
638 | }
639 |
640 | for(i=0;i<su->n_comp;i++)
641 | WriteHTMLStructUnion(su->comps[i],depth+1);
642 |
643 | if(HTML20)
644 | {
645 | fprintf(of,"<li><tt>}</tt><br>\n");
646 | fprintf(of,"</ul>\n");
647 | }
648 | else
649 | {
650 | fprintf(of,"<tr><td>");
651 | for(i=0;i<depth;i++)
652 | fprintf(of," ");
653 | fprintf(of," <tt>}</tt>");
654 | fprintf(of,"<td> \n");
655 | }
656 |
657 | if(splitsu)
658 | {
659 | if(HTML20)
660 | {
661 | if(depth && su->comment)
662 | fprintf(of,"<li><tt>%s; </tt>%s<br>\n",splitsu[5]?html(&splitsu[6],0):"",html(su->comment,0));
663 | else
664 | fprintf(of,"<li><tt>%s;</tt><br>\n",splitsu[5]?html(&splitsu[6],0):"");
665 | }
666 | else
667 | {
668 | fprintf(of,"<tr><td>");
669 | for(i=0;i<depth;i++)
670 | fprintf(of," ");
671 | fprintf(of,"<tt>%s;</tt>",splitsu[5]?html(&splitsu[6],0):"");
672 | if(depth && su->comment)
673 | fprintf(of,"<td>%s\n",html(su->comment,0));
674 | else
675 | fprintf(of,"<td> \n");
676 | }
677 | }
678 | }
679 |
680 | if(splitsu) splitsu[-1]=' ';
681 | }
682 |
683 |
684 | /*++++++++++++++++++++++++++++++++++++++
685 | Write a Variable structure out.
686 |
687 | Variable var The Variable structure to output.
688 | ++++++++++++++++++++++++++++++++++++++*/
689 |
690 | static void WriteHTMLVariable(Variable var)
691 | {
692 | int i;
693 |
694 | if(var->scope&GLOBAL)
695 | fprintf(of,"\n<hr>\n<h2><a name=\"var-%s\">Global Variable %s</a></h2>\n",var->name,html(var->name,0));
696 | else
697 | fprintf(of,"<b><a name=\"var-%s\">%s</a></b><br>\n",var->name,html(var->name,0));
698 |
699 | if(var->comment)
700 | fprintf(of,"%s\n<p>\n",html(var->comment,0));
701 |
702 | if(HTMLSRC)
703 | fprintf(of,"<tt><a href=\"%s%s%s#line%d\">",goback,filename,HTML_SRC_FILE,var->lineno);
704 | else
705 | fprintf(of,"<tt>");
706 |
707 | if(var->scope&LOCAL)
708 | fprintf(of,"static ");
709 | else
710 | if(!(var->scope&GLOBAL) && var->scope&(EXTERNAL|EXTERN_F))
711 | fprintf(of,"extern ");
712 |
713 | fprintf(of,"%s",html(var->type,0));
714 |
715 | if(HTMLSRC)
716 | fprintf(of,"</a></tt><br>\n");
717 | else
718 | fprintf(of,"</tt><br>\n");
719 |
720 | if(var->scope&(GLOBAL|LOCAL))
721 | {
722 | if(var->incfrom || var->visible->n || var->used->n)
723 | if(HTML20)
724 | fprintf(of,"<dl compact>\n");
725 | else
726 | fprintf(of,"<table>\n");
727 |
728 | if(var->incfrom)
729 | {
730 | if(HTML20)
731 | fprintf(of,"<dt>Included from:\n<dd><ul>\n");
732 | else
733 | fprintf(of,"<tr><td>Included from\n");
734 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a>\n",HTML20?"li":"td",goback,var->incfrom,var->name,html(var->incfrom,0));
735 | if(HTML20)
736 | fprintf(of,"</ul>\n");
737 | }
738 |
739 | if(var->visible->n)
740 | {
741 | for(i=0;i<var->visible->n;i++)
742 | {
743 | if(HTML20 && i==0)
744 | fprintf(of,"<dt>Visible in:\n<dd><ul>\n");
745 | else if(HTML32 && i==0)
746 | fprintf(of,"<tr><td>Visible in:\n");
747 | else if(HTML32)
748 | fprintf(of,"<tr><td> \n");
749 | if(var->visible->s1[i][0]=='$' && !var->visible->s1[i][1])
750 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#file\">%s</a>\n",HTML20?"li":"td> <td",goback,var->visible->s2[i],html(var->visible->s2[i],0));
751 | else
752 | if(HTML20)
753 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,var->visible->s2[i],var->visible->s1[i],html(var->visible->s1[i],0),html(var->visible->s2[i],0));
754 | else
755 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,var->visible->s2[i],var->visible->s1[i],html(var->visible->s1[i],0),goback,var->visible->s2[i],var->visible->s1[i],html(va756 | r->visible->s2[i],0));
757 | }
758 | if(HTML20)
759 | fprintf(of,"</ul>\n");
760 | }
761 |
762 | if(var->used->n)
763 | {
764 | for(i=0;i<var->used->n;i++)
765 | {
766 | if(HTML20 && i==0)
767 | fprintf(of,"<dt>Used in:\n<dd><ul>\n");
768 | else if(HTML32 && i==0)
769 | fprintf(of,"<tr><td>Used in:\n");
770 | else if(HTML32)
771 | fprintf(of,"<tr><td> \n");
772 | if(var->used->s1[i][0]=='$' && !var->used->s1[i][1])
773 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#file\">%s</a>\n",HTML20?"li":"td> <td",goback,var->used->s2[i],html(var->used->s2[i],0));
774 | else
775 | {
776 | if(var->scope&LOCAL)
777 | fprintf(of,"<%s><a href=\"#func-%s\">%s()</a>\n",HTML20?"li":"td",var->used->s1[i],html(var->used->s1[i],0));
778 | else
779 | if(HTML20)
780 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,var->used->s2[i],var->used->s1[i],html(var->used->s1[i],0),html(var->used->s2[i],0));
781 | else
782 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,var->used->s2[i],var->used->s1[i],html(var->used->s1[i],0),goback,var->used->s2[i],var->used->s1[i],html(var->used->s2[783 | i],0));
784 | }
785 | }
786 | if(HTML20)
787 | fprintf(of,"</ul>\n");
788 | }
789 |
790 | if(var->incfrom || var->visible->n || var->used->n)
791 | if(HTML20)
792 | fprintf(of,"</dl>\n");
793 | else
794 | fprintf(of,"\n</table>\n");
795 | }
796 | else
797 | if(var->scope&(EXTERNAL|EXTERN_F) && var->defined)
798 | {
799 | if(HTML20)
800 | fprintf(of,"<dl compact>\n");
801 | else
802 | fprintf(of,"<table>\n");
803 | if(HTML20)
804 | fprintf(of,"<dt>Defined in:\n<dd><ul>\n");
805 | else
806 | fprintf(of,"<tr><td>Defined in:\n");
807 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a>\n",HTML20?"li":"td",goback,var->defined,html(var->name,0),var->defined);
808 | if(HTML20)
809 | fprintf(of,"</ul>\n</dl>\n");
810 | else
811 | fprintf(of,"\n</table>\n");
812 | }
813 | }
814 |
815 |
816 | /*++++++++++++++++++++++++++++++++++++++
817 | Write a Function structure out.
818 |
819 | Function func The Function structure to output.
820 | ++++++++++++++++++++++++++++++++++++++*/
821 |
822 | static void WriteHTMLFunction(Function func)
823 | {
824 | int i,pret,pargs;
825 | char* comment2=NULL,*type;
826 |
827 | if(func->scope&GLOBAL)
828 | fprintf(of,"\n<hr>\n<h2><a name=\"func-%s\">Global Function %s()</a></h2>\n",func->name,html(func->name,0));
829 | else
830 | fprintf(of,"\n<hr>\n<h2><a name=\"func-%s\">Local Function %s()</a></h2>\n",func->name,html(func->name,0));
831 |
832 | if(func->comment)
833 | if(option_verbatim_comments)
834 | fprintf(of,"<pre>\n%s\n</pre>\n\n",html(func->comment,0));
835 | else
836 | {
837 | comment2=strstr(func->comment,"\n\n");
838 | if(comment2)
839 | comment2[0]=0;
840 | fprintf(of,"%s\n<p>\n",html(func->comment,0));
841 | }
842 |
843 | if(HTMLSRC)
844 | fprintf(of,"<tt><a href=\"%s%s%s#line%d\">",goback,filename,HTML_SRC_FILE,func->lineno);
845 | else
846 | fprintf(of,"<tt>");
847 |
848 | if(func->scope&LOCAL)
849 | fprintf(of,"static ");
850 | if(func->scope&INLINED)
851 | fprintf(of,"inline ");
852 |
853 | if((type=strstr(func->type,"()")))
854 | type[0]=0;
855 | fprintf(of,"%s ( ",html(func->type,0));
856 |
857 | for(i=0;i<func->args->n;i++)
858 | fprintf(of,i?", %s":"%s",html(func->args->s1[i],0));
859 |
860 | if(type)
861 | {fprintf(of," %s",html(&type[1],0));type[0]='(';}
862 | else
863 | fprintf(of," )");
864 |
865 | if(HTMLSRC)
866 | fprintf(of,"</a></tt><br>\n");
867 | else
868 | fprintf(of,"</tt><br>\n");
869 |
870 | pret =strncmp("void ",func->type,5) && func->cret;
871 | for(pargs=0,i=0;i<func->args->n;i++)
872 | pargs = pargs || ( strcmp("void",func->args->s1[i]) && func->args->s2[i] );
873 |
874 | if(pret || pargs)
875 | {
876 | fprintf(of,"<dl compact>\n");
877 | if(pret)
878 | fprintf(of,"<dt><tt>%s</tt>\n<dd>%s\n",html(func->type,0),func->cret?html(func->cret,0):"&nbs;");
879 | if(pargs)
880 | for(i=0;i<func->args->n;i++)
881 | fprintf(of,"<dt><tt>%s</tt>\n<dd>%s\n",html(func->args->s1[i],0),func->args->s2[i]?html(func->args->s2[i],0):"&nbs;");
882 | fprintf(of,"</dl>\n");
883 | }
884 |
885 | if(comment2)
886 | {
887 | fprintf(of,"%s\n<p>\n",html(&comment2[2],0));
888 | comment2[0]='\n';
889 | }
890 |
891 | if(func->protofile || func->incfrom || func->calls->n || func->called->n || func->used->n || func->f_refs->n || func->v_refs->n)
892 | if(HTML20)
893 | fprintf(of,"<dl compact>\n");
894 | else
895 | fprintf(of,"<table>\n");
896 |
897 | if(func->protofile)
898 | {
899 | if(HTML20)
900 | fprintf(of,"<dt>Prototyped in:\n<dd><ul>\n");
901 | else
902 | fprintf(of,"<tr><td>Prototyped in:\n");
903 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#file\">%s</a>\n",HTML20?"li":"td colspan=2",goback,func->protofile,html(func->protofile,0));
904 | if(HTML20)
905 | fprintf(of,"</ul>\n");
906 | }
907 |
908 | if(func->incfrom)
909 | {
910 | if(HTML20)
911 | fprintf(of,"<dt>Included from:\n<dd><ul>\n");
912 | else
913 | fprintf(of,"<tr><td>Included from:\n");
914 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",HTML20?"li":"td colspan=2",goback,func->incfrom,func->name,html(func->incfrom,0));
915 | if(HTML20)
916 | fprintf(of,"</ul>\n");
917 | }
918 |
919 | if(func->calls->n)
920 | {
921 | int others=0;
922 |
923 | if(HTML20)
924 | fprintf(of,"<dt>Calls:\n<dd><ul>\n");
925 | else
926 | fprintf(of,"<tr><td>Calls:\n");
927 |
928 | for(i=0;i<func->calls->n;i++)
929 | if(func->calls->s2[i])
930 | {
931 | if(HTML32 && i!=others)
932 | fprintf(of,"<tr><td> \n");
933 | if(HTML20)
934 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,func->calls->s2[i],func->calls->s1[i],html(func->calls->s1[i],0),html(func->calls->s2[i],0));
935 | else
936 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,func->calls->s2[i],func->calls->s1[i],html(func->calls->s1[i],0),goback,func->calls->s2[i],func->calls->s1[i],html(func->call937 | s->s2[i],0));
938 | }
939 | else
940 | others++;
941 |
942 | if(others)
943 | {
944 | if(HTML20)
945 | fprintf(of,"<li>");
946 | else if(i==others)
947 | fprintf(of,"<td colspan=2>");
948 | else
949 | fprintf(of,"<tr><td> \n<td colspan=2>");
950 | for(i=0;i<func->calls->n;i++)
951 | if(!func->calls->s2[i])
952 | fprintf(of,--others?"%s(), ":"%s()",html(func->calls->s1[i],0));
953 | fprintf(of,"\n");
954 | }
955 |
956 | if(HTML20)
957 | fprintf(of,"</ul>\n");
958 | }
959 |
960 | if(func->called->n)
961 | {
962 | if(HTML20)
963 | fprintf(of,"<dt>Called by:\n<dd><ul>\n");
964 | else
965 | fprintf(of,"<tr><td>Called by:\n");
966 | for(i=0;i<func->called->n;i++)
967 | {
968 | if(HTML32 && i!=0)
969 | fprintf(of,"<tr><td> \n");
970 | if(HTML20)
971 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,func->called->s2[i],func->called->s1[i],html(func->called->s1[i],0),html(func->called->s2[i],0));
972 | else
973 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,func->called->s2[i],func->called->s1[i],html(func->called->s1[i],0),goback,func->called->s2[i],func->called->s1[i],html(func->ca974 | lled->s2[i],0));
975 | }
976 | if(HTML20)
977 | fprintf(of,"</ul>\n");
978 | }
979 |
980 | if(func->used->n)
981 | {
982 | if(HTML20)
983 | fprintf(of,"<dt>Used in:\n<dd><ul>\n");
984 | else
985 | fprintf(of,"<tr><td>Used in:\n");
986 | for(i=0;i<func->used->n;i++)
987 | {
988 | if(HTML32 && i!=0)
989 | fprintf(of,"<tr><td> \n");
990 | if(func->used->s1[i][0]=='$' && !func->used->s1[i][1])
991 | fprintf(of,"<%s><a href=\"%s%s"HTML_FILE"#file\">%s</a>\n",HTML20?"li":"td> <td",goback,func->used->s2[i],html(func->used->s2[i],0));
992 | else
993 | if(HTML20)
994 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,func->used->s2[i],func->used->s1[i],html(func->used->s1[i],0),html(func->used->s2[i],0));
995 | else
996 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,func->used->s2[i],func->used->s1[i],html(func->used->s1[i],0),goback,func->used->s2[i],func->used->s1[i],html(func->used->s2[997 | i],0));
998 | }
999 | if(HTML20)
1000 | fprintf(of,"</ul>\n");
1001 | }
1002 |
1003 | if(func->f_refs->n)
1004 | {
1005 | int others=0;
1006 |
1007 | if(HTML20)
1008 | fprintf(of,"<dt>References Functions:\n<dd><ul>\n");
1009 | else
1010 | fprintf(of,"<tr><td>References Functions:\n");
1011 |
1012 | for(i=0;i<func->f_refs->n;i++)
1013 | if(func->f_refs->s2[i])
1014 | {
1015 | if(HTML32 && i!=others)
1016 | fprintf(of,"<tr><td> \n");
1017 | if(HTML20)
1018 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",goback,func->f_refs->s2[i],func->f_refs->s1[i],html(func->f_refs->s1[i],0),html(func->f_refs->s2[i],0));
1019 | else
1020 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#func-%s\">%s()</a><td><a href=\"%s%s"HTML_FILE"#func-%s\">%s</a>\n",goback,func->f_refs->s2[i],func->f_refs->s1[i],html(func->f_refs->s1[i],0),goback,func->f_refs->s2[i],func->f_refs->s1[i],html(func-1021 | >f_refs->s2[i],0));
1022 | }
1023 | else
1024 | others++;
1025 |
1026 | if(others)
1027 | {
1028 | if(HTML20)
1029 | fprintf(of,"<li>");
1030 | else if(i==others)
1031 | fprintf(of,"<td colspan=2>");
1032 | else
1033 | fprintf(of,"<tr><td> \n<td colspan=2>");
1034 | for(i=0;i<func->f_refs->n;i++)
1035 | if(!func->f_refs->s2[i])
1036 | fprintf(of,--others?"%s(), ":"%s()",html(func->f_refs->s1[i],0));
1037 | fprintf(of,"\n");
1038 | }
1039 |
1040 | if(HTML20)
1041 | fprintf(of,"</ul>\n");
1042 | }
1043 |
1044 | if(func->v_refs->n)
1045 | {
1046 | int others=0;
1047 |
1048 | if(HTML20)
1049 | fprintf(of,"<dt>References Variables:\n<dd><ul>\n");
1050 | else
1051 | fprintf(of,"<tr><td>References Variables:\n");
1052 |
1053 | for(i=0;i<func->v_refs->n;i++)
1054 | if(func->v_refs->s2[i])
1055 | {
1056 | if(HTML32 && i!=others)
1057 | fprintf(of,"<tr><td> \n");
1058 | if(HTML20)
1059 | fprintf(of,"<li><a href=\"%s%s"HTML_FILE"#var-%s\">%s : %s</a>\n",goback,func->v_refs->s2[i],func->v_refs->s1[i],html(func->v_refs->s1[i],0),html(func->v_refs->s2[i],0));
1060 | else
1061 | fprintf(of,"<td><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a><td><a href=\"%s%s"HTML_FILE"#var-%s\">%s</a>\n",goback,func->v_refs->s2[i],func->v_refs->s1[i],html(func->v_refs->s1[i],0),goback,func->v_refs->s2[i],func->v_refs->s1[i],html(func->v_r1062 | efs->s2[i],0));
1063 | }
1064 | else
1065 | others++;
1066 |
1067 | if(others)
1068 | {
1069 | if(HTML20)
1070 | fprintf(of,"<li>");
1071 | else if(i==others)
1072 | fprintf(of,"<td colspan=2>");
1073 | else
1074 | fprintf(of,"<tr><td> \n<td colspan=2>");
1075 | for(i=0;i<func->v_refs->n;i++)
1076 | if(!func->v_refs->s2[i])
1077 | fprintf(of,--others?"%s, ":"%s",html(func->v_refs->s1[i],0));
1078 | fprintf(of,"\n");
1079 | }
1080 |
1081 | if(HTML20)
1082 | fprintf(of,"</ul>\n");
1083 | }
1084 |
1085 | if(func->protofile || func->incfrom || func->calls->n || func->called->n || func->used->n || func->f_refs->n || func->v_refs->n)
1086 | if(HTML20)
1087 | fprintf(of,"</dl>\n");
1088 | else
1089 | fprintf(of,"\n</table>\n");
1090 | }
1091 |
1092 |
1093 | /*++++++++++++++++++++++++++++++++++++++
1094 | Write out a file that will include the current information.
1095 |
1096 | char* name The name of the file.
1097 |
1098 | int appendix set to non-zero if the appendix file is to be added, else a normal source file.
1099 | ++++++++++++++++++++++++++++++++++++++*/
1100 |
1101 | static void WriteHTMLDocument(char* name,int appendix)
1102 | {
1103 | FILE *in,*out;
1104 | char line[256];
1105 | int seen=0;
1106 | char *inc_file,*ofile,*ifile;
1107 |
1108 | if(appendix)
1109 | inc_file=ConcatStrings(4,"<a href=\"",name,HTML_FILE,"\">Appendix</a><br>\n");
1110 | else
1111 | inc_file=ConcatStrings(6,"<a href=\"",name,HTML_FILE,"#file\">",name,"</a><br>\n");
1112 | ifile=ConcatStrings(4,option_odir,"/",option_name,HTML_FILE);
1113 | ofile=ConcatStrings(4,option_odir,"/",option_name,HTML_FILE_BACKUP);
1114 |
1115 | in =fopen(ifile,"r");
1116 | if(!in)
1117 | {
1118 | in =fopen(ifile,"w");
1119 | if(!in)
1120 | {fprintf(stderr,"cxref: Failed to open the main HTML output file '%s'\n",ifile);exit(1);}
1121 |
1122 | WriteHTMLPreamble(in,ConcatStrings(3,"Cross Reference Of ",option_name,"."),1);
1123 | WriteHTMLPostamble(in,1);
1124 | fclose(in);
1125 |
1126 | in =fopen(ifile,"r");
1127 | }
1128 |
1129 | out=fopen(ofile,"w");
1130 |
1131 | if(!out)
1132 | {fprintf(stderr,"cxref: Failed to open the main HTML output file '%s'\n",ofile);exit(1);}
1133 |
1134 | while(fgets(line,256,in))
1135 | {
1136 | if(!strcmp(inc_file,line) ||
1137 | (!strncmp("<!--",line,4) && !strncmp(inc_file,line+4,strlen(inc_file))) ||
1138 | (!strncmp("<!-- ",line,5) && !strncmp(inc_file,line+5,strlen(inc_file))))
1139 | {seen=1;break;}
1140 | if(line[0]=='<' && !strcmp("<!-- End-Of-Source-Files -->\n",line))
1141 | {
1142 | if(appendix)
1143 | {
1144 | fputs(line,out);
1145 | fputs("\n",out);
1146 | fputs("<!-- Appendix -->\n",out);
1147 | fputs("\n",out);
1148 | fputs("<hr>\n",out);
1149 | fputs("<h1>Appendix</h1>\n",out);
1150 | fputs("\n",out);
1151 | fputs(inc_file,out);
1152 | }
1153 | else
1154 | {
1155 | fputs(inc_file,out);
1156 | fputs("\n",out);
1157 | fputs(line,out);
1158 | }
1159 | }
1160 | else
1161 | fputs(line,out);
1162 | }
1163 |
1164 | fclose(in);
1165 | fclose(out);
1166 |
1167 | if(!seen)
1168 | {
1169 | unlink(ifile);
1170 | rename(ofile,ifile);
1171 | }
1172 | else
1173 | unlink(ofile);
1174 | }
1175 |
1176 |
1177 | /*++++++++++++++++++++++++++++++++++++++
1178 | Write out a standard pre-amble.
1179 |
1180 | FILE* f The file to write the pre amble to.
1181 |
1182 | char* title The title of the file.
1183 |
1184 | int sourcefile True if the Source-Files line is to be included.
1185 | ++++++++++++++++++++++++++++++++++++++*/
1186 |
1187 | static void WriteHTMLPreamble(FILE* f,char* title,int sourcefile)
1188 | {
1189 | if(HTML20)
1190 | fputs("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n",f);
1191 | else
1192 | fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n",f);
1193 | fputs("\n",f);
1194 | fputs("<!-- This HTML file generated by cxref. -->\n",f);
1195 | fputs("<!-- cxref program (c) Andrew M. Bishop 1995,96,97,98,99. -->\n",f);
1196 | fputs("\n",f);
1197 | if(!sourcefile)
1198 | {
1199 | fputs("<!--\n",f);
1200 | if(filename)
1201 | fprintf(f,"Cxref: %s %s\n",run_command,filename);
1202 | else
1203 | fprintf(f,"Cxref: %s\n",run_command);
1204 | fprintf(f,"CPP : %s\n",run_cpp_command);
1205 | fputs("-->\n",f);
1206 | fputs("\n",f);
1207 | }
1208 | fputs("<HTML>\n",f);
1209 | fputs("\n",f);
1210 | fputs("<HEAD>\n",f);
1211 | fputs("<TITLE>",f);
1212 | fputs(title,f);
1213 | fputs("</TITLE>\n",f);
1214 | fputs("</HEAD>\n",f);
1215 | fputs("\n",f);
1216 | fputs("<BODY>\n",f);
1217 | fputs("\n",f);
1218 | if(sourcefile)
1219 | {
1220 | fputs("<h1>Source Files</h1>\n",f);
1221 | fputs("\n",f);
1222 | fputs("<!-- Begin-Of-Source-Files -->\n",f);
1223 | }
1224 | }
1225 |
1226 |
1227 | /*++++++++++++++++++++++++++++++++++++++
1228 | Write out a standard post-amble. This includes the end of document marker.
1229 |
1230 | FILE* f The file to write the post amble to.
1231 |
1232 | int sourcefile True if the Source-Files line is to be included.
1233 | ++++++++++++++++++++++++++++++++++++++*/
1234 |
1235 | static void WriteHTMLPostamble(FILE* f,int sourcefile)
1236 | {
1237 | if(sourcefile)
1238 | {
1239 | fputs("\n",f);
1240 | fputs("<!-- End-Of-Source-Files -->\n",f);
1241 | }
1242 | fputs("\n",f);
1243 | fputs("</BODY>\n",f);
1244 | fputs("</HTML>\n",f);
1245 | }
1246 |
1247 |
1248 | /*++++++++++++++++++++++++++++++++++++++
1249 | Write out the appendix information.
1250 |
1251 | StringList files The list of files to write.
1252 |
1253 | StringList2 funcs The list of functions to write.
1254 |
1255 | StringList2 vars The list of variables to write.
1256 |
1257 | StringList2 types The list of types to write.
1258 | ++++++++++++++++++++++++++++++++++++++*/
1259 |
1260 | void WriteHTMLAppendix(StringList files,StringList2 funcs,StringList2 vars,StringList2 types)
1261 | {
1262 | char* ofile;
1263 | int i;
1264 |
1265 | filename=NULL;
1266 |
1267 | /* Write the bits to the including file. */
1268 |
1269 | WriteHTMLDocument(ConcatStrings(2,option_name,HTML_APDX),1);
1270 |
1271 | /* Open the file */
1272 |
1273 | ofile=ConcatStrings(5,option_odir,"/",option_name,HTML_APDX,HTML_FILE);
1274 |
1275 | of=fopen(ofile,"w");
1276 |
1277 | if(!of)
1278 | {fprintf(stderr,"cxref: Failed to open the HTML appendix file '%s'\n",ofile);exit(1);}
1279 |
1280 | /* Write the file structure out */
1281 |
1282 | WriteHTMLPreamble(of,ConcatStrings(3,"Cross reference index of ",option_name,"."),0);
1283 |
1284 | fprintf(of,"<h1>Cross References</h1>\n");
1285 |
1286 | /* Write out the appendix of files. */
1287 |
1288 | if(files->n)
1289 | {
1290 | fprintf(of,"\n<hr>\n<h2><a name=\"files\">Files</a></h2>\n");
1291 | fprintf(of,"<ul>\n");
1292 | for(i=0;i<files->n;i++)
1293 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#file\">%s</a>\n",files->s[i],html(files->s[i],0));
1294 | fprintf(of,"</ul>\n");
1295 | }
1296 |
1297 | /* Write out the appendix of functions. */
1298 |
1299 | if(funcs->n)
1300 | {
1301 | fprintf(of,"\n<hr>\n<h2><a name=\"functions\">Global Functions</a></h2>\n");
1302 | fprintf(of,"<ul>\n");
1303 | for(i=0;i<funcs->n;i++)
1304 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#func-%s\">%s() : %s</a>\n",funcs->s2[i],funcs->s1[i],html(funcs->s1[i],0),html(funcs->s2[i],0));
1305 | fprintf(of,"</ul>\n");
1306 | }
1307 |
1308 | /* Write out the appendix of variables. */
1309 |
1310 | if(vars->n)
1311 | {
1312 | fprintf(of,"\n<hr>\n<h2><a name=\"variables\">Global Variables</a></h2>\n");
1313 | fprintf(of,"<ul>\n");
1314 | for(i=0;i<vars->n;i++)
1315 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#var-%s\">%s : %s</a>\n",vars->s2[i],vars->s1[i],html(vars->s1[i],0),html(vars->s2[i],0));
1316 | fprintf(of,"</ul>\n");
1317 | }
1318 |
1319 | /* Write out the appendix of types. */
1320 |
1321 | if(types->n)
1322 | {
1323 | fprintf(of,"\n<hr>\n<h2><a name=\"types\">Defined Types</a></h2>\n");
1324 | fprintf(of,"<ul>\n");
1325 | for(i=0;i<types->n;i++)
1326 | if(!strncmp("enum",types->s1[i],4))
1327 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#type-enum-%s\">%s : %s</a>\n",types->s2[i],&types->s1[i][5],html(types->s1[i],0),html(types->s2[i],0));
1328 | else
1329 | if(!strncmp("union",types->s1[i],5))
1330 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#type-union-%s\">%s : %s</a>\n",types->s2[i],&types->s1[i][6],html(types->s1[i],0),html(types->s2[i],0));
1331 | else
1332 | if(!strncmp("struct",types->s1[i],6))
1333 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#type-struct-%s\">%s : %s</a>\n",types->s2[i],&types->s1[i][7],html(types->s1[i],0),html(types->s2[i],0));
1334 | else
1335 | fprintf(of,"<li><a href=\"%s"HTML_FILE"#type-%s\">%s : %s</a>\n",types->s2[i],types->s1[i],html(types->s1[i],0),html(types->s2[i],0));
1336 | fprintf(of,"</ul>\n");
1337 | }
1338 |
1339 | WriteHTMLPostamble(of,0);
1340 |
1341 | fclose(of);
1342 |
1343 | /* Clear the memory in html(,0) */
1344 |
1345 | html(NULL,0); html(NULL,0); html(NULL,0); html(NULL,0);
1346 | }
1347 |
1348 |
1349 | /*++++++++++++++++++++++++++++++++++++++
1350 | Delete the HTML file and main file reference that belong to the named file.
1351 |
1352 | char *name The name of the file to delete.
1353 | ++++++++++++++++++++++++++++++++++++++*/
1354 |
1355 | void WriteHTMLFileDelete(char *name)
1356 | {
1357 | FILE *in,*out;
1358 | char line[256];
1359 | int seen=0;
1360 | char *inc_file,*ofile,*ifile;
1361 |
1362 | ofile=ConcatStrings(4,option_odir,"/",name,HTML_FILE);
1363 | unlink(ofile);
1364 |
1365 | inc_file=ConcatStrings(6,"<a href=\"",name,HTML_FILE,"#file\">",name,"</a><br>\n");
1366 | ifile=ConcatStrings(4,option_odir,"/",option_name,HTML_FILE);
1367 | ofile=ConcatStrings(4,option_odir,"/",option_name,HTML_FILE_BACKUP);
1368 |
1369 | in =fopen(ifile,"r");
1370 | out=fopen(ofile,"w");
1371 |
1372 | if(in && !out)
1373 | {fprintf(stderr,"cxref: Failed to open the main HTML output file '%s'\n",ofile);fclose(in);}
1374 | else if(in)
1375 | {
1376 | while(fgets(line,256,in))
1377 | {
1378 | if(!strcmp(inc_file,line) ||
1379 | (!strncmp("<!--",line,4) && !strncmp(inc_file,line+4,strlen(inc_file)-1)) ||
1380 | (!strncmp("<!-- ",line,5) && !strncmp(inc_file,line+5,strlen(inc_file)-1)))
1381 | seen=1;
1382 | else
1383 | fputs(line,out);
1384 | }
1385 |
1386 | fclose(in);
1387 | fclose(out);
1388 |
1389 | if(seen)
1390 | {
1391 | unlink(ifile);
1392 | rename(ofile,ifile);
1393 | }
1394 | else
1395 | unlink(ofile);
1396 | }
1397 | else if(out)
1398 | {
1399 | fclose(out);
1400 | unlink(ofile);
1401 | }
1402 | }
1403 |
1404 |
1405 | /*++++++++++++++++++++++++++++++++++++++
1406 | Write out the source file.
1407 |
1408 | char *name The name of the source file.
1409 | ++++++++++++++++++++++++++++++++++++++*/
1410 |
1411 | void WriteHTMLSource(char *name)
1412 | {
1413 | FILE *in,*out;
1414 | char line[256];
1415 | char *ofile,*ifile;
1416 | int lineno=0;
1417 | char pad[5];
1418 |
1419 | ifile=name;
1420 | ofile=ConcatStrings(4,option_odir,"/",name,HTML_SRC_FILE);
1421 |
1422 | in =fopen(ifile,"r");
1423 | if(!in)
1424 | {fprintf(stderr,"cxref: Failed to open the source file '%s'\n",ifile);exit(1);}
1425 |
1426 | out=fopen(ofile,"w");
1427 | if(!out)
1428 | {fprintf(stderr,"cxref: Failed to open the HTML output source file '%s'\n",ofile);exit(1);}
1429 |
1430 | WriteHTMLPreamble(out,ConcatStrings(2,"Source File ",name),0);
1431 | fputs("<pre>\n",out);
1432 |
1433 | strcpy(pad," ");
1434 |
1435 | while(fgets(line,256,in))
1436 | {
1437 | lineno++;
1438 | if(lineno==10)
1439 | pad[3]=0;
1440 | else if(lineno==100)
1441 | pad[2]=0;
1442 | else if(lineno==1000)
1443 | pad[1]=0;
1444 | else if(lineno==10000)
1445 | pad[0]=0;
1446 | fprintf(out,"<a name=\"line%d\">%d%s|</a> %s",lineno,lineno,pad,html(line,1));
1447 | }
1448 |
1449 | fputs("</pre>\n",out);
1450 | WriteHTMLPostamble(out,0);
1451 |
1452 | fclose(in);
1453 | fclose(out);
1454 | }
1455 |
1456 |
1457 | /*++++++++++++++++++++++++++++++++++++++
1458 | Make the input string safe to output as HTML ( not <, >, & or " ).
1459 |
1460 | char* html Returns a safe HTML string.
1461 |
1462 | char* c A non-safe HTML string.
1463 |
1464 | int verbatim Set to true if the text is to be output verbatim ignoring the comment +html+ directives.
1465 |
1466 | The function can only be called four times in each fprintf() since it returns one of only four static strings.
1467 | ++++++++++++++++++++++++++++++++++++++*/
1468 |
1469 | static char* html(char* c,int verbatim)
1470 | {
1471 | static char safe[4][256],*malloced[4]={NULL,NULL,NULL,NULL};
1472 | static int which=0;
1473 | int copy=0,skip=0;
1474 | int i=0,j=0,delta=7,len=256-delta;
1475 | char* ret;
1476 |
1477 | which=(which+1)%4;
1478 | ret=safe[which];
1479 |
1480 | safe[which][0]=0;
1481 |
1482 | if(malloced[which])
1483 | {Free(malloced[which]);malloced[which]=NULL;}
1484 |
1485 | if(c)
1486 | {
1487 | if(!verbatim)
1488 | i=CopyOrSkip(c,"html",©,&skip);
1489 |
1490 | while(1)
1491 | {
1492 | for(;j<len && c[i];i++)
1493 | {
1494 | if(copy)
1495 | {ret[j++]=c[i]; if(c[i]=='\n') copy=0;}
1496 | else if(skip)
1497 | { if(c[i]=='\n') skip=0;}
1498 | else
1499 | switch(c[i])
1500 | {
1501 | case '<':
1502 | strcpy(&ret[j],"<");j+=4;
1503 | break;
1504 | case '>':
1505 | strcpy(&ret[j],">");j+=4;
1506 | break;
1507 | case '"':
1508 | strcpy(&ret[j],""");j+=6;
1509 | break;
1510 | case '&':
1511 | strcpy(&ret[j],"&");j+=5;
1512 | break;
1513 | case '\n':
1514 | if(j && ret[j-1]=='\n')
1515 | {
1516 | strcpy(&ret[j],"<br>");j+=4;
1517 | }
1518 | ret[j++]=c[i];
1519 | break;
1520 | default:
1521 | ret[j++]=c[i];
1522 | }
1523 | if(c[i]=='\n')
1524 | if(!verbatim)
1525 | i+=CopyOrSkip(c+i,"html",©,&skip);
1526 | }
1527 |
1528 | if(c[i]) /* Not finished */
1529 | {
1530 | if(malloced[which])
1531 | malloced[which]=Realloc(malloced[which],len+delta+256);
1532 | else
1533 | {malloced[which]=Malloc(len+delta+256); strncpy(malloced[which],ret,(unsigned)j);}
1534 | ret=malloced[which];
1535 | len+=256;
1536 | }
1537 | else
1538 | {ret[j]=0; break;}
1539 | }
1540 | }
1541 |
1542 | return(ret);
1543 | }