#!/bin/sh

I_WANT_A_BROKEN_PS=yes
export I_WANT_A_BROKEN_PS
all=no
if [ "x$1" = "x-a" ]
then
	all=yes
fi
export all

cat >/tmp/awk.xxx$$ <<'!'
BEGIN{
	state["D"] = "Spinwait";
	state["I"] = "Idle";
	state["J"] = "Jail";
	state["R"] = "Ready";
	state["O"] = "Running";
	state["S"] = "Sleep";
	state["T"] = "Stopped";
	state["Z"] = "Zombie";
	state["W"] = "Fault";
	state["X"] = "Moribund";
}

function statestr(s, wchan)
{
	if(wchan != s && wchan != "?" && wchan != "-")
		return wchan;
	t = state[substr(s, 1, 1)];
	if(t == "")
		return s;
	return t;
}

# rsc  36706   starttime 0:00.17  1076 Is+  -bash (bash)
{
	i=1
	user=$i; i++
	pid=$i; i++
	start=$i; i++
	if(start ~ /^[A-Z][a-z][a-z]$/){
		start = start "-" $i; i++
	}
	cputime=$i; i++
	mem=$i; i++
	stat=$i; i++
	wchan=$i; i++
	cmd=$i; i++	
	if(ENVIRON["all"] == "yes"){
		for(; i<=NF; i++)
			cmd = cmd " " $i;
	}else{
		sub(/.*\//, "", cmd);
		sub(/:$/, "", cmd);
		sub(/^-/, "", cmd);
		s = " " cmd;
	}
	sub(/\.[0-9][0-9]$/, "", cputime);	# drop .hundredths of second
	if(cputime ~ /..:..:../){	# convert hh:mm:ss into mm:ss
		split(cputime, a, ":");
		cputime = sprintf("%d:%02d", a[1]*60+a[2], a[3]);
	}
	if(start ~ /..:..:../){	# drop :ss
		sub(/:..$/, "", start);
	}
	sub(/[ 	]+$/, "", cmd);
	line[0+nline++] = sprintf("%s\001%d\001%s\001%s\001%dK\001%s\001%s",
		user, pid, start, cputime, mem, statestr(stat, wchan), cmd);
}

END{
	for(i=0; i<nline; i++){
		split(line[i], a, "\001");
		for(j=1; j<=7; j++)
			if(length(a[j]) > max[j])
				max[j] = length(a[j]);
	}
	for(i=0; i<nline; i++){
		split(line[i], a, "\001");
		printf("%-*s %*s %*s %*s %*s %-*s %s\n",
			max[1], a[1], max[2], a[2], max[3], a[3], max[4], a[4],
			max[5], a[5], max[6], a[6], a[7]);
	}
}
!

case "${SYSNAME:-`uname`}" in 
SunOS)
	/bin/ps -aA -o 'user,pid,stime,time,rss,s,s,args' | sed 1d |
		nawk -f /tmp/awk.xxx$$ | sort -n +1
	;;
*)
	/bin/ps -axww -o 'user,pid,start,time,rss,stat,wchan,command' | sed 1d |
		awk -f /tmp/awk.xxx$$ | sort -n +1
	;;
esac

rm -f /tmp/awk.xxx$$

