#!/bin/sh

USE_PDF=true

PSMAN_DIR="${HOME}/.out_psman"

BIN_BASENAME=`which basename`
BIN_COL=`which col`
BIN_JOT=`which jot`
BIN_MAN=`which man`
BIN_MANPATH=`which manpath`
BIN_MKDIR=`which mkdir`
BIN_PS2PDF=`which ps2pdf`
BIN_PDF_VIEWER=`which evince`
BIN_PS_VIEWER=`which evince`
BIN_SED=`which sed`
BIN_STAT=`which stat`

gen()
{
   if [ $# -eq 2 ]; then
      SECTION=$1
      MANPAGE=$2
   fi
   for SRC_DIR in `${BIN_MANPATH} | ${BIN_SED} 's|:| |g'`; do
      if [ "$SECTION" ]; then
         if [ ! -f ${SRC_DIR}/man${SECTION}/${MANPAGE}.${SECTION}.gz ]; then
            continue
         fi
         if [ ! -d ${PSMAN_DIR}/man${SECTION} ]; then
            ${BIN_MKDIR} -p ${PSMAN_DIR}/man${SECTION}
         fi
         echo -n "Creating ${MANPAGE}(${SECTION})... "
         ${BIN_MAN} -t -M ${SRC_DIR} ${SECTION} ${MANPAGE} | ${BIN_COL} -b > "${PSMAN_DIR}/man${SECTION}/${MANPAGE}.ps"
         if [ ${USE_PDF} = "true" ]; then
             ${BIN_PS2PDF} "${PSMAN_DIR}/man${SECTION}/${MANPAGE}.ps" "${PSMAN_DIR}/man${SECTION}/${MANPAGE}.pdf"
         fi
         echo "done."
         return 0
      else
         for SEC in `jot 9 1`; do
            if [ ! -d ${SRC_DIR}/man${SEC} ]; then
               echo "Skipping ${SRC_DIR}/man${SEC}"
               continue
            fi
            if [ ! -d ${PSMAN_DIR}/man${SEC} ]; then
               ${BIN_MKDIR} -p ${PSMAN_DIR}/man${SEC}
            fi
            for MANPAGE in `find "${SRC_DIR}/man${SEC}" -type f`; do
               MANNAME=`${BIN_BASENAME} ${MANPAGE} | sed 's|.[0-9].gz$||g'`
               if [ -f "${PSMAN_DIR}/man${SEC}/${MANNAME}.${EXT}" ]; then
                  if [ `${BIN_STAT} -f %m "${MANPAGE}"` -lt `${BIN_STAT} -f %m ${PSMAN_DIR}/man${SEC}/${MANNAME}.${EXT}` ]; then
                     echo "Skipping ${MANNAME}(${SEC}) [up-to-date]."
                     continue
                  fi
               fi
               echo -n "Creating ${MANNAME}(${SEC})... "
               ${BIN_MAN} -t -M ${SRC_DIR} ${SEC} ${MANNAME} | ${BIN_COL} -b > "${PSMAN_DIR}/man${SEC}/${MANNAME}.ps"
               if [ ${USE_PDF} = "true" ]; then 
                   ${BIN_PS2PDF} "${PSMAN_DIR}/man${SEC}/${MANNAME}.ps" "${PSMAN_DIR}/man${SEC}/${MANNAME}.pdf"
               fi
               echo "done."
             done
         done
      fi
   done
}

search_sec()
{
    SECTION=$1
    MANPAGE=$2
    MANPAGEPATH=${PSMAN_DIR}/man${SECTION}/${MANPAGE}.${EXT}

    if [ ! -f ${MANPAGEPATH} ]; then
	gen ${SECTION} ${MANPAGE}
    fi

    if [ -f ${MANPAGEPATH} ]; then
        if [ ${USE_PDF} = "true" ]; then
            ${BIN_PDF_VIEWER} ${MANPAGEPATH} &
        else
            ${BIN_PS_VIEWER} ${MANPAGEPATH} &
        fi
        exit 0
    fi

    return 0
}

search_all()
{
   MANPAGE=$1
   for SEC in `jot 9 1`; do
      search_sec $SEC $1
   done
   for SEC in `jot 9 1`; do
      gen ${SEC} $1
      search_sec ${SEC} $1
   done
   return 0
}

if [ ${USE_PDF} = "true" ]; then
    EXT="pdf"
else
    EXT="ps"
fi

if [ $# -eq 0 ]; then
   echo "Usage: psman [section] manpage"
   exit 1
fi

if [ $1 = "-gen" ]; then
   gen
   exit 0
fi


if [ $# -eq 1 ]; then
   if search_all $1; then
      echo "Cannot find manpage for \"$1\" in path"
   fi
else
   if search_sec $1 $2; then
      echo "Cannot find manpage for \"$2\" in section $1"
   fi
fi
