4 # Lager en tekstlig oppsummering over mange perl-skript basert på
5 # kommentarer i filene.
6 # Kjenner igjen følgende variabler: @project, @module, @status,
7 # @author, @version, @made, @params, @param, @return og @see.
9 # @author Petter Reinholdtsen <pere@td.org.uit.no>
11 # @version $Id: extract-comments,v 1.1 2003/06/02 13:01:37 pere Exp $
13 # @params [-p <project>] [-m <module>] <files>
14 # @return Oppsummering for alle filene
15 # @module Utviklingsverktøy
18 # require "getopts.pl"; # GNU getopts lib
25 ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
30 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
34 Versjon: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
38 Parametre: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
42 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
46 Returnerer: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
50 Forfatter(e):^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
52 ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
56 ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
61 ========================================================================
63 Fil: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
65 Prosjekt: @<<<<<<<<<<<<<<<<<<<< Modul: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
67 Require: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
69 Uses: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
79 $def_project = $opt_p;
87 foreach $file (@files) {
88 if (-f $file && !( $file =~ m%CVS/%)) {
89 $exec = &parse_perl_file($file);
90 $exec_status{$file} = $exec;
96 # Skriver ut alle filene sortert alfabetisk på prosjekt, modul og
99 foreach $subroutine (sort keys %info) {
100 ($project, $module, $file, $method) = split(/;/, $subroutine);
101 if ($project ne $lastproject || $module ne $lastmodule ||
102 $file ne $lastfile) {
105 $lastproject = $project;
106 $lastmodule = $module;
110 $require = $require{$file};
111 $require =~ s/;/, /g;
112 $exec = $exec_status{$file};
113 $file .= " ($exec)" if ($exec);
118 if ($info{"$project;$module;$file;about"}) {
119 ($intro, $authors, $version, $params, $param, $retval)
120 =split("\t", delete $info{"$project;$module;$file;about"});
121 $~ = "AUTHOR"; # XXX skriver ikke ut noenting
134 next if ( $opt_f || $subroutine =~ m/about$/ );
135 ($intro, $authors, $version, $params, $param, $retval)
136 = split("\t", $info{$subroutine});
137 $subroutine = "$method()";
138 @authorlist = split(";", $authors);
140 foreach (@authorlist) {
141 push(@author, m/([^,]+)/);
143 $author = join(", ", @author);
161 foreach $paramline (split(/;/, $param)) {
173 # Leser gjennom en perl-fil og leser ut info fra kommentarene om hver
174 # enkelt subrutine. Returnerer %info der nøkkel er
175 # "prosjekt;modul;subrutinene" og innhold er intro,
176 # forfatterliste(;-delt) og versjon.
177 # @return "X" if script is executable - "" if not.
179 sub parse_perl_file {
181 $project = ($def_project? $def_project: "");
182 $module = ($def_module? $def_module: "");
184 open(FILE, "<$file");
188 $first_line = $_ unless ($first_line);
189 if ( /^##+\s*/ || $running_descrtiption ) {
190 $running_descrtiption = "1";
191 if ( ! /^##*\s*\@[^\s,.:]+\s+/ && /^#/ ) {
192 ($text) = m/^#+\s*([^#\s]+.*)$/;
196 $running_descrtiption = "";
200 if (/^\s*sub\s+([^\{ ]*)\s*\{*/) {
203 if ($intro =~ m/^\s+$/) {
206 $info{"$project;$module;$file;$subroutine"}
207 = join("\t", $intro, join(";",@authors),
208 $version,$params,$param,$retval);
211 if (/^\s*require\s+(.*);.*$/) {
212 $require{$file} = ($require{$file} ? "$require{$file};$1" : $1);
214 if (/^\s*use\s+(.*);.*$/) {
215 $use{$file} = ($use{$file} ? "$use{$file};$1" : $1);
219 # Look in all the comments
220 if (/^#\s*\@author\s+(.*)$/) {
223 if (/^#\s*\@version\s+(.*)$/) {
226 if (/^#\s*\@params\s+(.*)$/) {
229 if (/^#\s*\@param\s+(.*)$/) {
230 $param = ($param ? "$param;$1" : "$1");
232 if (/^#\s*\@return\s*(.*)$/) {
235 if (/^#\s*\@module\s+(.*)$/) {
238 if (/^#\s*\@project\s+(.*)$/) {
245 $info{"$project;$module;$file;about"} = "\t";
248 return ($first_line =~ m%#!/.*/bin/perl%) ? "X" : "";
251 # Blanker ut alle nødvendige variabler mellom hver subrutine. Kalles
252 # fra parse_perl_file()
253 # @see parse_perl_file
254 sub clear_parse_vars {
261 undef $running_descrtiption;