#!/usr/bin/perl

use strict;

# default value
my $format = "%";
my $pattern = "";

# help message
sub usage() {

  print <<EOF;
usage: getcomments [-f string] [-h] [-p regex] file...
 -f|--format string: format string for output printing [%]
 -h|--help: help message
 -p|--pattern regex: pattern matching on block []

 Extract C/C++ block of comments

Example: getcomments.pl -p='test:\\s' -f='./%' random.c
EOF

  exit 1;
}

usage() if ($#ARGV < 0);

# process argument
foreach my $arg (@ARGV) {
  use vars qw/$caif $caip $naif $naip/;

  # analyse format argument
  ($caif, $_) = ($arg =~ /^(-f|--format)=(.*)/);
  ($caif, $_) = (1, $arg) if ($naif);
  next if ($naif = ($arg =~ /^(-f|--format)$/));
  if ($caif) { $format = $_; next }

  # check for help message
  usage() if ($arg =~ /^(-h|--help)$/);

  # analyse pattern argument
  ($caip, $_) = ($arg =~ /^(-p|--pattern)=(.*)/);
  ($caip, $_) = (1, $arg) if ($naip);
  next if ($naip = ($arg =~ /^(-p|--pattern)$/));
  if ($caip) { $pattern = $_; next }

  # no more argument, only file
  my $filename = $arg;

  # open file
  if (!open (IN, "<", $filename)) {
    print "Can not open $filename\n";
  }

  # init table of comments
  my @comments;
  $#comments = -1;

  # read all the file
  while ($_ .= <IN>) {
    my $cmt;

    # process c++ comments
    ($cmt, $_) = m{//\s*(.*?)\s*$()} if (m{//} && !m{/\*.*//});

    # process standard c comments
    ($cmt, $_) = m{^.*?/\*\s*(.*?)\s*\*/(.*)}s if (m{/\*.*\*/}s);

    push(@comments, $cmt) if ($cmt);

    # empty buffer if no comment is present
    undef($_) if (!m{/[/*]});
  }

  # close file
  close (IN);

  # display comment blocks
  foreach my $block (@comments) {
    if (($block) = ($block =~ /$pattern(.*)/s)) {
      ($_ = $format) =~ s/%/$block/gs;
      print "$_\n";
    }
  }
}
