#!/bin/akanga -p
#


fn nsort {
	if (~ $#* 0)
		return 0

	sorted = $1;  shift
	if (~ $#* 0) {
		echo $sorted
		return 0
		}

	for (i in $*) {
		left = ()
		while (! ~ $#sorted 0) {
			if (let 'i < sorted[1]') {
				left = ($left $i $sorted)
				break;
				}

			left = ($left $sorted(1))
			shift sorted
			}

		if (~ $#sorted 0)
			left = ($left $i)

		sorted = $left
		}

	for (i in $sorted)
		echo $i
	
	return 0
	}


initvars -s opt_raw
timebase = 14

parseopt '*' cr $*  ||  exit 1
while (~ $1 -*) {
	switch ($1) {
	case -c
		timebase = 16
		shift;
	
	case -r
		opt_raw = yes
		shift

	case - --
		shift
		break
		}
	}


cd /proc  ||  exit 1


if (~ $#* 0) {
	pslist = `{ nsort `{ echo [1-9]* } }
} else {
	for (i in $*) {
		if (! ~ $i $pslist)
			pslist = ($pslist $i)
		}
	}

let 'null = "\000"'
ownpid = $pid

{ 
  if (! ~ $opt_raw yes)
	echo PID PPID S TTY PRI VMS SECS COMMAND

  for (i in $pslist) {
	pid = $i
	cmd = $i/cmdline
	sts = $i/stat
	
	if (! ~ $pid $ownpid  &&  let 'test("-f", cmd)  &&  test("-f", sts)') {
		cmdline = ``($ifs $null) { cat $cmd }
		stat    = `{ cat $sts }

		if (~ $#cmdline 0)
			cmdline = $stat(2)

		cmdline = `{ echo $cmdline }
		let 'cmdline = substr(cmdline, 1, 42)'

		if (let 'stat[7] < 1024') {
			tty = '?'
		} else {
			let 'tty = "tty" ^ (stat[7] - 1024)'
			}

		let 'secs = (stat[timebase] + stat[timebase+1]) / 1000'
		let 'prio = stat[19]'
		let 'vms = (stat[23] / 1024)'
		
		echo $pid $stat(4) $stat(3) $tty $prio $vms $secs $cmdline
		}
	}
  } |
{ if (~ $opt_raw yes) {
	cat
  } else {
  	awk '/./ {
		cmd = $8;
		for (i=9; i<=NF; i++) cmd = cmd " " $i;
		printf ("%5s %5s %s %5s %3s %5s %5s %s\n", $1, $2, $3, $4, $5, $6, $7, cmd);
		}'
	}
  }

exit 0
