#!/usr/bin/perl

#
#-- Kaputte QP-Encodings pro Zeile reparieren.
#   fixqp v1.0
#   2011-01-09 Holger Marzen, holger@marzen.de
#
#   QP-Markierung darf sich nicht ueber mehrere Zeilen erstrecken.
#   Sinnvoll fuer den Aufruf durch procmail zum Reparieren von
#   Mailheadern, die Leerzeichen im kodierten Bereich enthalten.
#
#   :0 fhwi
#   * (^From|^Subject):.*=?[^?]*?Q?.* .*?=
#   | /usr/local/bin/fixqp.pl
#
use strict;
use warnings;

my $line;
my $subline;
my $startstr="=?";
my $startstrlen=length($startstr);
my $endstr="?=";
my $endstrlen=length($endstr);
my $startpos;
my $endpos;
my $i;
my $inside;

while ($line=<STDIN>)
  {
  chomp($line);

  #-- Leerzeichen direkt hinter und vor dem Delimiter loeschen
  $line=~s/(=\?[^\?]*\?Q\?)  */$1/ig;
  $line=~s/  *(\?=)/$1/g;

  #-- Uebrige Leerzeichen zwischen Delimiter durch _ ersetzen
  for ($i=0, $inside=0;
       $i<=length($line)-$startstrlen-$endstrlen;
       $i++)
    {
    if (substr($line, $i, $startstrlen) eq $startstr)
      {
      $inside=1;
      $startpos=$i+$startstrlen;
      $i+=$startstrlen-1;
      next;
      }

    if ($inside)
      {
      if (substr($line, $i, $endstrlen) eq $endstr)
        {
        $endpos=$i;
        $subline=substr($line, $startpos, $endpos-$startpos);
        $subline=~s/ /_/g;
        substr($line, $startpos, $endpos-$startpos) = $subline;
        $inside=0;
        }
      }
    }

    #-- Headerzeile ausgeben
    printf("%s\n", $line);
  }
