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]

Reply via email to