#!/usr/bin/mawk -We
# *********************************************************************
#  Written by and copyright Carlo Strozzi <carlos@linux.it>.
#
#  envtotable: convert environment variables into a NoSQL table.
#  Copyright (C) 1998-2001 Carlo Strozzi <carlos@linux.it>
# 
#  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; either version 2 of the License, or
#  (at your option) any later version.
# 
#  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.
#
#  2001-01-03 Ported to NoSQL v3
#  2001-04-17 Added inline help
#  2001-07-30 Added option '-K'
#  2001-08-17 Added stdio portability
#
#  $Id$
# *********************************************************************

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

  while (ARGV[++i] != NULL) {
    if (ARGV[i] == "-m" || ARGV[i] == "--match") m_pattern = ARGV[++i]
    else if (ARGV[i] == "-d" || ARGV[i] == "--delete") {
      remove = 1; d_pattern = ARGV[++i]
    }
    else if (ARGV[i] == "-b" || ARGV[i] == "--blank") {
      blank = 1; b_pattern = ARGV[++i]
    }
    else if (ARGV[i] == "-x" || ARGV[i] == "--debug") debug = 1
    else if (ARGV[i] == "-s" || ARGV[i] == "--strip-names") {
      strip_names = 1; s_pattern = ARGV[++i]
    }
    else if (ARGV[i] == "-N" || ARGV[i] == "--no-header") no_hdr = 1
    else if (ARGV[i] == "-H" || ARGV[i] == "--header") {
      h_file = ARGV[++i]
    }
    else if (ARGV[i] == "-h" || ARGV[i] == "--help") {
      system("grep -v '^#' @NOSQLPATH@/nosql/help/envtotable.txt")
      rc = 1
      exit(rc)
    }
    else if (ARGV[i] == "-p" || ARGV[i] == "--prefix") prefix = ARGV[++i]
    else if (ARGV[i] == "-K" || ARGV[i] == "--key") key = ARGV[++i]
  }

  ARGC = 1					# Fix argv[]

  if (debug) {
    print "-m pattern: " m_pattern    > "@STDERR@"
    print "-d pattern: " d_pattern    > "@STDERR@"
    print "-b pattern: " b_pattern    > "@STDERR@"
    print "-s pattern: " s_pattern    > "@STDERR@"
  }

  if (m_pattern == NULL) m_pattern = ".*"

  if (key != NULL) {
     # Do table key first, if requested.
     for (env in ENVIRON) {
	 if (env == key) {
	    process_var(env)
	    break
	 }
     }
  }

  for (env in ENVIRON) {
      if (key != NULL && env == key) continue	# Already done.
      process_var(env)
  }

  # Print column names.
  if (col_names == NULL) exit
  if (!no_hdr) print col_names

  # Print dashline.
  dash_line = col_names
  gsub( /[^\t]/, "-", dash_line )
  if (!no_hdr) print dash_line

  # Print table body.
  print out_rec

  # Write the detached output header, if requested.
  if (h_file != NULL) {
    printf("%s\n%s\n", col_names, dash_line) > h_file
  }
}

function process_var(env) {

   if (env !~ m_pattern) return

   # Always skip rc(1) functions and NoSQL-specific stuff.
   if (env ~ /^fn_/ || env ~ /^_nosql_/ || env == "NSQPGPPASS") return

   # Skip invalid variable names. They may occur when we receive
   # them from a WWW Browser.
   if (env !~ /^[A-Za-z][A-Za-z0-9_]+$/) {
      print "envtotable: bad variable name " env > "@STDERR@"
      return
   }

   # Honour the '-s' switch.
   dd = env
   if (strip_names) gsub(s_pattern, NULL, dd)

   # In case we stripped the whole name.
   if (dd == NULL) return

   dd = prefix dd

   if (j) col_names = col_names OFS dd
   else col_names = dd

   var = ENVIRON[ env ]

   # Honour '-d' and '-b' first.
   if (remove) gsub(d_pattern, NULL, var)
   if (blank) gsub(b_pattern, " ", var)

   # Escape NoSQL special characters in input values.
   gsub(/\n/, "\\n", var)
   gsub(/\t/, "\\t", var)

   if (j) { out_rec = out_rec OFS var; j++ }
   else { out_rec = var; j++ }
}

#
# End of program.
#
