]> granicus.if.org Git - procps-ng/commitdiff
c99 for ps
authoralbert <>
Wed, 27 Nov 2002 09:52:19 +0000 (09:52 +0000)
committeralbert <>
Wed, 27 Nov 2002 09:52:19 +0000 (09:52 +0000)
ps/common.h
ps/output.c

index 02100f0207822cc8e3e940bbfd7dc23072a36a04..21b2d530a5e0214fbc2bd0c57b4c09d809591b42 100644 (file)
@@ -167,7 +167,7 @@ typedef struct sort_node {
 typedef struct format_node {
   struct format_node *next;
   char *name;                             /* user can override default name */
-  int (*pr)(void);                         /* print function */
+  int (*pr)(char *restrict const outbuf, const proc_t *restrict const pp); // print function
 /*  int (* const sr)(const proc_t* P, const proc_t* Q); */ /* sort function */
   int width;
   int need;
@@ -179,7 +179,7 @@ typedef struct format_node {
 typedef struct format_struct {
   const char *spec; /* format specifier */
   const char *head; /* default header in the POSIX locale */
-  int (* const pr)(void); /* print function */
+  int (* const pr)(char *restrict const outbuf, const proc_t *restrict const pp); // print function
   int (* const sr)(const proc_t* P, const proc_t* Q); /* sort function */
   const int width;
   const int need;       /* data we will need (files to read, etc.) */
index e4e921c8da9ab75d037a600cdc41a1620dca6977..e41acb71b9bcaa9ca64165f3f66d7effd332688c 100644 (file)
@@ -80,8 +80,6 @@
 
 #define COLWID 240 /* satisfy snprintf, which is faster than sprintf */
 
-static char *outbuf;
-
 static unsigned max_rightward = 0x12345678; /* space for RIGHT stuff */
 static unsigned max_leftward = 0x12345678; /* space for LEFT stuff */
 
@@ -99,8 +97,6 @@ static unsigned max_leftward = 0x12345678; /* space for LEFT stuff */
 
 static int wide_signals;  /* true if we have room */
 
-static const proc_t *pp;     /* the process being printed */
-
 static unsigned long seconds_since_1970;
 static unsigned long time_of_boot;
 static unsigned long page_shift;
@@ -224,7 +220,8 @@ static int sr_swapable(const proc_t* P, const proc_t* Q) {
 /***************************************************************************/
 /************ Lots of format functions, starting with the NOP **************/
 
-static int pr_nop(void){
+static int pr_nop(char *restrict const outbuf, const proc_t *restrict const pp){
+  (void)pp;
   return snprintf(outbuf, COLWID, "%c", '-');
 }
 
@@ -298,7 +295,7 @@ STIME       stime   hms or md time format
 ***/
 
 /* Source & destination are known. Return bytes or screen characters? */
-static int forest_helper(void){
+static int forest_helper(char *restrict const outbuf){
   char *p = forest_prefix;
   char *q = outbuf;
   if(!*p) return 0;
@@ -344,9 +341,9 @@ Modifications to the arguments are not shown.
  */
 
 /* "command" is the same thing: long unless c */
-static int pr_args(void){
+static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp;
-  endp = outbuf + forest_helper();
+  endp = outbuf + forest_helper(outbuf);
   if(bsd_c_option){
     endp += escape_str(endp, pp->cmd, PAGE_SIZE); /* short version */
   }else{
@@ -370,9 +367,9 @@ static int pr_args(void){
 }
 
 /* "ucomm" is the same thing: short unless -f */
-static int pr_comm(void){
+static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp;
-  endp = outbuf + forest_helper();
+  endp = outbuf + forest_helper(outbuf);
   if(!unix_f_option){ /* does -f matter? */
     endp += escape_str(endp, pp->cmd, PAGE_SIZE); /* short version */
   }else{
@@ -395,15 +392,15 @@ static int pr_comm(void){
   return endp - outbuf;
 }
 /* Non-standard, from SunOS 5 */
-static int pr_fname(void){
+static int pr_fname(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp;
-  endp = outbuf + forest_helper();
+  endp = outbuf + forest_helper(outbuf);
   endp += escape_str(endp, pp->cmd, 8);
   return endp - outbuf;
 }
 
 /* elapsed wall clock time, [[dd-]hh:]mm:ss format (not same as "time") */
-static int pr_etime(void){
+static int pr_etime(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long t;
   unsigned dd,hh,mm,ss;
   char *cp = outbuf;
@@ -420,12 +417,12 @@ static int pr_etime(void){
   cp +=                 snprintf(cp, COLWID, "%02u:%02u", mm, ss)       ;
   return (int)(cp-outbuf);
 }
-static int pr_nice(void){
+static int pr_nice(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%ld", pp->nice);
 }
 
 /* "Processor utilisation for scheduling."  --- we use %cpu w/o fraction */
-static int pr_c(void){
+static int pr_c(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long long total_time;   /* jiffies used by this process */
   unsigned pcpu = 0;               /* scaled %cpu, 99 means 99% */
   unsigned long long seconds;      /* seconds of process life */
@@ -437,7 +434,7 @@ static int pr_c(void){
   return snprintf(outbuf, COLWID, "%2u", pcpu);
 }
 /* normal %CPU in ##.# format. */
-static int pr_pcpu(void){
+static int pr_pcpu(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long long total_time;   /* jiffies used by this process */
   unsigned pcpu = 0;               /* scaled %cpu, 999 means 99.9% */
   unsigned long long seconds;      /* seconds of process life */
@@ -449,7 +446,7 @@ static int pr_pcpu(void){
   return snprintf(outbuf, COLWID, "%2u.%u", pcpu/10U, pcpu%10U);
 }
 /* this is a "per-mill" format, like %cpu with no decimal point */
-static int pr_cp(void){
+static int pr_cp(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long long total_time;   /* jiffies used by this process */
   unsigned pcpu = 0;               /* scaled %cpu, 999 means 99.9% */
   unsigned long long seconds;      /* seconds of process life */
@@ -461,19 +458,19 @@ static int pr_cp(void){
   return snprintf(outbuf, COLWID, "%3u", pcpu);
 }
 
-static int pr_pgid(void){
+static int pr_pgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->pgrp);
 }
-static int pr_pid(void){
+static int pr_pid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->pid);
 }
-static int pr_ppid(void){
+static int pr_ppid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->ppid);
 }
 
 
 /* cumulative CPU time, [dd-]hh:mm:ss format (not same as "etime") */
-static int pr_time(void){
+static int pr_time(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long t;
   unsigned dd,hh,mm,ss;
   int c;
@@ -498,7 +495,7 @@ static int pr_time(void){
  *
  * TODO: add flag for "1.23M" behavior, on this and other columns.
  */
-static int pr_vsz(void){
+static int pr_vsz(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%lu", pp->vm_size);
 }
 
@@ -508,7 +505,7 @@ static int pr_vsz(void){
  * command args:    ruid   uid svuid   n/a
  */
 
-static int pr_ruser(void){
+static int pr_ruser(char *restrict const outbuf, const proc_t *restrict const pp){
     int width = COLWID;
 
     if(user_is_number)
@@ -517,15 +514,15 @@ static int pr_ruser(void){
         width = max_rightward;
     return snprintf(outbuf, width, "%s", pp->ruser);
 }
-static int pr_egroup(void){
+static int pr_egroup(char *restrict const outbuf, const proc_t *restrict const pp){
   if(strlen(pp->egroup)>max_rightward) return snprintf(outbuf, COLWID, "%d", pp->egid);
   return snprintf(outbuf, COLWID, "%s", pp->egroup);
 }
-static int pr_rgroup(void){
+static int pr_rgroup(char *restrict const outbuf, const proc_t *restrict const pp){
   if(strlen(pp->rgroup)>max_rightward) return snprintf(outbuf, COLWID, "%d", pp->rgid);
   return snprintf(outbuf, COLWID, "%s", pp->rgroup);
 }
-static int pr_euser(void){
+static int pr_euser(char *restrict const outbuf, const proc_t *restrict const pp){
     int width = COLWID;
     if(user_is_number)
         return snprintf(outbuf, COLWID, "%d", pp->euid);
@@ -544,17 +541,17 @@ static int pr_euser(void){
  * Sun and SCO add the -c behavior. Sun defines "pri" and "opri".
  * Linux may use "priority" for historical purposes.
  */
-static int pr_priority(void){    /* -20..20 */
+static int pr_priority(char *restrict const outbuf, const proc_t *restrict const pp){    /* -20..20 */
     return snprintf(outbuf, COLWID, "%ld", pp->priority);
 }
-static int pr_pri(void){         /* 20..60 */
+static int pr_pri(char *restrict const outbuf, const proc_t *restrict const pp){         /* 20..60 */
     return snprintf(outbuf, COLWID, "%ld", 39 - pp->priority);
 }
-static int pr_opri(void){        /* 39..79 */
+static int pr_opri(char *restrict const outbuf, const proc_t *restrict const pp){        /* 39..79 */
     return snprintf(outbuf, COLWID, "%ld", 60 + pp->priority);
 }
 
-static int pr_wchan(void){
+static int pr_wchan(char *restrict const outbuf, const proc_t *restrict const pp){
 /*
  * Unix98 says "blank if running" and also "no blanks"! :-(
  * Unix98 also says to use '-' if something is meaningless.
@@ -574,26 +571,26 @@ static int pr_wchan(void){
 
 /* Terrible trunctuation, like BSD crap uses: I999 J999 K999 */
 /* FIXME: disambiguate /dev/tty69 and /dev/pts/69. */
-static int pr_tty4(void){
+static int pr_tty4(char *restrict const outbuf, const proc_t *restrict const pp){
 /* snprintf(outbuf, COLWID, "%02x:%02x", pp->tty>>8, pp->tty&0xff); */
   return dev_to_tty(outbuf, 4, pp->tty, pp->pid, ABBREV_DEV|ABBREV_TTY|ABBREV_PTS);
 }
 
 /* Unix98: format is unspecified, but must match that used by who(1). */
-static int pr_tty8(void){
+static int pr_tty8(char *restrict const outbuf, const proc_t *restrict const pp){
 /* snprintf(outbuf, COLWID, "%02x:%02x", pp->tty>>8, pp->tty&0xff); */
   return dev_to_tty(outbuf, PAGE_SIZE-1, pp->tty, pp->pid, ABBREV_DEV);
 }
 
 #if 0
 /* This BSD state display may contain spaces, which is illegal. */
-static int pr_oldstate(void){
+static int pr_oldstate(char *restrict const outbuf, const proc_t *restrict const pp){
     return snprintf(outbuf, COLWID, "%s", status(pp));
 }
 #endif
 
 /* This state display is Unix98 compliant and has lots of info like BSD. */
-static int pr_stat(void){
+static int pr_stat(char *restrict const outbuf, const proc_t *restrict const pp){
     int end = 0;
     outbuf[end++] = pp->state;
     if(pp->rss == 0 && pp->state != 'Z')    outbuf[end++] = 'W';
@@ -605,19 +602,19 @@ static int pr_stat(void){
 }
 
 /* This minimal state display is Unix98 compliant, like SCO and SunOS 5 */
-static int pr_s(void){
+static int pr_s(char *restrict const outbuf, const proc_t *restrict const pp){
     outbuf[0] = pp->state;
     outbuf[1] = '\0';
     return 1;
 }
 
-static int pr_flag(void){
+static int pr_flag(char *restrict const outbuf, const proc_t *restrict const pp){
     /* Unix98 requires octal flags */
     /* this user-hostile and volatile junk gets 1 character */
     return snprintf(outbuf, COLWID, "%o", (unsigned)(pp->flags>>6U)&0x7U);
 }
 
-static int pr_euid(void){
+static int pr_euid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->euid);
 }
 
@@ -635,15 +632,15 @@ lim       soft memory limit
 tsiz   text size (in Kbytes)
 ***/
 
-static int pr_stackp(void){
+static int pr_stackp(char *restrict const outbuf, const proc_t *restrict const pp){
     return snprintf(outbuf, COLWID, "%08lx", pp->start_stack);
 }
 
-static int pr_esp(void){
+static int pr_esp(char *restrict const outbuf, const proc_t *restrict const pp){
     return snprintf(outbuf, COLWID, "%08lx", pp->kstk_esp);
 }
 
-static int pr_eip(void){
+static int pr_eip(char *restrict const outbuf, const proc_t *restrict const pp){
     return snprintf(outbuf, COLWID, "%08lx", pp->kstk_eip);
 }
 
@@ -656,7 +653,7 @@ static int old_time_helper(char *dst, unsigned long long t, unsigned long long r
   else              return snprintf(dst, COLWID, "%2u.%02u", (unsigned)t/100U, (unsigned)t%100U);
 }
 
-static int pr_bsdtime(void){
+static int pr_bsdtime(char *restrict const outbuf, const proc_t *restrict const pp){
     unsigned long long t;
     unsigned u;
     t = pp->utime + pp->stime;
@@ -665,7 +662,7 @@ static int pr_bsdtime(void){
     return snprintf(outbuf, COLWID, "%3u:%02u", u/60U, u%60U);
 }
 
-static int pr_bsdstart(void){
+static int pr_bsdstart(char *restrict const outbuf, const proc_t *restrict const pp){
   time_t start;
   time_t seconds_ago;
   start = time_of_boot + pp->start_time / Hertz;
@@ -677,16 +674,16 @@ static int pr_bsdstart(void){
   return 6;
 }
 
-static int pr_timeout(void){
+static int pr_timeout(char *restrict const outbuf, const proc_t *restrict const pp){
     return old_time_helper(outbuf, pp->timeout, seconds_since_boot*Hertz);
 }
 
-static int pr_alarm(void){
+static int pr_alarm(char *restrict const outbuf, const proc_t *restrict const pp){
     return old_time_helper(outbuf, pp->it_real_value, 0ULL);
 }
 
 /* HP-UX puts this in pages and uses "vsz" for kB */
-static int pr_sz(void){
+static int pr_sz(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%lu", (pp->vm_size)/(PAGE_SIZE/1024));
 }
 
@@ -707,67 +704,67 @@ static int pr_sz(void){
  */
 
 /* kB data size. See drs, tsiz & trs. */
-static int pr_dsiz(void){
+static int pr_dsiz(char *restrict const outbuf, const proc_t *restrict const pp){
     long dsiz = 0;
     if(pp->vsize) dsiz += (pp->vsize - pp->end_code + pp->start_code) >> 10;
     return snprintf(outbuf, COLWID, "%ld", dsiz);
 }
 
 /* kB text (code) size. See trs, dsiz & drs. */
-static int pr_tsiz(void){
+static int pr_tsiz(char *restrict const outbuf, const proc_t *restrict const pp){
     long tsiz = 0;
     if(pp->vsize) tsiz += (pp->end_code - pp->start_code) >> 10;
     return snprintf(outbuf, COLWID, "%ld", tsiz);
 }
 
 /* kB _resident_ data size. See dsiz, tsiz & trs. */
-static int pr_drs(void){
+static int pr_drs(char *restrict const outbuf, const proc_t *restrict const pp){
     long drs = 0;
     if(pp->vsize) drs += (pp->vsize - pp->end_code + pp->start_code) >> 10;
     return snprintf(outbuf, COLWID, "%ld", drs);
 }
 
 /* kB text _resident_ (code) size. See tsiz, dsiz & drs. */
-static int pr_trs(void){
+static int pr_trs(char *restrict const outbuf, const proc_t *restrict const pp){
     long trs = 0;
     if(pp->vsize) trs += (pp->end_code - pp->start_code) >> 10;
     return snprintf(outbuf, COLWID, "%ld", trs);
 }
 
 /* approximation to: kB of address space that could end up in swap */
-static int pr_swapable(void) {
+static int pr_swapable(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%ld", pp->vm_data + pp->vm_stack);
 }
 
 /* nasty old Debian thing */
-static int pr_size(void) {
+static int pr_size(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%ld", pp->size);
 }
 
 
-static int pr_minflt(void){
+static int pr_minflt(char *restrict const outbuf, const proc_t *restrict const pp){
     long flt = pp->min_flt;
     if(include_dead_children) flt += pp->cmin_flt;
     return snprintf(outbuf, COLWID, "%ld", flt);
 }
 
-static int pr_majflt(void){
+static int pr_majflt(char *restrict const outbuf, const proc_t *restrict const pp){
     long flt = pp->maj_flt;
     if(include_dead_children) flt += pp->cmaj_flt;
     return snprintf(outbuf, COLWID, "%ld", flt);
 }
 
-static int pr_lim(void){
+static int pr_lim(char *restrict const outbuf, const proc_t *restrict const pp){
     if(pp->rss_rlim == RLIM_INFINITY) return snprintf(outbuf, COLWID, "%s", "xx");
     return snprintf(outbuf, COLWID, "%5ld", pp->rss_rlim >> 10);
 }
 
 /* should print leading tilde ('~') if process is bound to the CPU */
-static int pr_psr(void){
+static int pr_psr(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->processor);
 }
 
-static int pr_wname(void){
+static int pr_wname(char *restrict const outbuf, const proc_t *restrict const pp){
 /* SGI's IRIX always uses a number for "wchan", so "wname" is provided too.
  *
  * We use '-' for running processes, the location when there is
@@ -778,24 +775,24 @@ static int pr_wname(void){
     return snprintf(outbuf, COLWID, "%s", wchan(pp->wchan));
 }
 
-static int pr_nwchan(void){
+static int pr_nwchan(char *restrict const outbuf, const proc_t *restrict const pp){
     if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, COLWID, "-");
     return snprintf(outbuf, COLWID, "%lx", pp->wchan & 0xffffff);
 }
 
-static int pr_rss(void){
+static int pr_rss(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%lu", pp->vm_rss);
 }
 
 /* pp->vm_rss * 1000 would overflow on 32-bit systems with 64 GB memory */
-static int pr_pmem(void){
+static int pr_pmem(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long pmem = 0;
   pmem = pp->vm_rss * 1000ULL / kb_main_total;
   if (pmem > 999) pmem = 999;
   return snprintf(outbuf, COLWID, "%2u.%u", (unsigned)(pmem/10), (unsigned)(pmem%10));
 }
 
-static int pr_class(void){
+static int pr_class(char *restrict const outbuf, const proc_t *restrict const pp){
   switch(pp->sched){
   case -1: return snprintf(outbuf, COLWID, "-");  /* not reported */
   case  0: return snprintf(outbuf, COLWID, "TS"); /* SCHED_OTHER */
@@ -804,16 +801,16 @@ static int pr_class(void){
   default: return snprintf(outbuf, COLWID, "?");  /* unknown value */
   }
 }
-static int pr_rtprio(void){
+static int pr_rtprio(char *restrict const outbuf, const proc_t *restrict const pp){
   if(pp->sched==0 || pp->sched==-1) return snprintf(outbuf, COLWID, "-");
   return snprintf(outbuf, COLWID, "%ld", pp->rtprio);
 }
-static int pr_sched(void){
+static int pr_sched(char *restrict const outbuf, const proc_t *restrict const pp){
   if(pp->sched==-1) return snprintf(outbuf, COLWID, "-");
   return snprintf(outbuf, COLWID, "%ld", pp->sched);
 }
 
-static int pr_lstart(void){
+static int pr_lstart(char *restrict const outbuf, const proc_t *restrict const pp){
   time_t t;
   t = time_of_boot + pp->start_time / Hertz;
   return snprintf(outbuf, COLWID, "%24.24s", ctime(&t));
@@ -828,7 +825,7 @@ static int pr_lstart(void){
  * So this isn't broken, but could be renamed to u98_std_stime,
  * as long as it still shows as STIME when using the -f option.
  */
-static int pr_stime(void){
+static int pr_stime(char *restrict const outbuf, const proc_t *restrict const pp){
   struct tm *proc_time;
   struct tm *our_time;
   time_t t;
@@ -846,7 +843,7 @@ static int pr_stime(void){
   return strftime(outbuf, 42, fmt, proc_time);
 }
 
-static int pr_start(void){
+static int pr_start(char *restrict const outbuf, const proc_t *restrict const pp){
   time_t t;
   char *str;
   t = time_of_boot + pp->start_time / Hertz;
@@ -860,7 +857,7 @@ static int pr_start(void){
 
 
 #ifdef SIGNAL_STRING
-static int help_pr_sig(const char *sig){
+static int help_pr_sig(char *restrict const outbuf, const char *restrict const sig){
   long len = 0;
   len = strlen(sig);
   if(wide_signals){
@@ -879,52 +876,52 @@ static int help_pr_sig(unsigned long long sig){
 }
 #endif
 
-static int pr_sig(void){
-  return help_pr_sig(pp->signal);
+static int pr_sig(char *restrict const outbuf, const proc_t *restrict const pp){
+  return help_pr_sig(outbuf, pp->signal);
 }
-static int pr_sigmask(void){
-  return help_pr_sig(pp->blocked);
+static int pr_sigmask(char *restrict const outbuf, const proc_t *restrict const pp){
+  return help_pr_sig(outbuf, pp->blocked);
 }
-static int pr_sigignore(void){
-  return help_pr_sig(pp->sigignore);
+static int pr_sigignore(char *restrict const outbuf, const proc_t *restrict const pp){
+  return help_pr_sig(outbuf, pp->sigignore);
 }
-static int pr_sigcatch(void){
-  return help_pr_sig(pp->sigcatch);
+static int pr_sigcatch(char *restrict const outbuf, const proc_t *restrict const pp){
+  return help_pr_sig(outbuf, pp->sigcatch);
 }
 
 
-static int pr_egid(void){
+static int pr_egid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->egid);
 }
-static int pr_rgid(void){
+static int pr_rgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->rgid);
 }
-static int pr_sgid(void){
+static int pr_sgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->sgid);
 }
-static int pr_fgid(void){
+static int pr_fgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->fgid);
 }
-static int pr_ruid(void){
+static int pr_ruid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->ruid);
 }
-static int pr_suid(void){
+static int pr_suid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->suid);
 }
-static int pr_fuid(void){
+static int pr_fuid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->fuid);
 }
 
 
-static int pr_fgroup(void){
+static int pr_fgroup(char *restrict const outbuf, const proc_t *restrict const pp){
   if(strlen(pp->fgroup)>max_rightward) return snprintf(outbuf, COLWID, "%d", pp->fgid);
   return snprintf(outbuf, COLWID, "%s", pp->fgroup);
 }
-static int pr_sgroup(void){
+static int pr_sgroup(char *restrict const outbuf, const proc_t *restrict const pp){
   if(strlen(pp->sgroup)>max_rightward) return snprintf(outbuf, COLWID, "%d", pp->sgid);
   return snprintf(outbuf, COLWID, "%s", pp->sgroup);
 }
-static int pr_fuser(void){
+static int pr_fuser(char *restrict const outbuf, const proc_t *restrict const pp){
     int width = COLWID;
 
     if(user_is_number)
@@ -933,7 +930,7 @@ static int pr_fuser(void){
         width = max_rightward;
     return snprintf(outbuf, width, "%s", pp->fuser);
 }
-static int pr_suser(void){
+static int pr_suser(char *restrict const outbuf, const proc_t *restrict const pp){
     int width = COLWID;
 
     if(user_is_number)
@@ -944,23 +941,24 @@ static int pr_suser(void){
 }
 
 
-static int pr_thread(void){  /* TID tid LWP lwp SPID spid */
+static int pr_thread(char *restrict const outbuf, const proc_t *restrict const pp){  /* TID tid LWP lwp SPID spid */
   return snprintf(outbuf, COLWID, "%u", pp->pid);  /* for now... FIXME */
 }
-static int pr_nlwp(void){  /* THCNT thcount NLWP nlwp */
+static int pr_nlwp(char *restrict const outbuf, const proc_t *restrict const pp){  /* THCNT thcount NLWP nlwp */
+  (void)pp; // FIXME
   return snprintf(outbuf, COLWID, "-");  /* for now... FIXME */
 }
 
-static int pr_sess(void){
+static int pr_sess(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->session);
 }
-static int pr_tpgid(void){
+static int pr_tpgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->tpgid);
 }
 
 
 /* SGI uses "cpu" to print the processor ID with header "P" */
-static int pr_sgi_p(void){          /* FIXME */
+static int pr_sgi_p(char *restrict const outbuf, const proc_t *restrict const pp){          /* FIXME */
   if(pp->state == 'R') return snprintf(outbuf, COLWID, "%d", pp->processor);
   return snprintf(outbuf, COLWID, "*");
 }
@@ -978,11 +976,11 @@ static int pr_sgi_p(void){          /* FIXME */
 /* as above, creates sr_secsid function */
 CMP_INT(secsid)  /* FLASK security ID, **NOT** a session ID -- ugh */
 
-static int pr_secsid ( void ) {
+static int pr_secsid(char *restrict const outbuf, const proc_t *restrict const pp){
   return sprintf(outbuf, "%d", (int) pp->secsid);
 }
 
-static int pr_context ( void ) {
+static int pr_context(char *restrict const outbuf, const proc_t *restrict const pp){
   char *ctxt; /* should be security_context_t */
   unsigned int len;
   int rv;
@@ -1604,6 +1602,9 @@ static void check_header_width(void){
 
 
 /********** show one process (NULL proc prints header) **********/
+
+static char *saved_outbuf;
+
 void show_one_proc(const proc_t *restrict const p){
   /* unknown: maybe set correct & actual to 1, remove +/- 1 below */
   int correct  = 0;  /* screen position we should be at */
@@ -1614,6 +1615,7 @@ void show_one_proc(const proc_t *restrict const p){
   int dospace  = 0;  /* previous column determined that we need a space */
   int legit    = 0;  /* legitimately stolen extra space */
   const format_node *restrict fmt = format_list;
+  char *restrict const outbuf = saved_outbuf;
   static int did_stuff = 0;  /* have we ever printed anything? */
 
   if(-1==(long)p){    /* true only once, at the end */
@@ -1634,7 +1636,6 @@ void show_one_proc(const proc_t *restrict const p){
     }
   }
   did_stuff = 1;
-  pp = p;                 /* global, the proc_t struct */
   if(active_cols>(int)OUTBUF_SIZE) fprintf(stderr,"Fix bigness error.\n");
 
   /* print row start sequence */
@@ -1645,7 +1646,7 @@ void show_one_proc(const proc_t *restrict const p){
     else max_rightward = active_cols-((correct>actual) ? correct : actual);
     max_leftward  = fmt->width + actual - correct; /* TODO check this */
     /* prepare data and calculate leftpad */
-    if(p && fmt->pr) amount = (*fmt->pr)();
+    if(p && fmt->pr) amount = (*fmt->pr)(outbuf,p);
     else amount = strlen(strcpy(outbuf, fmt->name)); /* AIX or headers */
     switch((fmt->flags) & JUST_MASK){
     case 0:  /* for AIX, assigned outside this file */
@@ -1772,6 +1773,7 @@ static void sanity_check(void){
 
 void init_output(void){
   int outbuf_pages;
+  char *outbuf;
 
   switch(page_size){
   case 65536: page_shift = 16; break;
@@ -1800,6 +1802,7 @@ void init_output(void){
   outbuf += page_size;
   // now outbuf points where we want it
   mprotect(outbuf + page_size * outbuf_pages, page_size, PROT_NONE); // gaurd page
+  saved_outbuf = outbuf;
 
   seconds_since_1970 = time(NULL);
   time_of_boot = seconds_since_1970 - seconds_since_boot;