16 All characters in 's' are 'ch'.
33 first_full = len(txtlst)
36 min_indent =
max(map(len, txtlst))
41 if len(line.strip()) == 0:
52 min_indent =
min(min_indent, len(line) - len(line.lstrip()))
60 if i >= first_full
and i <= last_empty:
61 all_lines.append(line.rstrip()[min_indent:])
67 arglst = argstr.split(
",")
71 name = re.match(
"(\w+)", a[::-1]).group()
72 prefix = a[:-len(name)]
73 newarglist.append((prefix, name[::-1]))
78 def __init__(self, funcname, C_args, argdict, purpose, details):
86 txt = open(fname).read()
87 purpose_idx = txt.find(
"\n", txt.find(
"Purpose")+14)+1
88 args_idx = txt.find(
"Arguments", purpose_idx)
89 func_idx = txt.rfind(
'extern "C"', 1, purpose_idx)
90 funcname = txt[txt.find(
"\n", func_idx)+1 : txt.find(
"(", func_idx)]
91 C_args_idx = txt.find(
"(", func_idx) + 1
93 C_args =
parse_args(txt[C_args_idx : txt.find(
")", C_args_idx)])
95 details_idx = txt.find(
" Further Details", args_idx)
97 eoc_idx = txt.find(
"*/", args_idx)
100 argend_idx = details_idx
103 details_idx = txt.find(
"\n", details_idx + 30) + 1
106 details =
cleanup(txt[details_idx:eoc_idx])
112 argdict[argname] = list()
115 for argline
in txt[args_idx:argend_idx].split(
"\n"):
116 argfields = argline.split()
120 for inout
in (
"input",
"output",
"workspace"):
122 if re.match(
" *\w+ *\(%s" % inout, argline):
123 argname = argfields[0]
124 arginout = argline[argline.find(
"(") : argline.find(
")")+1]
125 argtype = argline[argline.find(
")")+1 :].strip()
126 argdict[argname] = [(arginout, argtype)]
131 argdict[argname].append(argline)
134 inout = argdict[key][0]
135 argdict[key] = [inout] +
cleanup_lst(argdict[key][1:])
139 fields = l[idx].split()
140 if len(fields) == 1
and is_all_char(fields[0],
"="):
143 purpose =
cleanup(txt[purpose_idx:args_idx])
145 return FuncDoc(funcname, C_args, argdict, purpose, details)
149 latexdoc =
"\\textsf{magma\_int\_t} "
150 latexdoc +=
"\\textsf{\\textbf{%s}}" % funcdoc.funcname.replace(
"_",
"\\_")
151 latexdoc +=
"(\\textsf{"
152 latexdoc +=
", ".join(funcdoc.C_args).replace(
"_",
"\\_")
153 latexdoc +=
"}); \\\n"
155 latexdoc +=
"Arguments:\\\n\\begin{description}"
157 for arg
in funcdoc.C_args:
160 for idx
in range(larg):
163 argname = ch + argname
167 latexdoc +=
"\\item[" + argname +
"] "
169 karg = argname.upper()
170 if 0
and not funcdoc.argdict.has_key(karg):
174 ldoc = funcdoc.argdict[karg]
175 latexdoc += ldoc[0] +
"\n"
176 latexdoc +=
"\\begin{verbatim}\n"
182 lidx =
min(lidx, len(l) - len(l.lstrip()))
186 latexdoc += l[lidx:] +
"\n"
187 latexdoc +=
"\end{verbatim}\n"
195 latexdoc +=
"\\end{description}"
201 return "<" + tag +
">" + s +
"</" + tag.split()[0] +
">\n"
209 font-family: sans-serif;
213 font-family: sans-serif;
220 border-top: 1px solid #A8B8D9;
221 border-left: 1px solid #A8B8D9;
222 border-right: 1px solid #A8B8D9;
223 padding: 6px 0px 6px 0px;
226 text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
227 /* firefox specific markup */
228 -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
229 -moz-border-radius-topright: 8px;
230 -moz-border-radius-topleft: 8px;
231 /* webkit specific markup */
232 -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
233 -webkit-border-top-right-radius: 8px;
234 -webkit-border-top-left-radius: 8px;
235 background-image:url('nav_f.png');
236 background-repeat:repeat-x;
237 background-color: #E2E8F2;
239 pre {background: #ffffee; border: 1px solid silver; padding: 0.5em;}
257 return "<tr><td>" + s +
" "
258 return self.
tag(
'div class="ret_type"', s)
261 return self.
tag(
'b', s) +
"</td>"
262 return self.
tag(
'div class="funcname"', s)
265 return "<p><h2>%s</h2>\n<pre>\n" % s
268 return "</pre>\n</p>\n"
271 return "<p><h2>%s</h2>\n" % s
272 return self.
tag(
'div class="arguments"', s) +
"<ul>\n"
278 return "<li><b>" + argname +
"</b>\n"
287 return self.
tag(
"em", s)
296 return "</pre>\n</li>\n"
299 return "<p><h2>%s</h2>\n<pre>\n" % s
302 return "</pre>\n</p>\n"
309 return "<td>)</td>\n</tr>\n"
312 return "<td>" + prefix +
" " + self.
tag(
"em", argname) +
"<td>\n</tr>\n<tr><td></td><td></td>"
315 doc = output.begin_decl()
316 doc += output.ret_type(
"magma_int_t")
317 doc += output.funcname(fdoc.funcname)
318 doc += output.begin_args_decl(len(fdoc.C_args))
319 doc +=
"".join(map(
lambda s: output.decl_arg(s[0], s[1]), fdoc.C_args))
320 doc += output.end_args_decl()
321 doc += output.end_decl()
323 doc += output.begin_purpose(
"Purpose:")
325 doc += output.end_purpose(
"Purpose:")
327 doc += output.begin_arguments(
"Arguments:")
329 for arg
in fdoc.C_args:
331 doc += output.begin_arg(argname)
332 doc += output.end_arg(argname)
334 karg = argname.upper()
335 if 0
and not funcdoc.argdict.has_key(karg):
338 ldoc = fdoc.argdict.get(karg, [(
"(missing)", arg[0]),
"MISSING"])
348 lidx =
min(lidx, len(l) - len(l.lstrip()))
350 doc += output.inoutwork(ldoc[0][0])
351 doc += output.arg_type(ldoc[0][1])
352 doc += output.begin_arg_desc(argname)
356 doc += output.arg_desc_line(l[lidx:])
358 doc += output.end_arg_desc(argname)
361 doc += output.end_arguments(
"Arguments:")
364 doc += output.begin_details(
"Further Details:")
366 doc += output.end_details(
"Further Details:")
373 if not os.path.exists(outdir):
377 for fname
in argv[1:]:
378 ofname = os.path.basename(fname).replace(
"cpp",
"html")
379 of = open(os.path.join(outdir, ofname),
"w")
383 of.write(odoc.preamble(
"MAGMA"))
389 of.write(odoc.epilog(
"MAGMA"))
391 fl.append((funcdoc.funcname, ofname))
393 idxf = open(os.path.join(outdir,
"index.html"),
"w")
394 idxf.write(
"<html>\n<head><title>MAGMA 1.0</title></head>\n<body>\n<h1>MAGMA 1.0 Function Index</h1><ul>\n")
397 idxf.write(
"""<li><a href="%s"><code>%s</code></a></li>\n""" % (ofname, funcname))
398 idxf.write(
"</ul>\n</body>\n</html>\n")
402 if "__main__" == __name__ :
403 sys.exit(
main(sys.argv))