I find it very useful to sort by command as it usually means less bouncing around. While we're here, add sort by pid too.
Also, allow string_index to shortcut on partial matches (techinically unrelated). Index: machine.c =================================================================== RCS file: /home/tedu/cvs/src/usr.bin/top/machine.c,v retrieving revision 1.64 diff -u -r1.64 machine.c --- machine.c 28 Apr 2009 21:24:41 -0000 1.64 +++ machine.c 23 Jan 2010 05:06:22 -0000 @@ -118,7 +118,7 @@ /* these are names given to allowed sorting orders -- first is default */ char *ordernames[] = { - "cpu", "size", "res", "time", "pri", NULL + "cpu", "size", "res", "time", "pri", "pid", "command", NULL }; /* these are for keeping track of the proc array */ @@ -539,6 +539,10 @@ if ((result = p2->p_vm_rssize - p1->p_vm_rssize) == 0) #define ORDERKEY_MEM \ if ((result = PROCSIZE(p2) - PROCSIZE(p1)) == 0) +#define ORDERKEY_PID \ + if ((result = p1->p_pid - p2->p_pid) == 0) +#define ORDERKEY_CMD \ + if ((result = strcmp(p1->p_comm, p2->p_comm)) == 0) /* compare_cpu - the comparison function for sorting by cpu percentage */ static int @@ -660,12 +664,63 @@ return (result); } +static int +compare_pid(const void *v1, const void *v2) +{ + struct proc **pp1 = (struct proc **) v1; + struct proc **pp2 = (struct proc **) v2; + struct kinfo_proc2 *p1, *p2; + pctcpu lresult; + int result; + + /* remove one level of indirection */ + p1 = *(struct kinfo_proc2 **) pp1; + p2 = *(struct kinfo_proc2 **) pp2; + + ORDERKEY_PID + ORDERKEY_PCTCPU + ORDERKEY_CPUTIME + ORDERKEY_STATE + ORDERKEY_PRIO + ORDERKEY_RSSIZE + ORDERKEY_MEM + ; + return (result); +} + +static int +compare_cmd(const void *v1, const void *v2) +{ + struct proc **pp1 = (struct proc **) v1; + struct proc **pp2 = (struct proc **) v2; + struct kinfo_proc2 *p1, *p2; + pctcpu lresult; + int result; + + /* remove one level of indirection */ + p1 = *(struct kinfo_proc2 **) pp1; + p2 = *(struct kinfo_proc2 **) pp2; + + ORDERKEY_CMD + ORDERKEY_PCTCPU + ORDERKEY_CPUTIME + ORDERKEY_STATE + ORDERKEY_PRIO + ORDERKEY_RSSIZE + ORDERKEY_MEM + ; + return (result); +} + + int (*proc_compares[])(const void *, const void *) = { compare_cpu, compare_size, compare_res, compare_time, compare_prio, + compare_pid, + compare_cmd, NULL }; Index: top.1 =================================================================== RCS file: /home/tedu/cvs/src/usr.bin/top/top.1,v retrieving revision 1.53 diff -u -r1.53 top.1 --- top.1 22 Dec 2009 18:14:23 -0000 1.53 +++ top.1 23 Jan 2010 05:07:09 -0000 @@ -144,8 +144,10 @@ .Ar size , .Ar res , .Ar time , +.Ar pri , +.Ar pid , and -.Ar pri . +.Ar command . .It Fl p Ar pid Show only the process .Ar pid . Index: top.c =================================================================== RCS file: /home/tedu/cvs/src/usr.bin/top/top.c,v retrieving revision 1.68 diff -u -r1.68 top.c --- top.c 10 Dec 2009 13:16:02 -0000 1.68 +++ top.c 23 Jan 2010 04:58:48 -0000 @@ -322,7 +322,7 @@ if (order_name != NULL) { if ((order_index = string_index(order_name, statics.order_names)) == -1) { - char **pp, msg[80]; + char **pp, msg[512]; snprintf(msg, sizeof(msg), "'%s' is not a recognized sorting order", Index: utils.c =================================================================== RCS file: /home/tedu/cvs/src/usr.bin/top/utils.c,v retrieving revision 1.21 diff -u -r1.21 utils.c --- utils.c 1 Oct 2007 09:15:44 -0000 1.21 +++ utils.c 23 Jan 2010 05:08:47 -0000 @@ -125,7 +125,7 @@ int i = 0; while (*array != NULL) { - if (strcmp(string, *array) == 0) + if (strncmp(string, *array, strlen(string)) == 0) return (i); array++; i++;