- register short auid;
- register int i, j, y;
- register float max;
- register struct p_times *ptptr;
- struct p_times temppt;
- register struct users *knptr;
- char *getpname(), *pnamp;
-
- /* Accumulate the percent of cpu per user. */
- ptptr = pt;
- numprocs = 0;
- total = 0.0;
- for (i = 0; i < nproc; i++) {
- /* discard inactive processes */
- if (ptptr->pt_uid == -1) {
- ptptr++;
- continue;
- }
- /* Accumulate the percentage. */
- total += ptptr->pt_pctcpu;
- numprocs++;
- ptptr++;
- }
-
- pt[numprocs].pt_pctcpu = 1.0 - total;
- pt[numprocs].pt_uid = -1;
- pt[numprocs].pt_pid = -1;
- pt[numprocs].pt_pp = NULL;
-
- if (total < 1.0)
- total = 1.0;
- factor = 50.0/total;
-
- /* Find the top ten by executing a "bubble pass" ten times. */
- y = numprocs + 1 < 15 ? numprocs + 1 : 15;
- for (i = 0; i < y; i++) {
- ptptr = &pt[i];
- max = -10000.0;
- maxind = i;
- for (j = i; j < numprocs + 1; j++) {
- if (ptptr->pt_pctcpu > max) {
- max = ptptr->pt_pctcpu;
- maxind = j;
- }
- ptptr++;
- }
- if (maxind != i) {
- temppt = pt[i];
- pt[i] = pt[maxind];
- pt[maxind] = temppt;
- }
- }
-
- /* Display the top fifteen. */
- y = 4;
- ptptr = pt;
- i = numprocs+1 < 15 ? numprocs+1 : 15;
- for (; i > 0 && ptptr->pt_pctcpu > 0.01; i--) {
- /* Find the user's name. */
- knptr = known;
- auid = ptptr->pt_uid;
- for (j = numknown - 1; j >= 0; j--) {
- if (knptr->k_uid == auid) {
- namp = knptr->k_name;
- break;
- }
- knptr++;
- }
- if (j < 0) {
- if (numknown < 30) {
- knptr = &known[numknown];
- namp = strncpy(knptr->k_name,
- getpwuid(auid)->pw_name, 15);
- knptr->k_name[15] = '\0';
- knptr->k_uid = auid;
- numknown++;
- } else
- namp = getpwuid(auid)-> pw_name;
- }
- pnamp = getpname(ptptr->pt_pid, ptptr->pt_pp);
- wmove(wnd, y, 0);
- wclrtoeol(wnd);
- mvwaddstr(wnd, y, 0, namp);
- sprintf(pidname, "%8.8s", pnamp);
- mvwaddstr(wnd, y, 6, pidname);
- wmove(wnd, y++, 15);
- for (j = ptptr->pt_pctcpu*factor + 0.5; j > 0; j--)
- waddch(wnd, 'X');
- ptptr++;
- }
-
- while (y < 19) {
- wmove(wnd, y++, 0);
- wclrtoeol(wnd);
- }