#!/bin/sh --
#	pschk.sh - Process Check
#	Sun,08 Oct,2006
#	Wed,18 Oct,2006
#	Mon,25 Dec,2006 - Tue,26 Dec,2006 , Sat,30 Dec,2006
#	Thu,01 Mar,2007, Mon,26 Mar,2007
#	Sun,29 Jul,2007 - Mon,30 Jul,2007
#	Tue,06 Nov,2007
#	Thu,29 May,2008
#	Copyright(C)2006-2008 G-HAL
#
check_exec()
{
  _check_file="$1"
  if [ -x ${_check_file} -a ! -d ${_check_file} ]; then
    return 0
  fi
  return 1
}
#
search_exec()
{
  _env_name="$1"
  _search_file="$2"
  _default_file="$3"
  if [ "x${_default_file}" = "x" ]; then
    if check_exec /bin/${_search_file}; then
      _ret=/bin/${_search_file}
      return 0
    elif check_exec /usr/bin/${_search_file}; then
      _ret=/usr/bin/${_search_file}
      return 0
    elif check_exec /usr/local/bin/${_search_file}; then
      _ret=/usr/local/bin/${_search_file}
      return 0
    elif check_exec /usr/X11R6/bin/${_search_file}; then
      _ret=/usr/X11R6/bin/${_search_file}
      return 0
    else
      echo "${_search_file} not found."
      echo "Please set environment ${_env_name} where ${_search_file} is."
      return 1
    fi
  elif check_exec ${_default_file}; then
    _ret=${_default_file}
    return 0
  else
    echo "${_default_file} not found."
    echo "Please set environment ${_env_name} where ${_search_file} is."
    return 1
  fi
}
#
search_exec UNAME uname ${UNAME} || exit 1
UNAME=${_ret}
search_exec PS ps ${PS} || exit 1
PS=${_ret}
search_exec BASENAME basename ${BASENAME} || exit 1
BASENAME=${_ret}
search_exec MKTEMP   mktemp   ${MKTEMP}   || exit 1
MKTEMP=${_ret}
search_exec SED      sed      ${SED}      || exit 1
SED=${_ret}
search_exec SORT     sort     ${SORT}     || exit 1
SORT=${_ret}
SORT_OPT="-b -k 8,8"
#
case `${UNAME} -s` in
FreeBSD|NetBSD|OpenBSD|*BSD|Darwin)
  search_exec RM rm ${RM} || exit 1
  REMOVE="${_ret} -P"
  search_exec HOSTNAME hostname ${HOSTNAME} || exit 1
  HOSTNAME=${_ret}
  PS_FLAGS="axwwro state,flags,acflag,nice,jobc,tt,wchan,logname,ruser,command"
  ;;
Linux|linux)
  search_exec SHRED shred ${SHRED} || exit 1
  REMOVE="${_ret} --remove -n 3 --zero"
  search_exec HOSTNAME hostname || exit 1
  HOSTNAME=${_ret}
  PS_FLAGS="--sort pcpu -Awwo state,flags,acflag,nice,jobc,tt,wchan,logname,ruser,command"
  ;;
*)
  search_exec GSHRED gshred ${GSHRED} || exit 1
  REMOVE="${_ret} --remove -n 3 --zero"
  search_exec HOSTNAME hostname ${HOSTNAME} || exit 1
  HOSTNAME=${_ret}
  PS_FLAGS="axwwo state,flags,acflag,nice,jobc,tt,wchan,logname,ruser,command"
  ;;
esac
#
# 拡張正規表現を使える場合はこちら。
#SED_REFORMAT='s/^[IS]/SI/; s/^([^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +)([p-sP-S])([0-9a-z]) /\1p\* /'
# 拡張正規表現を使えない場合はこちら。
SED_REFORMAT='s/^[IS]/SI/
s/^[R][^ ]*\/[0-9][0-9]* /&\
/
/\/[0-9][0-9]* \n/{
 s//\/\* /
}
s/^[^ ][^ ]*  *[0-9a-f][0-9a-f]*  *[0-9][0-9]*  *[0-9][0-9]*  *[0-9][0-9]*  *[p-sP-Sv][0-9a-z]- /&\
/
/ [p-sP-Sv][0-9a-z]- \n/{
 s// \?\?- /
}
s/^[^ ][^ ]*  *[0-9a-f][0-9a-f]*  *[0-9][0-9]*  *[0-9][0-9]*  *[0-9][0-9]*  *[p-sP-S][0-9a-z] /&\
/
/ [p-sP-S][0-9a-z] \n/{
 s// p\* /
}'
#
DIFF=/usr/bin/diff
if [ -n "$1" ]; then
  if [ "$1" = "gtk" -o "$1" = "gtkdiff" ]; then
    search_exec DIFF gtkdiff || exit 1
    DIFF=${_ret}
  elif [ "$1" = "vim" -o "$1" = "vimdiff" ]; then
    search_exec DIFF vimdiff || exit 1
    DIFF=${_ret}
  fi
fi
DIFFREGEX=${HOME}/.bin/diffregex
DEFAULT_PS_OUT=${HOME}/.bin/ps.default.all.`${HOSTNAME} -s`
#
tempfoo=`${BASENAME} $0`
TMPFILE1=`${MKTEMP} /tmp/${tempfoo}.XXXXXX`
if [ $? -ne 0 ]; then
  echo "$0: Can't create temp file, exiting..."
  exit 1
fi
TMPFILE2=`${MKTEMP} /tmp/${tempfoo}.XXXXXX`
if [ $? -ne 0 ]; then
  echo "$0: Can't create temp file, exiting..."
  exit 1
fi
#
${PS} ${PS_FLAGS} > ${TMPFILE1}
if [ -x ${DIFFREGEX} -a ! -d ${DIFFREGEX} ]; then
  ${DIFFREGEX} ${DEFAULT_PS_OUT} ${TMPFILE1}
else
  #${SED} -E -e "${SED_REFORMAT}" < ${TMPFILE1} > ${TMPFILE2}
  ${SED} -e "${SED_REFORMAT}" < ${TMPFILE1} | ${SORT} ${SORT_OPT} > ${TMPFILE2}
  ${REMOVE} ${TMPFILE1}
  ${SORT} ${SORT_OPT} < ${DEFAULT_PS_OUT} > ${TMPFILE1}
  ${DIFF} ${TMPFILE1} ${TMPFILE2}
fi
if [ $? -eq 0 ]; then
  echo "No diff."
fi
#
${REMOVE} ${TMPFILE1}
${REMOVE} ${TMPFILE2}
#
# [ End of File ]

