#!/bin/bash
# -*- Mode:sh; Coding:us-ascii-unix; fill-column:158 -*-
################################################################################################################################################################
##
# @file      universalCat.sh
# @author    Mitch Richling <https://www.mitchr.me>
# @brief     Like cat(1) but examines the file extension to determine if the file should be decompressed before being printed.@EOL
# @std       bash
# @copyright 
#  @parblock
#  Copyright (c) 1993,1994,1996,1998,2005,2011,2016 Mitchell Jay Richling <https://www.mitchr.me> All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
#  1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.
#
#  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation
#     and/or other materials provided with the distribution.
#
#  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without
#     specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
#  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
#  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#  @endparblock
#
# @Notes
#
# The primay use case for this script is to simplify other scripts and comamnd lines so taht they may transparently work with fiels that may, or may not, be
# compressed.
#
# When I wrote the fist fersion of this script it was a simple if statment that switched between cat(1) and zcat(1), but it has grown over the years as I
# have encountered various various compilession formats.  As of the last updated the following formats are supported:
#
#      - gzip      - compress    - 7z       - lzma
#      - bzip2     - pkzip       - xz          
#
################################################################################################################################################################

FILE="$1"

if [ -e "$FILE" ] ; then
  FILE_EXTENSION=`echo "$FILE" | sed 's/^.*\.//' | tr 'a-z' 'A-Z'`
  case "$FILE_EXTENSION" in
    GZ   ) gunzip  <    "$FILE";                                                 ;;
    BZ   ) bzcat        "$FILE";                                                 ;;
    BZ2  ) bzcat        "$FILE";                                                 ;;
    Z    ) zcat         "$FILE";                                                 ;;
    ZIP  ) unzip -p     "$FILE";                                                 ;;
    XZ   ) xzcat        "$FILE";                                                 ;;
    LZMA ) lzcat        "$FILE";                                                 ;;
    7Z   ) 7z e -bd -so "$FILE" 2>/dev/null;                                     ;;
    *    ) cat          "$FILE";                                                 ;;
  esac
else
  echo "ERROR(universalCat): File missing: $FILE"
fi