David Buddrige wrote:
> Hi all,
>
> I am writing a program which will re-arrange a doc++ comment.
>
> A doc++ comment is a C/C++ comment that starts with an extra "*". An
> example of a doc++ comment is this:
>
> /**
> @doc Some general info about a function.
> @precondition Any precondition that the function has
> @postcondition Any postcondition that the function has.
> */
>
>
>
> I want to have all of my doc++ comments formatted so that the start
> comment "/**" is on a line by itself, and each @entry is on a line by
> itself.
>
> At the moment, I have some doc++ comments that are like this:
>
> /** @doc
>
> This is some general info about a function
>
> @precondition
>
> This is info about a precondition.
> */
>
> I would like to re-arrange this comment so that it looks like this:
>
> /**
> @doc This is some general info about a function
> @precondition This is info about a precondition.
> */
>
> To do this, I have written the following function:
>
> # This subroutine takes as input a single array reference, and
> # rearranges any doc++ commands that are split over multiple lines so
> # that each doc++ command is on a line of its own, including the /** and
> # */ delimiters which indicate the start and end of a doc++ comment.
>
> sub format_docpp_comment
> {
> my $doc_comment_array;
> my $comment_line;
> my $single_comment_line;
>
> $doc_comment_array = $_[0]; # give a friendly name to the array
>
> foreach $comment_line ( @$doc_comment_array )
> {
> #chomp $comment_line;
> my $temp_string;
> $temp_string = $comment_line;
> chomp $temp_string;
> $single_comment_line .= $temp_string;
> }
>
> # At this point we have a single string that contains our entire
> # doc++ comment. We can now use simple pattern matching to parse
> # it.
>
> $single_comment_line =~ m"(\/\*\*)(([\t\n
> ]*)(\@)(doc|invariant|return|precondition|postcondition)([\t\n\w\.\
> ]+))+";
> print "2: $2\n";
> }
>
>
>
> At this point, the $2 variable has within it, the very first doc++ style
> comment which is usually:
>
> @doc some text.
>
> I want to get at the rest of the repeated @somecommand doc++ commands.
>
> Does anyone know how this is done?
>
> I kind'of want to store what I have already matched in $2 to some
> scalar, and then delete that part of the string matched so far, so that
> I can repeat the pattern match for the next chunk. However I am not
> sure how to proceed.
>
> thanks
>
> David.
I haven't really read your code careful enough to see what you have done
wrong but from the description of your problem, the following seems to work
well:
#!/usr/bin/perl -w
use strict;
my $i =<<'M';
/** @abcd
hi whatever
@again
whatever is the world
*/
M
$i =~ tr/\n//d;
$i =~ s#\*/$#\n\*/#;
$i =~ s/@/\n\t@/g;
print "$i\n";
__END__
prints:
/**
@abcd hi whatever
@again whatever is the world
*/
you will have to make $i a array ref to your function of course but I am
sure you know how to do that :-)
david
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]