#!/usr/bin/mawk -We
# *********************************************************************
# maketable: builds a valid table header from a template file.
#
# Copyright (c) 1998,2006 Carlo Strozzi
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 dated June, 1991.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# *********************************************************************
# $Id: maketable,v 1.6 2006/03/10 11:26:13 carlo Exp $

BEGIN {
   NULL = ""; FS = OFS = "\t"

   # Get local settings.
   nosql_install = ENVIRON["NOSQL_INSTALL"]
   stdout = ENVIRON["NOSQL_STDOUT"]
   stderr = ENVIRON["NOSQL_STDERR"]

   # Set default values if necessary.
   if (nosql_install == NULL) nosql_install = "/usr/local/nosql"
   if (stdout == NULL) stdout = "/dev/stdout"
   if (stderr == NULL) stderr = "/dev/stderr"

   while(ARGV[++i] != NULL) {
      if (ARGV[i] == "-i" || ARGV[i] == "--input") i_file = ARGV[++i]
      else if (ARGV[i] == "-m" || ARGV[i] == "--match") pattern = ARGV[++i]
      else if (ARGV[i] == "-o" || ARGV[i] == "--output") o_file = ARGV[++i]
      else if (ARGV[i] == "-c" || ARGV[i] == "--count") cnt = 1
      else if (ARGV[i] == "-n" || ARGV[i] == "--names-only") names = 1
      else if (ARGV[i] == "-k" || ARGV[i] == "--set-key") key = ARGV[++i]
      else if (ARGV[i] == "-K" || ARGV[i] == "--key") {
	key_value = ARGV[++i]
	# Escape special characters in key value.
	gsub(/\t/, "\\t", key_value)
	gsub(/\n/, "\\n", key_value)
	addrow = 1
      }
      else if (ARGV[i] == "-a" || ARGV[i] == "--add-row") addrow = 1
      else if (ARGV[i] == "-h" || ARGV[i] == "--help") {
	 system("grep -v '^#' " nosql_install "/help/maketable.txt")
	 exit(rc=1)
      }
      else if (ARGV[i] == "--show-copying") {
	 system("cat " nosql_install "/doc/COPYING")
	 exit(rc=1)
      }
      else if (ARGV[i] == "--show-warranty") {
	 system("cat " nosql_install "/doc/WARRANTY")
	 exit(rc=1)
      }
   }

   ARGC = 1						# Fix argv[]

   if (o_file == NULL) o_file = stdout
   if (i_file != NULL) { ARGV[1] = i_file; ARGC = 2 }
}

# Skip empty and comment lines.
/^[ \t]*$/ || /^[ \t]*#/ { next }

{
  # Make sure we do not get fooled by blanks.
  lb = sub(/^[ \t]+/, NULL)		# test for leading blanks/tabs
  gsub(/[ \t] +/, "\t")

  if ($1 ~ /^[0-9]+$/ && NF > 1) field_name = $2
  else {
     if (lb) next			# skip continuation lines.
     field_name = $1
  }

  if (pattern != NULL) {
     if (field_name ~ pattern) {
	if (key == "") out_rec = out_rec OFS field_name
	else {
	   if (field_name == key) first_field = field_name
	   else out_rec = out_rec OFS field_name
	}
     }
  }  else {
     if (key == "") out_rec = out_rec OFS field_name
     else {
	if (field_name == key) first_field = field_name
	else out_rec = out_rec OFS field_name
     }
  }
}

END {
  if (rc) exit(rc)

  # Remove the extra leading tab.
  sub(/^\t/, NULL, out_rec)

  if (first_field != "") out_rec = first_field OFS out_rec

  # Insert SOH markers if necessary.
  if (!names) {
     printf("\001")
     gsub(/\t/,"\t\001", out_rec)
  }

  print out_rec > o_file

  if ((cnt || addrow) && !names) {
     $0 = out_rec
     out_rec = 1
     i = 1
     while (++i <= NF) out_rec = out_rec OFS i
     if (!cnt) gsub(/[^\t]+/,"",out_rec)
     $0 = out_rec
     if (key_value != "") {
	$1 = key_value
	out_rec = $0
     }
     print > o_file
  }
}

# End of program
