#! /usr/bin/gawk -f

# Usage: "multicol [ -v lines=NUM ] FILE...

function filedims(name, max,   line, len)
{
  # Scans file "name", sets "maxwidth" to the the maximum line length,
  # sets "numlines" to the number of lines.
  maxwidth = 0;
  numlines = 0;
  while ((numlines < max) && (getline line < name))
    { if (ERRNO != 0) 
        { printf "%s: %s\n", name, ERRNO > "/dev/stderr"; exit(1); }
      numlines++;
      len = length(line); 
      if (len > maxwidth) { maxwidth = len; }
    }
  close(name);
}

BEGIN {
  split("", width);
  split("", height);
  maxlines = 0;
  for (i=1; i< ARGC; i++) 
    { filedims(ARGV[i], (lines == 0 ? 9999999 : lines));
      width[i] = maxwidth;
      height[i] = numlines;
      if (numlines > maxlines) { maxlines = numlines; }
    }
  if ((lines != 0) && (maxlines > lines)) 
    { printf "huh?\n" > "/dev/stderr"; exit(1); }
  # Print file names
  for (i=1; i< ARGC; i++) 
    { if (i > 1) { printf "  "; }
      printf "%-*s", width[i], ARGV[i];
    }
  printf "\n";
  # Print dashed lines
  for (i=1; i< ARGC; i++) 
    { if (i > 1) { printf "  "; }
      for (r=1; r<=width[i]; r++) { printf "-"; }
    }
  printf "\n";
  # Print files
  for (k=1; k <= lines; k++)
    { for (i=1; i< ARGC; i++) 
        { if (k > height[i])
            { line = ""; }
          else
            { getline line < ARGV[i]; }
          if (i > 1) { printf "  "; }
          printf "%-*s", width[i], line;
        }
      printf "\n";
    }
  ARGC = 0;
  exit(0);
}

/./ { printf "input ignored\n" >> "/dev/stderr"; exit(1); }