libraries/spcre/libpcre/pcre/CleanTxt
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Sat, 31 Jul 2010 19:07:57 +0100
changeset 23 092bcc217d9d
parent 0 7f656887cf89
permissions -rw-r--r--
Tidied iocli exports, build macro tweaks. Removed 4 overloads of CCommandBase::RunCommand[L] that are no longer used at all, and changed one more to not be exported as it's only used internally to iocli.dll. fixed builds on platforms that don't support btrace or any form of tracing.

#! /usr/bin/perl -w

# Script to take the output of nroff -man and remove all the backspacing and
# the page footers and the screen commands etc so that it is more usefully
# readable online. In fact, in the latest nroff, intermediate footers don't
# seem to be generated any more.

$blankcount = 0;
$lastwascut = 0;
$firstheader = 1;

# Input on STDIN; output to STDOUT.

while (<STDIN>)
  {
  s/\x1b\[\d+m//g;   # Remove screen controls "ESC [ number m"
  s/.\x8//g;         # Remove "char, backspace"

  # Handle header lines. Retain only the first one we encounter, but remove
  # the blank line that follows. Any others (e.g. at end of document) and the
  # following blank line are dropped.

  if (/^PCRE(\w*)\(([13])\)\s+PCRE\1\(\2\)$/)
    {
    if ($firstheader)
      {
      $firstheader = 0;
      print;
      $lastprinted = $_;
      $lastwascut = 0;
      }
    $_=<STDIN>;       # Remove a blank that follows
    next;
    }

  # Count runs of empty lines

  if (/^\s*$/)
    {
    $blankcount++;
    $lastwascut = 0;
    next;
    }

  # If a chunk of lines has been cut out (page footer) and the next line
  # has a different indentation, put back one blank line.

  if ($lastwascut && $blankcount < 1 && defined($lastprinted))
    {
    ($a) = $lastprinted =~ /^(\s*)/;
    ($b) = $_ =~ /^(\s*)/;
    $blankcount++ if ($a ne $b);
    }

  # We get here only when we have a non-blank line in hand. If it was preceded
  # by 3 or more blank lines, read the next 3 lines and see if they are blank.
  # If so, remove all 7 lines, and remember that we have just done a cut.

  if ($blankcount >= 3)
    {
    for ($i = 0; $i < 3; $i++)
      {
      $next[$i] = <STDIN>;
      $next[$i] = "" if !defined $next[$i];
      $next[$i] =~ s/\x1b\[\d+m//g;   # Remove screen controls "ESC [ number m"
      $next[$i] =~ s/.\x8//g;         # Remove "char, backspace"
      }

    # Cut out chunks of the form <3 blanks><non-blank><3 blanks>

    if ($next[0] =~ /^\s*$/ &&
        $next[1] =~ /^\s*$/ &&
        $next[2] =~ /^\s*$/)
      {
      $blankcount -= 3;
      $lastwascut = 1;
      }

    # Otherwise output the saved blanks, the current, and the next three
    # lines. Remember the last printed line.

    else
      {
      for ($i = 0; $i < $blankcount; $i++) { print "\n"; }
      print;
      for ($i = 0; $i < 3; $i++)
        {
        $next[$i] =~ s/.\x8//g;
        print $next[$i];
        $lastprinted = $_;
        }
      $lastwascut = 0;
      $blankcount = 0;
      }
    }

  # This non-blank line is not preceded by 3 or more blank lines. Output
  # any blanks there are, and the line. Remember it. Force two blank lines
  # before headings.

  else
    {
    $blankcount = 2 if /^\S/ && !/^Last updated/ && !/^Copyright/ &&
      defined($lastprinted);
    for ($i = 0; $i < $blankcount; $i++) { print "\n"; }
    print;
    $lastprinted = $_;
    $lastwascut = 0;
    $blankcount = 0;
    }
  }

# End