#!/bin/sh

# 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


catch_values () {
# take values from /proc and format them,
# some values are taken only if they are required
# (from parsecmd)
	PROCESSDIR=/proc/$PROCESS

	if [ ! -d $PROCESSDIR ]; then
		continue
	fi

	STATFILE=`cat $PROCESSDIR/stat`
	STATUSFILE=`cat $PROCESSDIR/status`
	STATMFILE=`cat $PROCESSDIR/statm`

	PID=`basename $PROCESSDIR`

	if [ "${fields_values[18]}" == '1' ]; then
		P_PID=`echo $STATFILE | cut -d ' ' -f4`
	fi

	if [ "${fields_values[24]}" == '1' ] || [ "${fields_values[25]}" == '1' ]; then
		COMMAND=`cat -v ${PROCESSDIR}/cmdline | sed 's/\^@/ /g'`
		CMD=`echo $STATFILE | cut -d ' ' -f2 | sed 's/[^a-zA-Z]//g'`
	fi


	TIME=`expr $(expr $(echo $STATFILE | cut -d ' ' -f14) + $(echo $STATFILE | cut -d ' ' -f15)) / 100`

	FROM_BOOT_START=`expr $(echo $STATFILE | cut -d ' ' -f22) / 100`
	FROM_EPOCH_START=`expr $BOOTTIME + $FROM_BOOT_START`
	START=`date -ud "1970-01-01 $FROM_EPOCH_START seconds"`

	if [ "${fields_values[8]}" == '1' ] || [ "${fields_values[21]}" == '1' ]; then
		RUNNING_TIME=`expr $(date +%s) - $FROM_EPOCH_START`
		CPU_PRC_UNIT=`expr $(expr $TIME \* 100) / $RUNNING_TIME`
		CPU_PRC_DECIMAL=`expr $(expr $(expr $(expr $TIME \* 100) % $RUNNING_TIME) \* 100) / $RUNNING_TIME`
		CPU_PRC=$CPU_PRC_UNIT.$CPU_PRC_DECIMAL
		C=$CPU_PRC_UNIT
	fi

	if [ "${fields_values[1]}" == '1' ]; then
		TP_GID=`echo $STATFILE | cut -d ' ' -f8`
		if [ $TP_GID -eq '-1' ]; then
			TTY='?'
		  else
			TTY_NR=`echo $STATFILE | cut -d ' ' -f7`
			DEVMAJOR=$(( ( $TTY_NR & 0xfff00) >> 8 ))
			DEVMINOR=$(( ($TTY_NR & 0xff) | (($TTY_NR >> 12) & 0xfff00) ))
			if [ $DEVMAJOR -eq 4 ]; then
				TTY="tty$DEVMINOR"
			  elif [ $DEVMAJOR -eq 136 ]; then
				TTY="pts/$DEVMINOR"
			fi
		fi
	fi

	if [ "${fields_values[19]}" == '1' ]; then
		PRI=`expr $(echo $STATFILE | cut -d ' ' -f18) + 60`
	fi

	if [ "${fields_values[20]}" == '1' ] || [ "${fields_values[5]}" == '1' ]; then
		NICEVAL=`echo $STATFILE | cut -d ' ' -f19`
	fi

	SESSION=`echo $STATFILE | cut -d ' ' -f6`
	T_GID=`echo "$STATUSFILE" | grep Tgid | cut -f2`
	if [ $SESSION -eq $T_GID ]; then
		SESS_LEADER=1
	   else
	   	SESS_LEADER=0
	fi
	
	if [ "${fields_values[22]}" == '1' ] || [ "${fields_values[5]}" == '1' ]; then
		S=`echo $STATFILE | cut -d ' ' -f3`
	fi
	
	if [ "${fields_values[5]}" == '1' ]; then
		STAT=$S
		if [ $NICEVAL -gt '0' ]; then
			STAT=${STAT}N
		   elif [ $NICEVAL -lt '0' ]; then
			STAT=${STAT}'<'
		fi
		VM_LOCK=`echo "$STATUSFILE" | grep VmLck | awk '{print $2}'`
		if [ ! "$VM_LOCK" == '' ] && [ ! "$VM_LOCK" -eq '0' ]; then
		# VM_LOCK is empty if we grep it from a kthread
			STAT=${STAT}L
		fi
		if [ ! $SESS_LEADER -eq '0' ]; then
		STAT=${STAT}s
		fi
		THREADS=`echo "$STATUSFILE" | grep Threads | cut -f2`
		if [ $THREADS -gt 1 ]; then
			STAT=${STAT}l
		fi
		P_GRP=`echo $STATFILE | cut -d ' ' -f5`
		TP_GID=`echo $STATFILE | cut -d ' ' -f8`
		if [ $P_GRP -eq $TP_GID ]; then
			STAT=${STAT}+
		fi
	fi
	
	EFFECTIVE_UID=`echo "$STATUSFILE" | grep Uid | cut -f2`
	REAL_UID=`echo "$STATUSFILE" | grep Uid | cut -f3`
	EFFECTIVE_USER=`echo "$PASSWDFILE" | grep "[A-Za-z]*:[A-Za-z]:$EFFECTIVE_UID:.*" | cut -d ':' -f1`
	REAL_USER=`echo "$PASSWDFILE" | grep "[A-Za-z]*:[A-Za-z]:$REAL_UID:.*" | cut -d ':' -f1`
	
	EFFECTIVE_GID=`echo "$STATUSFILE" | grep Gid | cut -f2`
	REAL_GID=`echo "$STATUSFILE" | grep Gid | cut -f3`
	EFFECTIVE_GROUP=`echo "$GROUPFILE" | grep "[A-Za-z]*:[A-Za-z]:$EFFECTIVE_GID:.*" | cut -d ':' -f1`
	REAL_GROUP=`echo "$GROUPFILE" | grep "[A-Za-z]*:[A-Za-z]:$REAL_GID:.*" | cut -d ':' -f1`
	
	if [ "${fields_values[10]}" == '1' ]; then
		VSZ=`echo "$STATUSFILE" | grep VmSize | awk '{print $2}'`
	fi

	if [ "${fields_values[11]}" == '1' ] || [ "${fields_values[9]}" ]; then
		RSS=`echo "$STATUSFILE" | grep VmRSS | awk '{print $2}'`
	fi

	if [ "${fields_values[9]}" == '1' ]; then
		MEMTOTAL=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
		if [ ! "$RSS" == '' ]; then
			MEM_PRC_UNIT=`expr $(expr $RSS \* 100) / $MEMTOTAL`
			MEM_PRC_DECIMAL=`expr $(expr $(expr $(expr $RSS \* 100) % $MEMTOTAL) \* 100) / $MEMTOTAL`
			MEM_PRC=$MEM_PRC_UNIT.$MEM_PRC_DECIMAL
		fi
	fi

	if [ "${fields_values[13]}" == '1' ]; then
		PENDING=`echo "$STATUSFILE" | grep SigPnd | cut -f2`
	fi
	if [ "${fields_values[14]}" == '1' ]; then
		BLOCKED=`echo "$STATUSFILE" | grep SigBlk | cut -f2`
	fi
	if [ "${fields_values[15]}" == '1' ]; then
		IGNORED=`echo "$STATUSFILE" | grep SigIgn | cut -f2`
	fi
	if [ "${fields_values[16]}" == '1' ]; then
		CAUGHT=`echo "$STATUSFILE" | grep SigCgt | cut -f2`
	fi
	
	if [ "${fields_values[23]}" == '1' ]; then
		WCHAN=`cat $PROCESSDIR/wchan`
	fi
	
	if [ "${fields_values[4]}" == '1' ]; then
		SZ=`echo $STATMFILE | cut -d ' ' -f1`
	fi
	
	# ADDR seems to be ignored
	ADDR='-'

	if [ "${fields_values[17]}" == '1' ]; then
		FLAGS=0
		# (from /usr/include/linux/sched.h)
		#define PF_FORKNOEXEC   0x00000040      /* forked but didn't exec */
		#define PF_SUPERPRIV    0x00000100      /* used super-user privileges */
		STAT_FLAGS=`echo "$STATFILE" | cut -d ' ' -f9`
		FLAG1=$(( $STAT_FLAGS & 0x00000040 ))
		if [ "$FLAG1" -eq 64 ]; then
			FLAGS=`expr $FLAGS + 1`
		fi
		FLAG4=$(( $STAT_FLAGS & 0x00000100 ))
		if [ "$FLAG4" -eq 256 ]; then
			FLAGS=`expr $FLAGS + 4`
		fi
	fi

}


print_value () {
# print a line and flush every value
echo -e "$PID1$TTY1$TIME1$ADDR1$SZ1$STAT1$UID1$USER1$CPU_PRC1$MEM_PRC1$VSZ1\
$RSS1$START1$PENDING1$BLOCKED1$IGNORED1$CAUGHT1$FLAGS1$P_PID1$PRI1$NICEVAL1$C1$S1\
$WCHAN1$CMD1$COMMAND1"
FLAGS1=''
S1=''
REAL_UID1=''
EFFECTIVE_UID1=''
REAL_USER1=''
EFFECTIVE_USER1=''
REAL_GID1=''
EFFECTIVE_GID1=''
REAL_GROUP1=''
EFFECTIVE_GROUP1=''
PID1='' 
P_PID1=''
C1='' 
PRI1=''
NICEVAL1=''
ADDR1=''
SZ1=''
WCHAN1=''
CPU_PRC1=''
MEM_PRC1=''
VSZ1=''
RSS1=''
TTY1=''
STAT1=''
START1=''
TIME1=''
CMD1=''
COMMAND1=''
PENDING1=''
BLOCKED1=''
IGNORED1=''
CAUGHT1=''
}

	
set_and_print_value() {
# check every option parsed and set up what we print
if [[ ${arg[0]} == "-A" || ${arg[4]} == "-e" ]]; then
        if [[ ${arg[1]} == "-N" ]]; then
		echo 1 > /dev/null
	else    
	PID1="$PID\t"
	TTY1="$TTY\t"
	TIME1="$TIME\t"
	CMD1="$CMD\t"
	print_value
	return 0
	fi

fi

if [[ ${arg[10]} == "-C" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[0]} != $CMD ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[0]} == $CMD ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[11]} == "-G" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[1]} != $REAL_GID || ${val[1]} != $REAL_GROUP ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[1]} == $GID || ${val[1]} == $REAL_GROUP ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[12]} == "-U" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[2]} != $REAL_UID || ${val[2]} != $REAL_USER ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[2]} == $REAL_UID || ${val[2]} == $REAL_USER ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[13]} == "-g" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[3]} != $SESSION || ${val[3]} != $EFFECTIVE_GID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[3]} == $SESSION || ${val[3]} == $EFFECTIVE_GID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[14]} == "-p" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[4]} != $PID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[4]} == $PID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[15]} == "-s" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[5]} != $SESSION ]] ; then
			UID1="$REAL_UID\t"
			PID1="$PID\t"
			PENDING1="$PENDING\t"
			BLOCKED1="$BLOCKED\t"
			IGNORED1="$IGNORED\t"
			CAUGHT1="$CAUGTH\t"
			
			STAT1="$STAT\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ ${val[5]} == $SESSION ]] ; then
			UID1="$REAL_UID\t"
			PID1="$PID\t"
			PENDING1="$PENDING\t"
			BLOCKED1="$BLOCKED\t"
			IGNORED1="$IGNORED\t"
			CAUGHT1="$CAUGTH\t"
			STAT1="$STAT\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[16]} == "-t" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[6]} != $TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[6]} == $TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[17]} == "-u" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[7]} != $EFFECTIVE_UID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[7]} == $EFFECTIVE_UID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[18]} == "U" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[7]} != $EFFECTIVE_UID || ${val[7]} != $EFFECTIVE_USER ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ ${val[7]} == $EFFECTIVE_UID || ${val[7]} == $EFFECTIVE_USER ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[19]} == "t" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ ${val[6]} != $ACTUAL_TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ ${val[6]} == $ACTUAL_TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi

if [[ ${arg[2]} == "-a" ]]; then
	if [[ ${arg[1]} == "-N" ]]; then
		if [[ $SESS_LEADER == 1 || X$TTY == X ]] ; then
			PID1="$PID\t"
		        TTY1="$TTY\t"
		        TIME1="$TIME\t"
		        CMD1="$CMD\t"
		else
			return 1
		fi				
	
	else
		if [[ $SESS_LEADER == 0 && X$TTY != X ]] ; then
				
		PID1="$PID\t"
       		TTY1="$TTY\t"
        	TIME1="$TIME\t"
       		CMD1="$CMD\t"
		else
			return 1
		fi
	fi
				
fi

if [[ ${arg[3]} == "-d" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		
	      	if [[ $SESS_LEADER == 1 ]] ; then

			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
		return 1
		fi
	else
		
	      	if [[ $SESS_LEADER == 0 ]] ; then

			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi

	fi
	
	
fi

if [[ ${arg[5]} == "T" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ $ACTUAL_TTY != $TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ $ACTUAL_TTY == $TTY ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	fi
	
fi
if [[ ${arg[6]} == "a" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ X$TTY == X ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ X$TTY != X ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[7]} == "g" ]]; then
	echo 12 > /dev/null
fi
if [[ ${arg[8]} == "r" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ $S != R && $EFFECTIVE_USER != $ACTUAL_USER && $EFFECTIVE_UID != $ACTUAL_UID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ $S == R ]] ; then
			if [[ $EFFECTIVE_USER == $ACTUAL_USER || $EFFECTIVE_UID == $ACTUAL_UID ]] ; then
				PID1="$PID\t"
				TTY1="$TTY\t"
				STAT1="$STAT\t"
				TIME1="$TIME\t"
				COMMAND1="$COMMAND\t"
			else
				return 1
			fi
		else
			return 1
		fi
	fi
fi
if [[ ${arg[9]} == "x" ]]; then
	if [[ ${arg[1]} == "-N" ]]; then
		if [[ $ACTUAL_UID != $EFFECTIVE_UID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ $ACTUAL_UID == $EFFECTIVE_UID ]] ; then
			PID1="$PID\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[20]} == "-l" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ $ACTUAL_UID != $EFFECTIVE_UID || $ACTUAL_TTY != $TTY ]] ; then
			FLAGS1="$FLAGS\t"
			S1="$S\t"
			UID1="$EFFECTIVE_UID\t"
			PID1="$PID\t"
			P_PID1="$P_PID\t"
			C1="$C\t"
			PRI1="$PRI\t"
			NICEVAL1="$NICEVAL\t"
			ADDR1="$ADDR\t"
			SZ1="$SZ\t"
			WCHAN1="$WCHAN\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	else
		if [[ $ACTUAL_UID == $EFFECTIVE_UID && $ACTUAL_TTY == $TTY ]] ; then
			FLAGS1="$FLAGS\t"
			S1="$S\t"
			UID1="$EFFECTIVE_UID\t"
			PID1="$PID\t"
			P_PID1="$P_PID\t"
			C1="$C\t"
			PRI1="$PRI\t"
			NICEVAL1="$NICEVAL\t"
			ADDR1="$ADDR\t"
			SZ1="$SZ\t"
			WCHAN1="$WCHAN\t"
			TTY1="$TTY\t"
			TIME1="$TIME\t"
			CMD1="$CMD\t"
		else
			return 1
		fi
	fi
fi
if [[ ${arg[21]} == "u" ]]; then
	if [[ ${arg[1]} == "-N" ]] ; then
		if [[ $ACTUAL_UID != $EFFECTIVE_UID ]] ; then
			USER1="$USER\t"
			PID1="$PID\t"
			CPU_PRC1="$CPU_PRC\t"
			MEM_PRC1="$MEM_PRC\t"
			VSZ1="$VSZ\t"
			RSS1="$RSS\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			START1="$START\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	else
		if [[ $ACTUAL_UID == $EFFECTIVE_UID ]] ; then
			USER1="$USER\t"
			PID1="$PID\t"
			CPU_PRC1="$CPU_PRC\t"
			MEM_PRC1="$MEM_PRC\t"
			VSZ1="$VSZ\t"
			RSS1="$RSS\t"
			TTY1="$TTY\t"
			STAT1="$STAT\t"
			START1="$START\t"
			TIME1="$TIME\t"
			COMMAND1="$COMMAND\t"
		else
			return 1
		fi
	fi
fi

print_value

}

parsearg_minus () {
# parse given arguments with minus and init fields to print
OPTIND=0
while [ $OPTIND -le $# ] ; do
	getopts :ANadeC:G:U:g:p:s:t:u:lV  opt
	case $opt in
		A) arg[0]=-A
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		N) arg[1]=-N
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		a) arg[2]=-a
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		d) arg[3]=-d
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		e) arg[4]=-e
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		C) arg[10]=-C 
		   val[0]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		G) arg[11]=-G 
		   val[1]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		U) arg[12]=-U 
		   val[2]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		g) arg[13]=-g 
		   val[3]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		p) arg[14]=-p 
		   val[4]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		s) arg[15]=-s 
		   val[5]=`echo $OPTARG | tr -d '='`
		   fields_values[6]=1; fields_values[0]=1
		   fields_values[13]=1; fields_values[14]=1
		   fields_values[15]=1; fields_values[16]=1
		   fields_values[5]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[25]=1 ;;
		t) arg[16]=-t
		   val[6]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		u) arg[17]=-u 
		   val[7]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		V) print_version ;; 
		l) arg[20]=-l
		   fields_values[17]=1; fields_values[22]=1
		   fields_values[6]=1; fields_values[0]=1
		   fields_values[18]=1; fields_values[21]=1
		   fields_values[19]=1; fields_values[20]=1
		   fields_values[3]=1; fields_values[4]=1
		   fields_values[23]=1; fields_values[1]=1
		   fields_values[2]=1; fields_values[24]=1 ;;
		*) print_help ;;
	esac
done
}

parsearg () {
# parse given arguments without minus and init fields to print
OPTIND=0
while [ $OPTIND -le $# ] ; do
	getopts :TagrxU:t:uV opt
	case $opt in
		T) arg[5]=T
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		a) arg[6]=a
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		g) arg[7]=g ;;
		r) arg[8]=r
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		x) arg[9]=x
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		U) arg[18]=U 
		   val[8]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		t) arg[19]=t 
		   val[9]=`echo $OPTARG | tr -d '='`
		   fields_values[0]=1; fields_values[1]=1
		   fields_values[5]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		u) arg[21]=u
		   fields_values[7]=1; fields_values[0]=1
		   fields_values[8]=1; fields_values[9]=1
		   fields_values[10]=1; fields_values[11]=1
		   fields_values[1]=1; fields_values[5]=1
		   fields_values[12]=1; fields_values[2]=1
		   fields_values[25]=1 ;;
		V) print_version ;;
		*) print_help ;;
	esac
done
}

print_version() {
# print version informations and exit
	echo "porcps version 0.0.1-alpha-pre"
	exit
}

print_help() {
# print help and exit

	cat << ENDOFHELP
WARNING: arguments of parameters must be inserted with an equal!

********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE -- DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty
*********** output format ********** 
-l,l long          u  user-oriented
********* misc options *********
-V,V  show version

ENDOFHELP

exit

}

