#!/usr/bin/perl
# The Missing Textutils, Ondrej Bojar, obo@cuni.cz
# http://www.cuni.cz/~obo/textutils
#
# 'lcat' is like 'cat' but the concatenated files are prefixed with the
# filename. The name stands for 'labelled cat'.
#
# $Id: lcat,v 1.8 2014-01-17 13:39:16 bojar Exp $
#

use strict;
use Getopt::Long;

my $head = 0; # use 'head'-like format ==> FN <==
my $delim = "\t";
my @glob = ();
my $fl = undef;
my $skip_missing = 0;
my $show_line_numbers = 0;
GetOptions(
  "head"=>\$head,
  "show-line-numbers"=>\$show_line_numbers,
  "delim"=>\$delim,
  "glob=s" => \@glob,
  "fl=s" => \$fl,
  "skip-missing-files" => \$skip_missing,
);

my @fl = ();
if (defined $fl) {
  if ($fl eq "-") {
    *IN = *STDIN;
  } else {
    open IN, $fl or die "Can't read $fl";
  }
  while (<IN>) {
    chomp;
    push @fl, $_;
  }
  if ($fl ne "-") {
    close(IN);
  }
}

foreach my $fn (@ARGV, (map {(glob($_));} @glob), @fl) {
  if ($fn eq "-") {
    my $nr = 0;
    my $maynr = "";
    while (<>) {
      $nr++;
      print "<stdin>";
      print ":".$nr if $show_line_numbers;
      print $delim;
      print;
    }
  } else {
    my $ofn = $fn;
    if ($skip_missing && ! -e $fn) {
      print STDERR "Not found, skipping: $fn\n";
      next;
    }
    $ofn = "zcat $fn |" if $fn =~ /\.gz$/;
    $ofn = "bzcat $fn |" if $fn =~ /\.bz2$/;
    print "==> $fn <==\n" if $head;
    open INF, $ofn or die "Can't open '$ofn'";
    my $nr = 0;
    while (<INF>) {
      $nr++;
      # ensure line ends:
      chomp; $_ .= "\n";
      if ($head) {
        print $nr.":" if $show_line_numbers;
        print;
      } else {
        print $fn;
        print ":".$nr if $show_line_numbers;
        print $delim;
        print;
      }
    }
    close INF;
  }
}
