#!/usr/bin/perl

$code = $ARGV[0] or die "syntax: read-dpkg-lists code < list";

sub rd {
  $line = <STDIN>;
  chomp $line;
}

sub escape {
  my $v = $_[0];
  $v =~ s/\\/\\\\/g;
  $v =~ s/\n/\\n/g;
  return $v;
}

sub puts {
  print join(" ", map escape($_), @_), "\n";
}

sub td {
  print join("\t", map escape($_), @_), "\n";
}

sub first {
  my $v = $_[0];
  if ($v =~ /^\s/) {
    return "";
  } else {
    $v =~ s/\n.*//s;
    return $v;
  }
}

sub show_some_no_nl {
  for $field (@_) {
    if ($pkg{$field} =~ /\n/) {
      print $field, ":";
      if ($pkg{$field} =~ /^\s/) {
        print "\n$pkg{$field}";
      } else {
        print " $pkg{$field}"
      }
    } else {
      print $field, ": ", $pkg{$field}, "\n";
    }
  }
}

sub show {
  show_some_no_nl();
  print "\n";
}

sub show_no_nl {
  show_some_no_nl(@fields);
}

sub show_some {
  show_some_no_nl(@_);
  print "\n";
}

eval q#
  rd();
  while (defined $line) {
    @fields = ();
    %pkg = ();
    while ($line ne "") {
      ($field, $value) = split /: ?/, $line, 2;
      push @fields, $field;
      rd();
      if ($line =~ /^\s/ and $value ne "") {
        $value .= "\n";
      }
      while ($line =~ /^\s+/) {
        $value .= "$line\n";
        rd();
      }
      $$field = $value;
      $pkg{$field} = $value;
    }
    #.$code.q#;
    for $field (@fields) { undef $$field; }
    rd();
  }
#;
die $@ if $@;
