1#!/bin/sh
2
3# srctoman - extract manual page from source file comment
4
5# @(#) srctoman.sh 1.2 11/4/89 15:56:22
6
7LANG=
8
9# process arguments
10
11while :
12do
13    case $1 in
14 [0-9]) SECT=$1;;
15     -) LANG=$1; B='[#:]';;
16  -awk) LANG=$1; B='#';;
17    -c) LANG=$1; B='\/\*';;
18    -f) LANG=$1; B='[Cc]';;
19   -mk) LANG=$1; B='#';;
20 -n|-t) LANG=$1; B='\\"';;
21    -p) LANG=$1; B='{';;
22    -r) LANG=$1; B='#';;
23    -C) LANG=$1; B=$2; shift;;
24    -*) ERROR="unknown option: $1"; break;;
25    "") ERROR="missing file argument"; break;;
26     *) break;;
27    esac
28    shift
29done
30
31# check error status
32
33case $ERROR in
34"") ;;
35 *) echo "$0: $ERROR" 1>&2
36    echo "usage: $0 [-|-awk|-c|-f|-mk|-n|-p|-t|-r|-C] [section] file(s)" 1>&2; exit 1;;
37esac
38
39# set up for file suffix processing
40
41case $LANG in
42"") sh='[:#]';      r='#';    rh=$r;    awk='#'; mk='#';
43    c='\/\*';       h=$c;     y=$c;     l=$c;
44    f='[Cc]';       fh=$f;    p='{';    ph=$p;
45    ms='\\"';       nr=$ms;   mn=$ms;   man=$ms;
46esac
47
48# extract comments
49
50for i in $*
51do
52    case $LANG in
53    "") eval B\="\$`expr $i : '.*\.\([^.]*\)$'`"
54          test "$B" || { echo "$0: unknown suffix: $i; assuming c" 1>&2; B=$c; }
55    esac
56    sed '
57    /^'"$B"'++/,/^'"$B"'--/!d
58    /^'"$B"'++/d
59    /^'"$B"'--/d
60    s/[   ]*$//
61    /^'"$B"' \([A-Z]\)/{
62          s//\1/
63          /^NAME[   ]*$/{
64              N
65              s/^.*\n'"$B"'[  ]*//
66              s/[   ]*$//
67              h
68              s/,.*\( [0-9][^ ]*\)$/\1/
69              y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
70              s/^.*$/.TH & '"$SECT"'\
71.ad\
72.fi\
73.SH NAME/
74              p
75              g
76              s/[   ][        ]*[0-9][  ]*$//
77              a\
78\\-
79              p
80              d
81          }
82          /^SUMMARY/d
83          /^DESCRIPTION/s//.SH &\
84.ad\
85.fi/
86          /^BUGS/s//.SH &\
87.ad\
88.fi/
89          /^DIAGNOSTICS/s//.SH &\
90.ad\
91.fi/
92          /^HISTORY/s//.SH &\
93.ad\
94.fi/
95          /^[A-Z][A-Z][A-Z][^a-z]*$/s//.SH "&"\
96.na\
97.nf/
98          p
99          d
100    }
101    s/^'"$B"' *//
102    s/^   //
103    s/^[  ]*$//
104    /^\\"/d
105    /^\./{
106          s/\([^ ]\)-/\1\\-/g
107    }
108    /^'"'"'/{
109          s/^/\\\&/
110    }
111    /^[^.]/{
112          s/-/\\-/g
113    }
114' $i
115done | expand
116
117exit
118
119#++
120# NAME
121#         srctoman 1
122# SUMMARY
123#         extract manual page from source file comment
124# PACKAGE
125#         sdetools
126# SYNOPSIS
127#         srctoman [-|-awk|-c|-f|-mk|-m|-n|-p|-t|-r|-C] [section] file(s)
128# DESCRIPTION
129#         \fIsrctoman\fR converts comments in various programming languages to
130#         UNIX-style manual pages.
131#         The command processes comments in the style of newsrc(1);
132#         its standard output is suitable for formatting with nroff(1) or
133#         troff(1) using the "-man" macro package.
134#         Typically, srctoman is invoked from make(1) scripts.
135#
136#         Source files are processed in the indicated order; if no
137#         files are specified the command produces no output.
138#
139#         The source file language can be specified through a command-line
140#         option, or can be implied by the filename suffix.
141#         The expected start-of-comment symbol is shown in the last column.
142#
143# .nf
144# .ft C
145          option    language  comment
146
147          -         shell               [:#]
148          -awk      awk                 #
149          -c        c                   /*
150          -f        fortran             [Cc]
151          -mk       make                #
152          -n        nroff               \\"
153          -p        pascal              {
154          -t        troff               \\"
155          -r        ratfor              #
156          -C        any language        next argument
157#
158          suffix    language  comment
159
160          .awk      awk                 #
161          .c        c                   /*
162          .f        fortran             [Cc]
163          .fh       fortran             [Cc]
164          .h        c                   /*
165          .l        lex                 /*
166          .man      nroff,troff         \\"
167          .mk       make                #
168          .me       nroff,troff         \\"
169          .ms       nroff,troff         \\"
170          .nr       nroff,troff         \\"
171          .p        pascal              {
172          .ph       pascal              {
173          .r        ratfor              #
174          .rh       ratfor              #
175          .sh       shell               [:#]
176          .y        yacc                /*
177# .ft
178# .PP
179# .fi
180#
181#         The required format of comments is discussed below, where SOC
182#         stands for the start-of-comment symbol of the language being used.
183# .IP o
184#         Start of manual: SOC, followed by `++'.
185# .IP o
186#         Section heading: SOC, blank, section name in upper case.
187# .IP o
188#         All other text: SOC and subsequent blanks or tabs are removed.
189#         Lines that do not start with SOC are left unchanged (useful for
190#         inclusion of program text).
191# .IP o
192#         End of manual: SOC, followed by `--'.
193#         An end-of-comment may follow if the source file language requires this.
194# .PP
195#         The following manual sections receive a special treatment:
196#         NAME and SUMMARY should appear at the beginning and in
197#         this order; DESCRIPTION, DIAGNOSTICS and BUGS will be
198#         right-margin adjusted.
199#         Other sections may be added freely without confusing srctoman.
200# COMMANDS
201#         sh(1), sed(1), expand(1)
202# SEE ALSO
203#         newsrc(1)
204# DIAGNOSTICS
205#         The program complains if an unknown language is specified
206#         of if the language cannot be deduced from the file suffix.
207# AUTHOR(S)
208#         W.Z. Venema
209#         Eindhoven University of Technology
210#         Department of Mathematics and Computer Science
211#         Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
212# CREATION DATE
213#         Fri Jan 17 22:59:27 MET 1986
214# STATUS
215#         srctoman.sh 1.2 11/4/89 15:56:22 (draft)
216#--
217