1 |
cnh |
1.4 |
/* $Id: main.c,v 1.3 2004/02/17 15:37:34 edhill Exp $ */ |
2 |
adcroft |
1.1 |
|
3 |
|
|
/* |
4 |
|
|
Driver routine for generating hypertext instrumented code |
5 |
|
|
from a tree of Fortran source. Hypertext instrumentation allows |
6 |
|
|
symbols (subroutine names, variable names etc... ) |
7 |
|
|
to be selected in a browser. When a symbol is selected |
8 |
|
|
a table showing the definition of that symbol and all |
9 |
|
|
its occurences within the full code tree appears. |
10 |
|
|
For each occurence synopsis information, for example |
11 |
|
|
the line number the file name and the source text of the |
12 |
|
|
line referred to is shown. |
13 |
|
|
This table is also hypertext. By selecting entries in the |
14 |
|
|
table, for example the line number or the file name or |
15 |
|
|
a variable in the source text line that is reproduced |
16 |
|
|
other elements of the hypertext can be brought up. |
17 |
|
|
A mechanism for displaying attributes related to symbols |
18 |
|
|
is also includeed. Attributes describe what class or |
19 |
|
|
classes a symbol belongs to, for example is the symbol |
20 |
|
|
a function name, an input parameter, a compile time |
21 |
|
|
operator etc... Summary tables are also generated |
22 |
|
|
for viewing the output by attribute. |
23 |
|
|
A mechanism for linking to an external document, such |
24 |
|
|
as a text manual, is also included. |
25 |
|
|
*/ |
26 |
|
|
|
27 |
|
|
#include <stdio.h> |
28 |
cnh |
1.4 |
#include <stdlib.h> |
29 |
adcroft |
1.1 |
#include <string.h> |
30 |
|
|
#include <ctype.h> |
31 |
|
|
|
32 |
|
|
#include "DD.h" |
33 |
|
|
#include "FD.h" |
34 |
|
|
#include "GLOBALS.h" |
35 |
|
|
|
36 |
|
|
/* Variable Dictionary Parser */ |
37 |
|
|
FILE *VarDicin; |
38 |
|
|
int VarDicParseError = 0; |
39 |
|
|
int VarDicdebug; |
40 |
|
|
char *vDictTitleWord = NULL; |
41 |
|
|
static char vDictDefaultTitleWord[] = "DICTIONARY"; |
42 |
|
|
|
43 |
|
|
/* F90 Symbol Parser */ |
44 |
|
|
FILE *F90symin; |
45 |
|
|
int nSrcFile=0; /* Counter for source file number */ |
46 |
|
|
int F90symdebug; |
47 |
|
|
|
48 |
|
|
/* Command Line Arguments */ |
49 |
|
|
struct{ |
50 |
|
|
char *dictFile; /* Variable dictionary file */ |
51 |
|
|
char *outDir; /* Output directory */ |
52 |
|
|
int nSFiles; /* No. files in source list */ |
53 |
|
|
char **srcFiles; /* Files containing source */ |
54 |
|
|
} argList; |
55 |
|
|
|
56 |
|
|
main (argc, argv) |
57 |
|
|
int argc; |
58 |
|
|
char *argv[]; |
59 |
|
|
{ |
60 |
|
|
char vdictName[MAXPATHNAM]; |
61 |
|
|
char procdictName[MAXPATHNAM]; |
62 |
|
|
char parmdictName[MAXPATHNAM]; |
63 |
|
|
char compdictName[MAXPATHNAM]; |
64 |
|
|
FILE *htout; |
65 |
|
|
|
66 |
|
|
/* Process inout args */ |
67 |
|
|
if ( GetArgs(argc, argv) == 0 ) { |
68 |
|
|
fprintf(stderr, |
69 |
|
|
"Usage: %s [-d Dictionary] [-o OutputDirectory] file(s)\n",argv[0]); |
70 |
|
|
exit(0); |
71 |
|
|
} |
72 |
|
|
|
73 |
|
|
/* Create output directory */ |
74 |
|
|
if ( argList.outDir == NULL ) { |
75 |
|
|
argList.outDir = OUTDIR; |
76 |
|
|
} |
77 |
|
|
if ( makeOutputDirectories(argList.outDir) != 0 ) { |
78 |
|
|
fprintf(stderr,"Unables to create output directory structure\n"); |
79 |
|
|
fprintf(stderr,"%s\n",argList.outDir); |
80 |
|
|
fprintf(stderr,"%s/%s\n",argList.outDir,SRCSUF); |
81 |
|
|
fprintf(stderr,"%s/%s\n",argList.outDir,VARSUF); |
82 |
|
|
exit(0); |
83 |
|
|
} |
84 |
|
|
|
85 |
|
|
/* Scan input name definition table */ |
86 |
|
|
VarDicdebug=0; |
87 |
|
|
ParseVarDic(); |
88 |
|
|
if ( VarDicParseError != 0 ) |
89 |
|
|
{ |
90 |
|
|
if ( argList.dictFile != NULL ) { |
91 |
|
|
fprintf(stderr,"Error(s) occured reading dictionary \"%s\".", |
92 |
|
|
argList.dictFile); |
93 |
|
|
} |
94 |
|
|
fprintf(stderr," Program ending.\n"); |
95 |
edhill |
1.3 |
exit(0); |
96 |
adcroft |
1.1 |
} |
97 |
|
|
|
98 |
|
|
/* Scan code to get all variable names */ |
99 |
|
|
/* Set initial state of F77/F90 analyser */ |
100 |
|
|
F90symdebug=0; |
101 |
|
|
inNameList=0; |
102 |
|
|
inIfdef=0; |
103 |
|
|
clearNameIsProcName(); |
104 |
|
|
/* Run the analysis */ |
105 |
|
|
ParseF90Code(); |
106 |
|
|
|
107 |
|
|
/* Sort the table of variable uses */ |
108 |
|
|
tblSort(); |
109 |
|
|
|
110 |
|
|
/* Print out the data dictionary */ |
111 |
|
|
ddPrint(); |
112 |
|
|
|
113 |
|
|
/* Generate individual variable description tables */ |
114 |
|
|
GenerateVarTables(); |
115 |
|
|
|
116 |
|
|
/* Generate large single table */ |
117 |
|
|
ddSort(); |
118 |
|
|
|
119 |
|
|
sprintf(vdictName,"%s/%s",rootDir,VDICT); |
120 |
|
|
vdictfd = fopen(vdictName,"w"); |
121 |
|
|
|
122 |
|
|
sprintf(procdictName,"%s/%s%s",rootDir,PROCDICT,HTMLSUF); |
123 |
|
|
procdictfd = fopen(procdictName,"w"); |
124 |
|
|
|
125 |
|
|
sprintf(parmdictName,"%s/%s%s",rootDir,PARMDICT,HTMLSUF); |
126 |
|
|
parmdictfd = fopen(parmdictName,"w"); |
127 |
|
|
|
128 |
|
|
sprintf(compdictName,"%s/%s%s",rootDir,COMPDICT,HTMLSUF); |
129 |
|
|
compdictfd = fopen(compdictName,"w"); |
130 |
|
|
|
131 |
|
|
|
132 |
|
|
/* Table of all symbols */ |
133 |
|
|
GenerateVDict(); |
134 |
|
|
/* Table of just procedure names */ |
135 |
|
|
ddSetCurrent(0); |
136 |
|
|
GenerateProcDict(); |
137 |
|
|
/* Table of just compile time switching symbols */ |
138 |
|
|
ddSetCurrent(0); |
139 |
|
|
GeneratePrecompDict(); |
140 |
|
|
/* Table of just runtime parameters */ |
141 |
|
|
ddSetCurrent(0); |
142 |
|
|
GenerateParamDict(); |
143 |
|
|
|
144 |
|
|
/* Generate index of variables */ |
145 |
|
|
ddSetCurrent(0); |
146 |
|
|
GenerateVDictIndex(); |
147 |
|
|
|
148 |
|
|
ddSetCurrent(0); |
149 |
|
|
/* Generate tables of source files and directories */ |
150 |
|
|
fdTab(); |
151 |
|
|
|
152 |
|
|
/* Generate the HTML menus */ |
153 |
|
|
/* Top level menu */ |
154 |
|
|
mainMenu(); |
155 |
|
|
/* Submenu for browsing all symbol list */ |
156 |
|
|
ddSetCurrent(0); |
157 |
|
|
allSymbolsMenu(); |
158 |
|
|
/* Submenu for browsing functions and procedures list */ |
159 |
|
|
ddSetCurrent(0); |
160 |
|
|
allSubfuncMenu(); |
161 |
|
|
/* Submenu for browsing runtime parameters list */ |
162 |
|
|
ddSetCurrent(0); |
163 |
|
|
allRTParmMenu(); |
164 |
|
|
/* Submenu for browsing compile time switches list */ |
165 |
|
|
ddSetCurrent(0); |
166 |
|
|
allCTParmMenu(); |
167 |
|
|
/* Submenu for browsing source by directory and file name */ |
168 |
|
|
allDFMenu(); |
169 |
|
|
|
170 |
|
|
} |
171 |
|
|
|
172 |
|
|
mainMenu() { |
173 |
|
|
FILE *htout; |
174 |
|
|
/* Try a bit of extra HTML */ |
175 |
|
|
/* Main Menu */ |
176 |
|
|
htout=fopen("code_reference.htm","w"); |
177 |
|
|
html_start(htout); html_ul(htout); |
178 |
|
|
|
179 |
|
|
html_entryli(htout,"Overview","callTree.html target=mainBodyFrame","h3"); |
180 |
|
|
html_entryli(htout,"Subroutines and Functions","code_reference-subfunc_exp.htm","h3"); |
181 |
|
|
html_entryli(htout,"Runtime Parameters","code_reference-rtparm_exp.htm","h3"); |
182 |
|
|
html_entryli(htout,"Compile Time Parameters","code_reference-ctparm_exp.htm","h3"); |
183 |
|
|
html_entryli(htout,"Source Files","code_reference-sf_exp.htm","h3"); |
184 |
|
|
html_entryli(htout,"All Symbols","code_reference-vi_exp.htm","h3"); |
185 |
|
|
|
186 |
|
|
html_eul(htout); html_end(htout); |
187 |
|
|
fprintf(htout,"\n"); |
188 |
|
|
fclose(htout); |
189 |
|
|
|
190 |
|
|
} |
191 |
|
|
|
192 |
|
|
allSymbolsMenu() { |
193 |
|
|
FILE *htout; |
194 |
|
|
ddRecord *curRec; |
195 |
|
|
char curLetter = ' '; |
196 |
|
|
char clstr[2]; |
197 |
|
|
char subURL[MAXPATHNAM]; |
198 |
|
|
|
199 |
|
|
/* VI Sub-Menu */ |
200 |
|
|
htout=fopen("code_reference-vi_exp.htm","w"); |
201 |
|
|
html_start(htout); |
202 |
|
|
fprintf(htout,"\n"); |
203 |
|
|
html_ul(htout); |
204 |
|
|
fprintf(htout,"<H3>%s</H3>","Variable Index"); |
205 |
|
|
|
206 |
|
|
html_ul(htout); |
207 |
|
|
html_entryli(htout,"All (compact form)","vdb/index.htm target=codeBrowserWindow","h4"); |
208 |
|
|
html_entryli(htout,"All (detailed form)","vdb/vdict.htm target=codeBrowserWindow","h4"); |
209 |
|
|
html_li(htout); |
210 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
211 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
212 |
|
|
curLetter = toupper(curRec->name[0]); |
213 |
|
|
sprintf(subURL,"%s/%s_pref%c%s target=codeBrowserWindow", |
214 |
|
|
rootDir,"vdict",curLetter,HTMLSUF); |
215 |
|
|
clstr[0]=curLetter;clstr[1]='\0'; |
216 |
|
|
html_entry(htout,clstr,subURL,"h4"); fprintf(htout,", "); |
217 |
|
|
} |
218 |
|
|
} |
219 |
|
|
html_eli(htout); |
220 |
|
|
html_eul(htout); |
221 |
|
|
|
222 |
|
|
html_eul(htout); |
223 |
|
|
html_end(htout); |
224 |
|
|
fprintf(htout,"\n"); |
225 |
|
|
fclose(htout); |
226 |
|
|
} |
227 |
|
|
|
228 |
|
|
allSubfuncMenu() { |
229 |
|
|
FILE *htout; |
230 |
|
|
ddRecord *curRec; |
231 |
|
|
char curLetter = ' '; |
232 |
|
|
char clstr[2]; |
233 |
|
|
char subURL[MAXPATHNAM]; |
234 |
|
|
|
235 |
|
|
/* VI Sub-Menu */ |
236 |
|
|
htout=fopen("code_reference-subfunc_exp.htm","w"); |
237 |
|
|
html_start(htout); |
238 |
|
|
fprintf(htout,"\n"); |
239 |
|
|
|
240 |
|
|
fprintf(htout,"<H3>%s</H3","Subroutines and Functions"); |
241 |
|
|
html_ul(htout); |
242 |
|
|
sprintf(subURL,"%s/%s%s target=codeBrowserWindow", |
243 |
|
|
rootDir,PROCDICT,HTMLSUF); |
244 |
|
|
html_entryli(htout,"All",subURL,"h4"); |
245 |
|
|
html_li(htout); |
246 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
247 |
|
|
if ( curRec->isProcName == 1 ) { |
248 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
249 |
|
|
curLetter = toupper(curRec->name[0]); |
250 |
|
|
sprintf(subURL,"%s/%s_pref%c%s target=codeBrowserWindow", |
251 |
|
|
rootDir,PROCDICT,curLetter,HTMLSUF); |
252 |
|
|
clstr[0]=curLetter;clstr[1]='\0'; |
253 |
|
|
html_entry(htout,clstr,subURL,"h4"); fprintf(htout,", "); |
254 |
|
|
} |
255 |
|
|
} |
256 |
|
|
} |
257 |
|
|
html_eli(htout); |
258 |
|
|
html_eul(htout); |
259 |
|
|
|
260 |
|
|
html_end(htout); |
261 |
|
|
fprintf(htout,"\n"); |
262 |
|
|
fclose(htout); |
263 |
|
|
} |
264 |
|
|
|
265 |
|
|
allRTParmMenu() { |
266 |
|
|
FILE *htout; |
267 |
|
|
ddRecord *curRec; |
268 |
|
|
char curLetter = ' '; |
269 |
|
|
char clstr[2]; |
270 |
|
|
char subURL[MAXPATHNAM]; |
271 |
|
|
|
272 |
|
|
/* RTparm Sub-Menu */ |
273 |
|
|
htout=fopen("code_reference-rtparm_exp.htm","w"); |
274 |
|
|
html_start(htout); |
275 |
|
|
html_start(htout); |
276 |
|
|
|
277 |
|
|
fprintf(htout,"<H3>%s</H3>","Runtime Parameters"); |
278 |
|
|
html_ul(htout); |
279 |
|
|
sprintf(subURL,"%s/%s%s target=codeBrowserWindow", |
280 |
|
|
rootDir,PARMDICT,HTMLSUF); |
281 |
|
|
html_entryli(htout,"All",subURL,"h4"); |
282 |
|
|
html_li(htout); |
283 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
284 |
|
|
if ( curRec->isInNameList == 1 ) { |
285 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
286 |
|
|
curLetter = toupper(curRec->name[0]); |
287 |
|
|
sprintf(subURL,"%s/%s_pref%c%s target=codeBrowserWindow", |
288 |
|
|
rootDir,PARMDICT,curLetter,HTMLSUF); |
289 |
|
|
clstr[0]=curLetter;clstr[1]='\0'; |
290 |
|
|
html_entry(htout,clstr,subURL,"h4"); fprintf(htout,", "); |
291 |
|
|
} |
292 |
|
|
} |
293 |
|
|
} |
294 |
|
|
html_eli(htout); |
295 |
|
|
html_eul(htout); |
296 |
|
|
|
297 |
|
|
html_end(htout); |
298 |
|
|
fprintf(htout,"\n"); |
299 |
|
|
fclose(htout); |
300 |
|
|
} |
301 |
|
|
|
302 |
|
|
allCTParmMenu() { |
303 |
|
|
FILE *htout; |
304 |
|
|
ddRecord *curRec; |
305 |
|
|
char curLetter = ' '; |
306 |
|
|
char clstr[2]; |
307 |
|
|
char subURL[MAXPATHNAM]; |
308 |
|
|
|
309 |
|
|
/* CTparm Sub-Menu */ |
310 |
|
|
htout=fopen("code_reference-ctparm_exp.htm","w"); |
311 |
|
|
html_start(htout); html_ul(htout); |
312 |
|
|
fprintf(htout,"\n"); |
313 |
|
|
|
314 |
|
|
html_entryli(htout,"Overview","callTree.html target=mainBodyFrame","h3"); |
315 |
|
|
html_entryli(htout,"Subroutines and Functions","code_reference-subfunc_exp.htm","h3"); |
316 |
|
|
html_entryli(htout,"Runtime Parameters","code_reference-rtparm_exp.htm","h3"); |
317 |
|
|
html_entryli(htout,"Compile Time Parameters","code_reference.htm","h3"); |
318 |
|
|
html_ul(htout); |
319 |
|
|
sprintf(subURL,"%s/%s%s target=mainBodyFrame", |
320 |
|
|
rootDir,COMPDICT,HTMLSUF); |
321 |
|
|
html_entryli(htout,"All",subURL,"h4"); |
322 |
|
|
html_li(htout); |
323 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
324 |
|
|
if ( curRec->isInIfdef == 1 ) { |
325 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
326 |
|
|
curLetter = toupper(curRec->name[0]); |
327 |
|
|
sprintf(subURL,"%s/%s_pref%c%s target=mainBodyFrame", |
328 |
|
|
rootDir,COMPDICT,curLetter,HTMLSUF); |
329 |
|
|
clstr[0]=curLetter;clstr[1]='\0'; |
330 |
|
|
html_entry(htout,clstr,subURL,"h4"); fprintf(htout,", "); |
331 |
|
|
} |
332 |
|
|
} |
333 |
|
|
} |
334 |
|
|
html_eli(htout); |
335 |
|
|
html_eul(htout); |
336 |
|
|
html_entryli(htout,"Source Files","code_reference-sf_exp.htm","h3"); |
337 |
|
|
html_entryli(htout,"All Symbols","code_reference-vi_exp.htm","h3"); |
338 |
|
|
|
339 |
|
|
html_eul(htout); html_end(htout); |
340 |
|
|
fprintf(htout,"\n"); |
341 |
|
|
fclose(htout); |
342 |
|
|
} |
343 |
|
|
|
344 |
|
|
allDFMenu() { |
345 |
|
|
FILE *htout; |
346 |
|
|
ddRecord *curRec; |
347 |
|
|
char curLetter = ' '; |
348 |
|
|
char clstr[2]; |
349 |
|
|
char subURL[MAXPATHNAM]; |
350 |
|
|
|
351 |
|
|
/* CTparm Sub-Menu */ |
352 |
|
|
htout=fopen("code_reference-sf_exp.htm","w"); |
353 |
|
|
html_start(htout); |
354 |
|
|
fprintf(htout,"\n"); |
355 |
|
|
fprintf(htout,"<H3>%s</H3>","Source Tree"); |
356 |
|
|
|
357 |
|
|
html_ul(htout); |
358 |
|
|
sprintf(subURL,"%s/%s%s target=codeBrowserWindow", |
359 |
|
|
rootDir,SFDICT,HTMLSUF); |
360 |
|
|
html_entryli(htout,"All",subURL,"h4"); |
361 |
|
|
fdFlistAlpha(htout); |
362 |
|
|
fdDirList(htout); |
363 |
|
|
html_eli(htout); |
364 |
|
|
html_eul(htout); |
365 |
|
|
|
366 |
|
|
html_end(htout); |
367 |
|
|
fprintf(htout,"\n"); |
368 |
|
|
fclose(htout); |
369 |
|
|
} |
370 |
|
|
|
371 |
|
|
int GetArgs( argc, argv) |
372 |
|
|
/* Process inout args */ |
373 |
|
|
int argc; char *argv[]; |
374 |
|
|
{ |
375 |
|
|
char *curArg; int i; char curOp; int rc; |
376 |
|
|
|
377 |
|
|
rc =1; |
378 |
|
|
|
379 |
|
|
for ( i = 1; i<argc; ++i){ |
380 |
|
|
curArg = argv[i]; |
381 |
|
|
if ( curArg[0] == '-' ) { |
382 |
|
|
curOp = argv[i][1]; |
383 |
|
|
} else { |
384 |
|
|
switch (curOp) { |
385 |
|
|
case 'd': |
386 |
|
|
argList.dictFile = argv[i]; |
387 |
|
|
curOp='\0'; |
388 |
|
|
break; |
389 |
|
|
case 'o': |
390 |
|
|
curOp='\0'; |
391 |
|
|
argList.outDir = argv[i]; |
392 |
|
|
break; |
393 |
|
|
case '\0': |
394 |
|
|
if ( argList.srcFiles == NULL ){ |
395 |
|
|
argList.srcFiles = (char **)malloc( sizeof(*(argList.srcFiles)) ); |
396 |
|
|
} else { |
397 |
|
|
argList.srcFiles = (char **) |
398 |
|
|
realloc(argList.srcFiles, |
399 |
|
|
(argList.nSFiles+1)*sizeof(*(argList.srcFiles)) ); |
400 |
|
|
} |
401 |
|
|
argList.nSFiles = argList.nSFiles+1; |
402 |
|
|
if ( argList.srcFiles != NULL ) { |
403 |
|
|
*(argList.srcFiles+(argList.nSFiles-1)) = argv[i]; |
404 |
|
|
} |
405 |
|
|
break; |
406 |
|
|
default: |
407 |
|
|
fprintf(stderr,"Unknown option \"%c\"\n",curOp); |
408 |
|
|
curOp='\0'; |
409 |
|
|
rc = 0; |
410 |
|
|
break; |
411 |
|
|
} |
412 |
|
|
} |
413 |
|
|
} |
414 |
|
|
return(rc); |
415 |
|
|
} |
416 |
|
|
|
417 |
|
|
VarDicerror(s) |
418 |
|
|
char *s; |
419 |
|
|
{ |
420 |
|
|
fprintf(stderr,"Error: unrecognised input. <%s> Line %d Column %d\n", |
421 |
|
|
currentFile,Lno,Cno); |
422 |
|
|
VarDicParseError=1; |
423 |
|
|
} |
424 |
|
|
|
425 |
|
|
ParseVarDic() |
426 |
|
|
{ |
427 |
|
|
int i; FILE *file; |
428 |
|
|
/* Parser variable initialisation */ |
429 |
|
|
curName = NULL; |
430 |
|
|
curHref = NULL; |
431 |
|
|
curText = NULL; |
432 |
|
|
curUnits = NULL; |
433 |
|
|
curFootNotes = NULL; |
434 |
|
|
|
435 |
|
|
if ( argList.dictFile != NULL ){ |
436 |
|
|
file = fopen(argList.dictFile,"r"); |
437 |
|
|
if (!file){ |
438 |
|
|
fprintf(stderr,"Unable to open file \"%s\"\n",argList.dictFile); |
439 |
|
|
} |
440 |
|
|
else |
441 |
|
|
{VarDicin = file; currentFile=argList.dictFile; |
442 |
|
|
Lno=1; Cno=1; |
443 |
|
|
VarDicparse(); |
444 |
|
|
fclose(file); |
445 |
|
|
} |
446 |
|
|
} |
447 |
|
|
} |
448 |
|
|
|
449 |
|
|
GenerateParamDict() |
450 |
|
|
/* |
451 |
|
|
Generate tables of runtime parameters |
452 |
|
|
*/ |
453 |
|
|
{ |
454 |
|
|
ddRecord *curRec; |
455 |
|
|
char *note; |
456 |
|
|
char curLetter = ' '; |
457 |
|
|
FILE *vdictfd_sub = NULL; |
458 |
|
|
char vdictSubName[MAXPATHNAM]; |
459 |
|
|
char vDictSubHeader[1024]; |
460 |
|
|
static char vDictHeader[] = "Alphabetic table of All Runtime Parameters"; |
461 |
|
|
|
462 |
|
|
fprintf(stderr,"Hi there \n"); |
463 |
|
|
/* HTML headers */ |
464 |
|
|
vDictTitleWord=vDictHeader; |
465 |
|
|
vDictStart(parmdictfd); |
466 |
|
|
vDictTitleWord=NULL; |
467 |
|
|
|
468 |
|
|
/* Table Entry */ |
469 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
470 |
|
|
if ( curRec->isInNameList == 1 ) { |
471 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
472 |
|
|
curLetter = toupper(curRec->name[0]); |
473 |
|
|
html_indexRecord(parmdictfd,curLetter); |
474 |
|
|
html_columnHeading(parmdictfd); |
475 |
|
|
|
476 |
|
|
/* Do sub listing for this letter and/or symbol */ |
477 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
478 |
|
|
sprintf(vdictSubName,"%s/%s_pref%c%s",rootDir,PARMDICT,curLetter,HTMLSUF); |
479 |
|
|
vdictfd_sub = fopen(vdictSubName,"w"); |
480 |
|
|
sprintf(vDictSubHeader,"Table of runtime parameters starting with \"%c\"",curLetter); |
481 |
|
|
vDictTitleWord=vDictSubHeader; |
482 |
|
|
vDictStart(vdictfd_sub); |
483 |
|
|
vDictTitleWord=NULL; |
484 |
|
|
html_columnHeading(vdictfd_sub); |
485 |
|
|
} |
486 |
|
|
|
487 |
|
|
/* Start row */ |
488 |
|
|
fprintf(parmdictfd,"<TR>\n"); |
489 |
|
|
fprintf(vdictfd_sub,"<TR>\n"); |
490 |
|
|
|
491 |
|
|
/* Variable name column */ |
492 |
|
|
vDictNameCol( parmdictfd, curRec ); |
493 |
|
|
vDictNameCol( vdictfd_sub, curRec ); |
494 |
|
|
|
495 |
|
|
/* Variable def, units, refs column */ |
496 |
|
|
vDictDefnCol( parmdictfd, curRec ); |
497 |
|
|
vDictDefnCol( vdictfd_sub, curRec ); |
498 |
|
|
|
499 |
|
|
/* Variable use count */ |
500 |
|
|
vDictUsesCol( parmdictfd, curRec ); |
501 |
|
|
vDictUsesCol( vdictfd_sub, curRec ); |
502 |
|
|
|
503 |
|
|
/* End of row */ |
504 |
|
|
fprintf(parmdictfd,"</TR>\n"); |
505 |
|
|
fprintf(parmdictfd,"\n"); |
506 |
|
|
fprintf(vdictfd_sub,"</TR>\n"); |
507 |
|
|
fprintf(vdictfd_sub,"\n"); |
508 |
|
|
} |
509 |
|
|
} |
510 |
|
|
|
511 |
|
|
if ( parmdictfd != NULL ) { |
512 |
|
|
/* End last Table of uses */ |
513 |
|
|
fprintf(parmdictfd,"</TABLE>"); |
514 |
|
|
/* End document */ |
515 |
|
|
fprintf(parmdictfd,"</HTML>\n"); |
516 |
|
|
fclose(parmdictfd); |
517 |
|
|
} |
518 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
519 |
|
|
} |
520 |
|
|
|
521 |
|
|
GeneratePrecompDict() |
522 |
|
|
/* |
523 |
|
|
Generate tables of compile time parameters |
524 |
|
|
*/ |
525 |
|
|
{ |
526 |
|
|
ddRecord *curRec; |
527 |
|
|
char *note; |
528 |
|
|
char curLetter = ' '; |
529 |
|
|
FILE *vdictfd_sub = NULL; |
530 |
|
|
char vdictSubName[MAXPATHNAM]; |
531 |
|
|
char vDictSubHeader[1024]; |
532 |
|
|
static char vDictHeader[] = "Alphabetic table of All Compile Time Parameters"; |
533 |
|
|
|
534 |
|
|
fprintf(stderr,"Hi there \n"); |
535 |
|
|
/* HTML headers */ |
536 |
|
|
vDictTitleWord=vDictHeader; |
537 |
|
|
vDictStart(compdictfd); |
538 |
|
|
vDictTitleWord=NULL; |
539 |
|
|
|
540 |
|
|
/* Table Entry */ |
541 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
542 |
|
|
if ( curRec->isInIfdef == 1 ) { |
543 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
544 |
|
|
curLetter = toupper(curRec->name[0]); |
545 |
|
|
html_indexRecord(compdictfd,curLetter); |
546 |
|
|
html_columnHeading(compdictfd); |
547 |
|
|
|
548 |
|
|
/* Do sub listing for this letter and/or symbol */ |
549 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
550 |
|
|
sprintf(vdictSubName,"%s/%s_pref%c%s",rootDir,COMPDICT,curLetter,HTMLSUF); |
551 |
|
|
vdictfd_sub = fopen(vdictSubName,"w"); |
552 |
|
|
sprintf(vDictSubHeader,"Table of compile time parameters starting with \"%c\"",curLetter); |
553 |
|
|
vDictTitleWord=vDictSubHeader; |
554 |
|
|
vDictStart(vdictfd_sub); |
555 |
|
|
vDictTitleWord=NULL; |
556 |
|
|
html_columnHeading(vdictfd_sub); |
557 |
|
|
} |
558 |
|
|
|
559 |
|
|
/* Start row */ |
560 |
|
|
fprintf(compdictfd,"<TR>\n"); |
561 |
|
|
fprintf(vdictfd_sub,"<TR>\n"); |
562 |
|
|
|
563 |
|
|
/* Variable name column */ |
564 |
|
|
vDictNameCol( compdictfd, curRec ); |
565 |
|
|
vDictNameCol( vdictfd_sub, curRec ); |
566 |
|
|
|
567 |
|
|
/* Variable def, units, refs column */ |
568 |
|
|
vDictDefnCol( compdictfd, curRec ); |
569 |
|
|
vDictDefnCol( vdictfd_sub, curRec ); |
570 |
|
|
|
571 |
|
|
/* Variable use count */ |
572 |
|
|
vDictUsesCol( compdictfd, curRec ); |
573 |
|
|
vDictUsesCol( vdictfd_sub, curRec ); |
574 |
|
|
|
575 |
|
|
/* End of row */ |
576 |
|
|
fprintf(compdictfd,"</TR>\n"); |
577 |
|
|
fprintf(compdictfd,"\n"); |
578 |
|
|
fprintf(vdictfd_sub,"</TR>\n"); |
579 |
|
|
fprintf(vdictfd_sub,"\n"); |
580 |
|
|
} |
581 |
|
|
} |
582 |
|
|
|
583 |
|
|
if ( compdictfd != NULL ) { |
584 |
|
|
/* End last Table of uses */ |
585 |
|
|
fprintf(compdictfd,"</TABLE>"); |
586 |
|
|
/* End document */ |
587 |
|
|
fprintf(compdictfd,"</HTML>\n"); |
588 |
|
|
fclose(compdictfd); |
589 |
|
|
} |
590 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
591 |
|
|
} |
592 |
|
|
|
593 |
|
|
GenerateProcDict() |
594 |
|
|
/* |
595 |
|
|
Generate tables of procedures |
596 |
|
|
*/ |
597 |
|
|
{ |
598 |
|
|
ddRecord *curRec; |
599 |
|
|
char *note; |
600 |
|
|
char curLetter = ' '; |
601 |
|
|
FILE *vdictfd_sub = NULL; |
602 |
|
|
char vdictSubName[MAXPATHNAM]; |
603 |
|
|
char vDictSubHeader[1024]; |
604 |
|
|
static char vDictHeader[] = "Alphabetic table of all subroutines and functions"; |
605 |
|
|
|
606 |
|
|
fprintf(stderr,"Hi there \n"); |
607 |
|
|
/* HTML headers */ |
608 |
|
|
vDictTitleWord=vDictHeader; |
609 |
|
|
vDictStart(procdictfd); |
610 |
|
|
vDictTitleWord=NULL; |
611 |
|
|
|
612 |
|
|
/* Table Entry */ |
613 |
|
|
while ( ddGetCurrent(&curRec) != 0 ) { |
614 |
|
|
if ( curRec->isProcName == 1 ) { |
615 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
616 |
|
|
curLetter = toupper(curRec->name[0]); |
617 |
|
|
html_indexRecord(procdictfd,curLetter); |
618 |
|
|
html_columnHeading(procdictfd); |
619 |
|
|
|
620 |
|
|
/* Do sub listing for this letter and/or symbol */ |
621 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
622 |
|
|
sprintf(vdictSubName,"%s/%s_pref%c%s",rootDir,PROCDICT,curLetter,HTMLSUF); |
623 |
|
|
vdictfd_sub = fopen(vdictSubName,"w"); |
624 |
|
|
sprintf(vDictSubHeader,"Table of subroutines anf functions starting with \"%c\"",curLetter); |
625 |
|
|
vDictTitleWord=vDictSubHeader; |
626 |
|
|
vDictStart(vdictfd_sub); |
627 |
|
|
vDictTitleWord=NULL; |
628 |
|
|
html_columnHeading(vdictfd_sub); |
629 |
|
|
|
630 |
|
|
} |
631 |
|
|
|
632 |
|
|
/* Start row */ |
633 |
|
|
fprintf(procdictfd,"<TR>\n"); |
634 |
|
|
fprintf(vdictfd_sub,"<TR>\n"); |
635 |
|
|
|
636 |
|
|
/* Variable name column */ |
637 |
|
|
vDictNameCol( procdictfd, curRec ); |
638 |
|
|
vDictNameCol( vdictfd_sub, curRec ); |
639 |
|
|
|
640 |
|
|
/* Variable def, units, refs column */ |
641 |
|
|
vDictDefnCol( procdictfd, curRec ); |
642 |
|
|
vDictDefnCol( vdictfd_sub, curRec ); |
643 |
|
|
|
644 |
|
|
/* Variable use count */ |
645 |
|
|
vDictUsesCol( procdictfd, curRec ); |
646 |
|
|
vDictUsesCol( vdictfd_sub, curRec ); |
647 |
|
|
|
648 |
|
|
/* End of row */ |
649 |
|
|
fprintf(procdictfd,"</TR>\n"); |
650 |
|
|
fprintf(procdictfd,"\n"); |
651 |
|
|
fprintf(vdictfd_sub,"</TR>\n"); |
652 |
|
|
fprintf(vdictfd_sub,"\n"); |
653 |
|
|
} |
654 |
|
|
} |
655 |
|
|
|
656 |
|
|
if ( procdictfd != NULL ) { |
657 |
|
|
/* End last Table of uses */ |
658 |
|
|
fprintf(procdictfd,"</TABLE>"); |
659 |
|
|
/* End document */ |
660 |
|
|
fprintf(procdictfd,"</HTML>\n"); |
661 |
|
|
fclose(procdictfd); |
662 |
|
|
} |
663 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
664 |
|
|
} |
665 |
|
|
|
666 |
|
|
GenerateVDict() |
667 |
|
|
{ |
668 |
|
|
ddRecord *curRec; |
669 |
|
|
char *note; |
670 |
|
|
char curLetter = ' '; |
671 |
|
|
FILE *vdictfd_sub = NULL; |
672 |
|
|
char vdictSubName[MAXPATHNAM]; |
673 |
|
|
char vDictSubHeader[1024]; |
674 |
|
|
static char vDictHeader[] = "Alphabetic table of all symbols"; |
675 |
|
|
|
676 |
|
|
fprintf(stderr,"Hi there \n"); |
677 |
|
|
/* HTML headers */ |
678 |
|
|
vDictTitleWord=vDictHeader; |
679 |
|
|
vDictStart(vdictfd); |
680 |
|
|
vDictTitleWord=NULL; |
681 |
|
|
|
682 |
|
|
/* Table Entry */ |
683 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
684 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
685 |
|
|
curLetter = toupper(curRec->name[0]); |
686 |
|
|
html_indexRecord(vdictfd,curLetter); |
687 |
|
|
html_columnHeading(vdictfd); |
688 |
|
|
|
689 |
|
|
/* Do sub listing for this letter and/or symbol */ |
690 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
691 |
|
|
sprintf(vdictSubName,"%s/%s_pref%c%s",rootDir,"vdict",curLetter,HTMLSUF); |
692 |
|
|
vdictfd_sub = fopen(vdictSubName,"w"); |
693 |
|
|
sprintf(vDictSubHeader,"Table of symbols starting with \"%c\"",curLetter); |
694 |
|
|
vDictTitleWord=vDictSubHeader; |
695 |
|
|
vDictStart(vdictfd_sub); |
696 |
|
|
vDictTitleWord=NULL; |
697 |
|
|
html_columnHeading(vdictfd_sub); |
698 |
|
|
|
699 |
|
|
} |
700 |
|
|
|
701 |
|
|
/* Start row */ |
702 |
|
|
fprintf(vdictfd,"<TR>\n"); |
703 |
|
|
fprintf(vdictfd_sub,"<TR>\n"); |
704 |
|
|
|
705 |
|
|
/* Variable name column */ |
706 |
|
|
vDictNameCol( vdictfd, curRec ); |
707 |
|
|
vDictNameCol( vdictfd_sub, curRec ); |
708 |
|
|
|
709 |
|
|
/* Variable def, units, refs column */ |
710 |
|
|
vDictDefnCol( vdictfd, curRec ); |
711 |
|
|
vDictDefnCol( vdictfd_sub, curRec ); |
712 |
|
|
|
713 |
|
|
/* Variable use count */ |
714 |
|
|
vDictUsesCol( vdictfd, curRec ); |
715 |
|
|
vDictUsesCol( vdictfd_sub, curRec ); |
716 |
|
|
|
717 |
|
|
/* End of row */ |
718 |
|
|
fprintf(vdictfd,"</TR>\n"); |
719 |
|
|
fprintf(vdictfd,"\n"); |
720 |
|
|
fprintf(vdictfd_sub,"</TR>\n"); |
721 |
|
|
fprintf(vdictfd_sub,"\n"); |
722 |
|
|
|
723 |
|
|
} |
724 |
|
|
|
725 |
|
|
if ( vdictfd != NULL ) { |
726 |
|
|
/* End last Table of uses */ |
727 |
|
|
fprintf(vdictfd,"</TABLE>"); |
728 |
|
|
/* End document */ |
729 |
|
|
fprintf(vdictfd,"</HTML>\n"); |
730 |
|
|
fclose(vdictfd); |
731 |
|
|
} |
732 |
|
|
if ( vdictfd_sub != NULL ) { vDictClose(vdictfd_sub); } |
733 |
|
|
|
734 |
|
|
} |
735 |
|
|
GenerateVDictIndex() |
736 |
|
|
{ |
737 |
|
|
FILE *fd; char fName[MAXPATHNAM]; |
738 |
|
|
char curLetter = ' '; |
739 |
|
|
ddRecord *curRec; |
740 |
|
|
|
741 |
|
|
/* HTML headers */ |
742 |
|
|
sprintf(fName,"%s/%s%s",rootDir,"index",HTMLSUF); |
743 |
|
|
fd = fopen(fName,"w"); |
744 |
|
|
fprintf(fd,"<HTML>"); fprintf(fd,"<HEAD>"); fprintf(fd,"</HEAD>"); |
745 |
|
|
fprintf(fd,"<TITLE>Name Index</TITLE>\n"); |
746 |
|
|
fprintf(fd,"<BODY text=\"#000000\" bgcolor=\"#FFFFFF\">"); |
747 |
|
|
|
748 |
|
|
while ( ddGetCurrent(&curRec) != 0 ){ |
749 |
|
|
if ( toupper(curRec->name[0]) != curLetter ){ |
750 |
|
|
curLetter = toupper(curRec->name[0]); |
751 |
|
|
/* |
752 |
|
|
fprintf(fd,"<BR><FONT SIZE=8 ><B>%c</A></B></FONT>\n",curLetter); |
753 |
|
|
fprintf(fd,"<FONT SIZE=2 ><B> \n"); */ |
754 |
|
|
fprintf(fd,"<BR><BR> \n"); |
755 |
|
|
fprintf(fd,"</LI><LI> \n"); |
756 |
|
|
} else { |
757 |
|
|
fprintf(fd,",\n"); |
758 |
|
|
} |
759 |
|
|
if ( curRec->active > 0 ) { |
760 |
|
|
fprintf(fd,"<A HREF=%s/%s%s>",VARSUF,curRec->key,HTMLSUF); |
761 |
|
|
fprintf(fd,"%s</A>",curRec->name); |
762 |
|
|
} else { |
763 |
|
|
fprintf(fd,"%s",curRec->name); |
764 |
|
|
} |
765 |
|
|
} |
766 |
|
|
/* End document */ |
767 |
|
|
fprintf(fd,"</BODY>\n"); |
768 |
|
|
fprintf(fd,"</HTML>\n"); |
769 |
|
|
fclose(fd); |
770 |
|
|
|
771 |
|
|
} |
772 |
|
|
|
773 |
|
|
int html_indexRecord(curFd, letter) |
774 |
|
|
FILE *curFd; |
775 |
|
|
char letter; |
776 |
|
|
{ |
777 |
|
|
int i; |
778 |
|
|
|
779 |
|
|
fprintf(curFd,"<TR>\n"); |
780 |
|
|
fprintf(curFd," <TD COLSPAN=3>\n"); |
781 |
|
|
fprintf(curFd," <FONT SIZE=8 ><B><A NAME=i_%c>%c</A></B></FONT>\n",letter,letter); |
782 |
|
|
fprintf(curFd," <FONT SIZE=2 ><B>\n"); |
783 |
|
|
for (i=0;i<24;i=i+3){ |
784 |
|
|
fprintf(curFd," <A HREF=#i_%c><U>%c</U></A>",'A'+i,'A'+i); |
785 |
|
|
fprintf(curFd," <A HREF=#i_%c><U>%c</U></A>",'A'+i+1,'A'+i+1); |
786 |
|
|
fprintf(curFd," <A HREF=#i_%c><U>%c</U></A>\n",'A'+i+2,'A'+i+2); |
787 |
|
|
} |
788 |
|
|
fprintf(curFd," <A HREF=#i_%c><U>%c</U></A>",'Y','Y'); |
789 |
|
|
fprintf(curFd," <A HREF=#i_%c><U>%c</U></A>\n",'Z','Z'); |
790 |
|
|
fprintf(curFd," </FONT></B>\n"); |
791 |
|
|
fprintf(curFd," </TD>\n"); |
792 |
|
|
fprintf(curFd,"</TR>\n"); |
793 |
|
|
fprintf(curFd,"\n"); |
794 |
|
|
} |
795 |
|
|
|
796 |
|
|
int html_columnHeading(FILE *curFd) |
797 |
|
|
{ |
798 |
|
|
fprintf(curFd,"<TR>\n"); |
799 |
|
|
fprintf(curFd," <TD VALIGN=\"CENTER\" HEIGHT=40 ALIGN=\"CENTER\"> "); |
800 |
|
|
fprintf(curFd," <FONT SIZE=5><B><U>Symbol </U></B></FONT>"); |
801 |
|
|
fprintf(curFd," </TD>\n"); |
802 |
|
|
fprintf(curFd," <TD VALIGN=\"CENTER\" HEIGHT=40 ALIGN=\"CENTER\"> "); |
803 |
|
|
fprintf(curFd," <FONT SIZE=5><B><U>Description</U></B></FONT>"); |
804 |
|
|
fprintf(curFd," </TD>\n"); |
805 |
|
|
fprintf(curFd," <TD VALIGN=\"CENTER\" HEIGHT=40 ALIGN=\"CENTER\"> "); |
806 |
|
|
fprintf(curFd," <FONT SIZE=5><B><U>Uses</U></B></FONT>"); |
807 |
|
|
fprintf(curFd," </TD>\n"); |
808 |
|
|
fprintf(curFd,"</TR>\n"); |
809 |
|
|
fprintf(curFd,"\n"); |
810 |
|
|
} |
811 |
|
|
|
812 |
|
|
int vDictClose(FILE *curFd) |
813 |
|
|
{ |
814 |
|
|
/* End last Table of uses */ |
815 |
|
|
fprintf(curFd,"</TABLE>"); |
816 |
|
|
/* End document */ |
817 |
|
|
fprintf(curFd,"</BODY></HTML>\n"); |
818 |
|
|
fclose(curFd); |
819 |
|
|
} |
820 |
|
|
|
821 |
|
|
int vDictStart(FILE *curFd) |
822 |
|
|
{ |
823 |
|
|
fprintf(curFd,"<HTML>\n"); |
824 |
|
|
fprintf(curFd,"<HEAD>\n"); |
825 |
|
|
fprintf(curFd,"</HEAD>\n"); |
826 |
|
|
if ( vDictTitleWord == NULL ) vDictTitleWord = vDictDefaultTitleWord; |
827 |
|
|
fprintf(curFd,"<TITLE>%s</TITLE>\n",vDictTitleWord); |
828 |
|
|
fprintf(curFd,"<BODY text=\"#000000\" bgcolor=\"#FFFFFF\">"); |
829 |
|
|
/* Begin table */ |
830 |
|
|
fprintf(curFd, |
831 |
|
|
"<TABLE BORDER CELLSPACING=1 BORDERCOLOR=\"#000000\" CELLPADDING=2 >\n"); |
832 |
|
|
} |
833 |
|
|
|
834 |
|
|
int vDictNameCol(FILE *vdictfd, ddRecord *curRec) |
835 |
|
|
{ |
836 |
|
|
if ( curRec->active > 0 ) { |
837 |
|
|
fprintf(vdictfd," <TD>\n <B><FONT FACE=\"Courier\"><A HREF=%s/%s%s> ", |
838 |
|
|
VARSUF,curRec->key,HTMLSUF); |
839 |
|
|
fprintf(vdictfd,"%s </A></B></FONT>\n </TD>\n",curRec->name); |
840 |
|
|
} else { |
841 |
|
|
fprintf(vdictfd," <TD>\n <B><FONT FACE=\"Courier\">"); |
842 |
|
|
fprintf(vdictfd,"%s </B></FONT>\n </TD>\n",curRec->name); |
843 |
|
|
} |
844 |
|
|
} |
845 |
|
|
|
846 |
|
|
vDictDefnCol(FILE *vdictfd, ddRecord *curRec ) |
847 |
|
|
{ |
848 |
|
|
char *note; |
849 |
|
|
fprintf(vdictfd," <TD>\n"); |
850 |
|
|
fprintf(vdictfd," <A NAME=var.%s>",curRec->name); |
851 |
|
|
if ( curRec->textEntry != NULL ) { |
852 |
|
|
fprintf(vdictfd," %s</A>\n",curRec->textEntry); |
853 |
|
|
} else { |
854 |
|
|
fprintf(vdictfd," <B><U> </U></B></A>\n"); |
855 |
|
|
/* fprintf(vdictfd," <B><U>%s %s %s %s</U></B></A>\n", |
856 |
|
|
"*** NO DEFINITION ***", "*** NO DEFINITION ***", |
857 |
|
|
"*** NO DEFINITION ***", "*** NO DEFINITION ***"); */ |
858 |
|
|
} |
859 |
|
|
if ( curRec->unitsEntry != NULL && strlen(curRec->unitsEntry) != 0 ){ |
860 |
|
|
fprintf(vdictfd," (<I>units</I>: %s ) \n",curRec->unitsEntry); |
861 |
|
|
} |
862 |
|
|
if ( curRec->hrefEntry != NULL && strlen(curRec->hrefEntry) != 0 ){ |
863 |
|
|
fprintf(vdictfd," <sub><A HREF=%s><IMG SRC=\"OpenBookIcon.gif\"",curRec->hrefEntry); |
864 |
|
|
fprintf(vdictfd,"WIDTH=30 HEIGHT=15 ALT=\"Goto Manual\"></A></sub>\n"); |
865 |
|
|
} |
866 |
|
|
if ( curRec->footNotesEntry != NULL ){ |
867 |
|
|
fprintf(vdictfd," <sup><B>"); |
868 |
|
|
note=strtok(curRec->footNotesEntry," "); |
869 |
|
|
fprintf(vdictfd,"<A HREF=#footnote_%s>%s</A>",note,note); |
870 |
|
|
while ( (note = strtok((char *)NULL," ")) != (char *)NULL ) { |
871 |
|
|
fprintf(vdictfd,"\n, <A HREF=#footnote_%s>%s</A>",note,note); |
872 |
|
|
} |
873 |
|
|
fprintf(vdictfd,"</B></sup>\n"); |
874 |
|
|
} |
875 |
|
|
fprintf(vdictfd," </TD>\n"); |
876 |
|
|
} |
877 |
|
|
|
878 |
|
|
int vDictUsesCol(FILE *vdictfd, ddRecord *curRec) |
879 |
|
|
{ |
880 |
|
|
fprintf(vdictfd," <TD>\n"); |
881 |
|
|
fprintf(vdictfd," %d\n",curRec->active); |
882 |
|
|
fprintf(vdictfd," </TD>\n"); |
883 |
|
|
} |
884 |
|
|
|
885 |
|
|
/* Record new entry in dd */ |
886 |
|
|
int addRecord() |
887 |
|
|
{ |
888 |
|
|
ddRecord rec; int recNo; |
889 |
|
|
rec.name = curName; |
890 |
|
|
rec.hrefEntry = curHref; |
891 |
|
|
rec.textEntry = curText; |
892 |
|
|
rec.unitsEntry = curUnits; |
893 |
|
|
rec.footNotesEntry = curFootNotes; |
894 |
|
|
rec.active = 0; |
895 |
|
|
fprintf(stdout,"Adding DD record %s\n",rec.name); |
896 |
|
|
fflush(stdout); |
897 |
|
|
|
898 |
|
|
/* Make dd entry */ |
899 |
|
|
ddAdd(&rec); |
900 |
|
|
|
901 |
|
|
/* Free temporary name string copies */ |
902 |
|
|
if ( curName != NULL ) { |
903 |
|
|
fprintf(stdout,"Free %s\n",curName);fflush(stdout); |
904 |
|
|
free(curName);curName=NULL; |
905 |
|
|
} |
906 |
|
|
if ( curHref != NULL ) { |
907 |
|
|
fprintf(stdout,"Free %s\n",curHref);fflush(stdout); |
908 |
|
|
free(curHref);curHref=NULL; |
909 |
|
|
} |
910 |
|
|
if ( curText != NULL ) { |
911 |
|
|
fprintf(stdout,"Free %s\n",curText);fflush(stdout); |
912 |
|
|
free(curText);curText=NULL; |
913 |
|
|
} |
914 |
|
|
if ( curUnits != NULL ) { |
915 |
|
|
fprintf(stdout,"Free %s\n",curUnits);fflush(stdout); |
916 |
|
|
free(curUnits);curUnits=NULL; |
917 |
|
|
} |
918 |
|
|
if ( curFootNotes != NULL ) { |
919 |
|
|
fprintf(stdout,"Free %s\n",curFootNotes);fflush(stdout); |
920 |
|
|
free(curFootNotes);curFootNotes=NULL; |
921 |
|
|
} |
922 |
|
|
|
923 |
|
|
fprintf(stdout,"Added DD record \n"); |
924 |
|
|
fflush(stdout); |
925 |
|
|
} |
926 |
|
|
|
927 |
|
|
/* Join two strdup created strings and free the originals */ |
928 |
|
|
char *strjoin(s1, s2) |
929 |
|
|
char *s1; char *s2; |
930 |
|
|
{ |
931 |
|
|
char *s; |
932 |
|
|
|
933 |
|
|
fprintf(stdout, "strjoin called \n"); |
934 |
|
|
fflush(stdout); |
935 |
|
|
|
936 |
|
|
/* DEBUG - Die if both strings are NULL */ |
937 |
|
|
/* if ( s1 == NULL && s2 == NULL ) exit(); */ |
938 |
|
|
|
939 |
|
|
/* If either string is NULL return other */ |
940 |
|
|
if ( s1 == NULL ) return(s2); |
941 |
|
|
if ( s2 == NULL ) return(s1); |
942 |
|
|
|
943 |
|
|
s = (char *)malloc(strlen(s1)+strlen(s2)+1); |
944 |
|
|
s = strcpy(s,s1); |
945 |
|
|
s = strcat(s,s2); |
946 |
|
|
|
947 |
|
|
} |
948 |
|
|
|
949 |
|
|
/* Like strdup but changes \. into . */ |
950 |
|
|
char *strcopy(s1) |
951 |
|
|
char *s1; |
952 |
|
|
{ |
953 |
|
|
char *s; int i;int l; int bs; int el; |
954 |
|
|
|
955 |
|
|
/* If string is NULL return. */ |
956 |
|
|
if ( s1 == NULL ) return(s1); |
957 |
|
|
s = strdup(s1); |
958 |
|
|
return(s); |
959 |
|
|
|
960 |
|
|
l = strlen(s1)+1; bs = 0; el=0; |
961 |
|
|
s = (char *)malloc(l); |
962 |
|
|
if ( s == NULL ) return(s); |
963 |
|
|
for ( i=0;i<l;++i) { |
964 |
|
|
if ( bs == 0 ) { |
965 |
|
|
if ( s1[i] != '\\' ) { |
966 |
|
|
s[el]=s1[i];++el; |
967 |
|
|
} |
968 |
|
|
else { |
969 |
|
|
bs = 1; |
970 |
|
|
} |
971 |
|
|
} else { |
972 |
|
|
s[el]=s1[i];++el; bs=0; |
973 |
|
|
} |
974 |
|
|
} |
975 |
|
|
s[el]='\0'; |
976 |
|
|
return(s); |
977 |
|
|
} |
978 |
|
|
|
979 |
|
|
int ParseF90Code() |
980 |
|
|
/* Read the source code */ |
981 |
|
|
{ |
982 |
|
|
int i; FILE *file; int j; |
983 |
|
|
char tmpFileName[MAXPATHNAM]; |
984 |
|
|
char srcFileName[MAXPATHNAM]; |
985 |
|
|
char srcDirName[MAXPATHNAM]; |
986 |
|
|
|
987 |
|
|
/* Create scratch file for loggin variable uses */ |
988 |
|
|
sprintf(tmpFileName,"%s/%s",OUTDIR,TMP1); |
989 |
|
|
tmpfd = fopen(tmpFileName,"w"); |
990 |
|
|
|
991 |
|
|
/* Parse the list of source files */ |
992 |
|
|
if ( argList.nSFiles > 0 ) { |
993 |
|
|
for (i=1;i<=argList.nSFiles;++i){ |
994 |
|
|
file = fopen(argList.srcFiles[i-1],"r"); |
995 |
|
|
if (!file) { |
996 |
|
|
fprintf(stderr,"Unable to open file \"%s\"\n",argList.srcFiles[i-1]); |
997 |
|
|
} else { |
998 |
|
|
F90symin = file; |
999 |
|
|
currentFile=argList.srcFiles[i-1]; |
1000 |
|
|
j=strlen(argList.srcFiles[i-1]); |
1001 |
|
|
while ( j > 0 && *(argList.srcFiles[i-1]+j-1) != '/') --j; |
1002 |
|
|
currentProcedure=NOPROC; |
1003 |
|
|
Lno=1; Cno=1; |
1004 |
|
|
currentLineHtml[0]=(char)NULL; |
1005 |
|
|
/* Create file for writing html source */ |
1006 |
|
|
++nSrcFile; |
1007 |
|
|
sprintf(sHtmlName,"%s/%d%s",srcDir,nSrcFile,HTMLSUF); |
1008 |
|
|
srcfd=fopen(sHtmlName,"w"); |
1009 |
|
|
sprintf(sHtmlName,"%d%s",nSrcFile,HTMLSUF); |
1010 |
|
|
fprintf(srcfd,"<HTML>\n"); |
1011 |
|
|
fprintf(srcfd,"<TITLE>%s</TITLE>\n",currentFile); |
1012 |
|
|
fprintf(srcfd,"<BODY text=\"#000000\" bgcolor=\"#FFFFFF\">\n"); |
1013 |
|
|
fprintf(srcfd,"<PRE>\n"); |
1014 |
|
|
|
1015 |
|
|
F90symparse(); |
1016 |
|
|
fprintf(srcfd,"</PRE></BODY></HTML>\n"); |
1017 |
|
|
fclose(srcfd); |
1018 |
|
|
fclose(file); |
1019 |
|
|
/* Write directory, file and HTML src name */ |
1020 |
|
|
strncpy(srcDirName,argList.srcFiles[i-1],MAXPATHNAM-1); |
1021 |
|
|
srcDirName[j]='\0'; |
1022 |
|
|
if ( j == 0 ) { |
1023 |
|
|
srcDirName[0] = '.'; |
1024 |
|
|
srcDirName[1] = '/'; |
1025 |
|
|
srcDirName[2] = '\0'; |
1026 |
|
|
} |
1027 |
|
|
strncpy(srcFileName,argList.srcFiles[i-1]+j,MAXPATHNAM-1); |
1028 |
|
|
srcFileName[MAXPATHNAM]='\0'; |
1029 |
|
|
printf("HTM %s %s %s\n", |
1030 |
|
|
srcDirName, srcFileName,sHtmlName); |
1031 |
|
|
/* Add entry to the "FileDirectory" table. */ |
1032 |
|
|
fdAdd( srcDirName, srcFileName, sHtmlName ); |
1033 |
|
|
} |
1034 |
|
|
} |
1035 |
|
|
fdPrint(); |
1036 |
|
|
} |
1037 |
|
|
else |
1038 |
|
|
{ |
1039 |
|
|
currentFile="STANDARD INPUT";currentLineHtml[0]=(char)NULL; |
1040 |
|
|
F90symparse(); |
1041 |
|
|
} |
1042 |
|
|
|
1043 |
|
|
fclose(tmpfd); |
1044 |
|
|
} |
1045 |
|
|
|
1046 |
|
|
int tblSort() |
1047 |
|
|
{ |
1048 |
|
|
/* |
1049 |
|
|
use system() to sort tmp1 > tmp2. |
1050 |
|
|
Sort removes multiple entries so that if a variable appears |
1051 |
|
|
multiple times on a single line only one table entry will |
1052 |
|
|
be generated. |
1053 |
|
|
*/ |
1054 |
|
|
char command[500]; |
1055 |
|
|
sprintf(command,"sort %s/%s | uniq | grep -v '^ *$' > %s/%s", |
1056 |
|
|
OUTDIR,TMP1,OUTDIR,TMP2); |
1057 |
|
|
system(command); |
1058 |
|
|
} |
1059 |
|
|
|
1060 |
|
|
int GenerateVarTables() |
1061 |
|
|
{ |
1062 |
|
|
char tmpFileName[MAXPATHNAM]; |
1063 |
|
|
char vdFileName[MAXPATHNAM]; |
1064 |
|
|
char ioBuff[currentLineHtmlSize*2]; |
1065 |
|
|
char *vNam, *vLast, *lineRef, *fileRef, *procRef, *codeRec; |
1066 |
|
|
char *note; |
1067 |
|
|
FILE *tabfd; |
1068 |
|
|
ddRecord *curRec; |
1069 |
|
|
ddRecord rec; |
1070 |
|
|
|
1071 |
|
|
sprintf(tmpFileName,"%s/%s",OUTDIR,TMP2); |
1072 |
|
|
tabfd = fopen(tmpFileName,"r"); |
1073 |
|
|
vLast = NULL; vdictfd = NULL; |
1074 |
|
|
|
1075 |
|
|
while ( fscanf(tabfd,"%[^\n]%*[\n]",ioBuff) != EOF ) { |
1076 |
edhill |
1.2 |
/* Begin CNH debug */ |
1077 |
|
|
/* printf("ioBuff = \"%s\"\n",ioBuff); */ |
1078 |
|
|
/* exit(1); */ |
1079 |
|
|
/* End CNH debug */ |
1080 |
adcroft |
1.1 |
vNam = strtok(ioBuff,","); |
1081 |
|
|
/* Trick here that should be fixed. */ |
1082 |
|
|
/* Testing lineRef != NULL checks to see whether the */ |
1083 |
|
|
/* there was a format error in the sorted file. The */ |
1084 |
|
|
/* file will only have an error if the parsing rules */ |
1085 |
|
|
/* are incomplete. */ |
1086 |
edhill |
1.2 |
if ( vNam != NULL ) { |
1087 |
|
|
lineRef = strtok(NULL,","); |
1088 |
adcroft |
1.1 |
fileRef = strtok(NULL,","); |
1089 |
|
|
procRef = strtok(NULL,","); |
1090 |
|
|
codeRec = procRef+strlen(procRef)+1; |
1091 |
|
|
if ( vLast == NULL || strcmp(vNam,vLast) != 0 ) { |
1092 |
|
|
if ( vLast != NULL ){ free(vLast);} |
1093 |
|
|
vLast = strdup(vNam); |
1094 |
|
|
rec.name = vNam; |
1095 |
|
|
curRec = ddFind(&rec); |
1096 |
|
|
if ( curRec == NULL ) { |
1097 |
|
|
printf("Variable %s NOT FOUND\n",vNam); |
1098 |
|
|
exit(1); |
1099 |
|
|
} else { |
1100 |
|
|
printf("New variable %s key = %s\n",vNam,curRec->key); |
1101 |
|
|
} |
1102 |
|
|
if ( vdictfd != NULL ){ |
1103 |
|
|
/* End Table of uses */ |
1104 |
|
|
fprintf(vdictfd,"</TABLE>"); |
1105 |
|
|
/* End document */ |
1106 |
|
|
fprintf(vdictfd,"</HTML>\n"); |
1107 |
|
|
fclose(vdictfd); |
1108 |
|
|
} |
1109 |
|
|
sprintf(vdFileName,"%s/%s/%s%s",OUTDIR,VARSUF,curRec->key,HTMLSUF); |
1110 |
|
|
vdictfd = fopen(vdFileName,"w"); |
1111 |
|
|
/* HTML headers */ |
1112 |
|
|
fprintf(vdictfd,"<HTML>\n"); |
1113 |
|
|
fprintf(vdictfd,"<HEAD>\n"); |
1114 |
|
|
fprintf(vdictfd,"</HEAD>\n"); |
1115 |
|
|
fprintf(vdictfd,"<TITLE>Table showing occurences of \"%s\"</TITLE>\n",curRec->name); |
1116 |
|
|
fprintf(vdictfd,"<BODY text=\"#000000\" bgcolor=\"#FFFFFF\">\n"); |
1117 |
|
|
/* Begin table */ |
1118 |
|
|
fprintf(vdictfd, |
1119 |
|
|
"<TABLE BORDER CELLSPACING=1 BORDERCOLOR=\"#000000\" CELLPADDING=2 >\n"); |
1120 |
|
|
html_columnHeading(vdictfd); |
1121 |
|
|
fprintf(vdictfd,"<TR>\n"); |
1122 |
|
|
fprintf(vdictfd," <TD>\n <B><FONT FACE=\"Courier\">"); |
1123 |
|
|
fprintf(vdictfd,"%s </B></FONT>\n </TD>\n",curRec->name); |
1124 |
|
|
fprintf(vdictfd," <TD>\n"); |
1125 |
|
|
fprintf(vdictfd," <A NAME=var.%s>",curRec->name); |
1126 |
|
|
if ( curRec->textEntry != NULL ) { |
1127 |
|
|
fprintf(vdictfd," %s</A>\n",curRec->textEntry); |
1128 |
|
|
} |
1129 |
|
|
else |
1130 |
|
|
{ |
1131 |
|
|
fprintf(vdictfd," <B><U> </U></B></A>\n"); |
1132 |
|
|
/* fprintf(vdictfd," <B><U>%s %s %s %s</U></B></A>\n", |
1133 |
|
|
"*** NO DEFINITION ***", "*** NO DEFINITION ***", |
1134 |
|
|
"*** NO DEFINITION ***", "*** NO DEFINITION ***"); */ |
1135 |
|
|
} |
1136 |
|
|
if ( curRec->unitsEntry != NULL && strlen(curRec->unitsEntry) != 0 ){ |
1137 |
|
|
fprintf(vdictfd," (<I>units</I>: %s ) \n",curRec->unitsEntry); |
1138 |
|
|
} |
1139 |
|
|
if ( curRec->hrefEntry != NULL && strlen(curRec->hrefEntry) != 0 ){ |
1140 |
|
|
fprintf(vdictfd," <sub><A HREF=%s><IMG SRC=\"OpenBookIcon.gif\"",curRec->hrefEntry); |
1141 |
|
|
fprintf(vdictfd,"WIDTH=30 HEIGHT=15 ALT=\"Goto Manual\"></A></sub>\n"); |
1142 |
|
|
} |
1143 |
|
|
if ( curRec->footNotesEntry != NULL ){ |
1144 |
|
|
fprintf(vdictfd," <sup><B>"); |
1145 |
|
|
note=strtok(curRec->footNotesEntry," "); |
1146 |
|
|
fprintf(vdictfd,"<A HREF=#footnote_%s>%s</A>",note,note); |
1147 |
|
|
while ( (note = strtok((char *)NULL," ")) != (char *)NULL ) { |
1148 |
|
|
fprintf(vdictfd,"\n, <A HREF=#footnote_%s>%s</A>",note,note); |
1149 |
|
|
} |
1150 |
|
|
fprintf(vdictfd,"</B></sup>\n"); |
1151 |
|
|
} |
1152 |
|
|
fprintf(vdictfd," </TD>\n"); |
1153 |
|
|
fprintf(vdictfd," <TD>\n"); |
1154 |
|
|
fprintf(vdictfd," %d\n",curRec->active); |
1155 |
|
|
fprintf(vdictfd," </TD>\n"); |
1156 |
|
|
fprintf(vdictfd,"</TR>\n"); |
1157 |
|
|
fprintf(vdictfd,"\n"); |
1158 |
|
|
/* End header table */ |
1159 |
|
|
fprintf(vdictfd,"</TABLE>\n<BR><HR><BR>\n"); |
1160 |
|
|
|
1161 |
|
|
/* Begin table of uses */ |
1162 |
|
|
fprintf(vdictfd, |
1163 |
|
|
"<TABLE BORDER CELLSPACING=1 BORDERCOLOR=\"#000000\" CELLPADDING=2 WIDTH=900>\n"); |
1164 |
|
|
fprintf(vdictfd,"<TR>\n<TD>File</TD>\n<TD>Line number</TD>\n<TD>Procedure</TD>\n<TD>Code</TD>\n</TR>\n"); |
1165 |
|
|
} |
1166 |
|
|
/* Table of uses */ |
1167 |
|
|
fprintf(vdictfd,"<TR>\n"); |
1168 |
|
|
fprintf(vdictfd," <TD>\n"); |
1169 |
|
|
fprintf(vdictfd," %s",fileRef); |
1170 |
|
|
fprintf(vdictfd," </TD>\n"); |
1171 |
|
|
fprintf(vdictfd," <TD>\n"); |
1172 |
|
|
fprintf(vdictfd," %s",lineRef); |
1173 |
|
|
fprintf(vdictfd," </TD>\n"); |
1174 |
|
|
fprintf(vdictfd," <TD>\n"); |
1175 |
|
|
fprintf(vdictfd," %s",procRef); |
1176 |
|
|
fprintf(vdictfd," </TD>\n"); |
1177 |
|
|
fprintf(vdictfd," <TD>\n"); |
1178 |
|
|
fprintf(vdictfd," <PRE>%s</PRE>",codeRec); |
1179 |
|
|
fprintf(vdictfd," </TD>\n"); |
1180 |
|
|
fprintf(vdictfd,"</TR>\n"); |
1181 |
|
|
} |
1182 |
|
|
} |
1183 |
|
|
if ( vdictfd != NULL ){ |
1184 |
|
|
/* End last Table of uses */ |
1185 |
|
|
fprintf(vdictfd,"</TABLE>"); |
1186 |
|
|
/* End document */ |
1187 |
|
|
fprintf(vdictfd,"</BODY></HTML>\n"); |
1188 |
|
|
fclose(vdictfd); |
1189 |
|
|
} |
1190 |
|
|
} |