Extracting documentation from C code.
Ivan Peters
ivanp at mc.UUCP
Thu Jun 6 23:44:58 AEST 1991
In article <BENNY.91May15185447 at dimona.vlss.amdahl.com>, benny at vlss.amdahl.com (Benny Schnaider) writes:
|> Hi,
|>
|> I am looking for a utility to extract documentation from a "C"
|> program. I want to have the documentation source as part of the "C" code
|> (comments) which can be easily extracted in a troff (man page)
|> format. The output should be similar to man 3 output format.
|>
|> Thanks,
|> Benny
|> --
Heres another way, among many...
We have the following format for standard headers in the src...
file headers:
/*M***************************************************************************
*
* File Name: filename.c
*
* Description: This module .....
*
*
* Functions:
* function_name
* function_name
*
*
*
*
* Revision History:
* Date Engineer Comment
* mm/dd/yy I. Software xxxxxxxxxxxxxxxxxx
*
****************************************************************************M*/
functions in files:
/*F****************************************************************************
*
* Function Name: function_name
*
* Description: This function ..
*
* Input:
*
*
* Output:
*
*
* Return:
*
*
* Notes:
*
*
*
*
****************************************************************************F*/
include file headers:
/*I***************************************************************************
*
* File Name: filename.h
*
* Description: Common equates for files
*
*
* Revision History:
* Date Engineer Comment
* mm/dd/yy I. Software xxxxxxxxxxxxxxxxxx
*
****************************************************************************I*/
I have a combination awk/sed script that will generate manpages of the stuff
in those headers as follows:
awk '/\*M\*/,/\*\*M\*/
/\*F\*/,/\*\*F\*/
/\*I\*/,/\*\*I\*/' | \
sed -e 's%\/\*F\*% %g' \
-e 's%\*F\*\/% %g' \
-e 's%\/\*M\*% %g' \
-e 's%\*M\*\/% %g' \
-e 's%\*% %g' |\
awk '
BEGIN { f=0 }
{if (($1 ~ /File/) && ($2 ~ /Name/)) { {print ".TH",$3, "3"} ; f++}
else {if ($1 ~ /Description\:/) {print ".SH",$0}
else {if ($1 ~ /Functions\:/) {print ".SH",$0}
else {if (($1 ~ /Revision/) && ($2 ~ /History\:/)) {print ".SH",$0}
else {if (($1 ~ /Function/) && ($2 ~ /Name\:/)) {print ".TH",$3, "3"}
else {if ($1 ~ /Input\:/) {print ".SH",$0}
else {if ($1 ~ /Output\:/) {print ".SH",$0}
else {if ($1 ~ /Return\:/) {print ".SH",$0}
else {if (f > 0) {print $0 } }
}
}
}
}
}
}
}
}
' | \
awk '
BEGIN {n=0}
{ for (i=1; i<=NF; i++)
{{printf "%s ",$i}
{if (i ==NF)
{
{printf "\n"}
{n++}
}
}
}
}
{if (NR >= n+1 ) {
{printf "\n"}
{n = NR}
}
}
------------------
Known bug: It strips any info, on the same line (following) a key word.
example: Description xxxxx (will remove xxxxx)
This can easily be fixed with a awk function but I did not have the time yet.
Since this is a awk/sed script, it is easily modified, and portable. One
can change the keyword searches, in the comments to whatever... One could
also change this for other comment styles/headers/src other than 'c' easily.
Excuse me for useing awk/sed (for you alt lang types) in advance. Perl
might be able to do this easier, but I have not yet graduated from awk/sed
land yet... :-).
This generates the man format.
(If you see him, Say hi to Mark Schrandt at Amdahl for me...:-) )
More information about the Comp.unix.programmer
mailing list