]> granicus.if.org Git - procps-ng/commitdiff
ugly wart gone
authoralbert <>
Sun, 28 Sep 2003 17:23:29 +0000 (17:23 +0000)
committeralbert <>
Sun, 28 Sep 2003 17:23:29 +0000 (17:23 +0000)
proc/readproc.h
ps/common.h
ps/display.c
ps/output.c
ps/sortformat.c

index 4db8549a52817e6a31d516d3bfab10757c4bf55b..0b97c385cd2ce2da4b132b0b3697c6320c72e6b7 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef PROCPS_PROC_READPROC_H
 #define PROCPS_PROC_READPROC_H
-/*
+
 // New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
 // Copyright 1996 Charles L. Blake.
 // Copyright 1998 Michael K. Johnson
index c254ec5f3fb7a102ce2aa18833aa998247dc4d8a..615bee50f592c8a595a83129b368f6197d4f85e5 100644 (file)
 
 /******************* PS DEFINE *******************/
 
+// Column flags
+// Justification control for flags field comes first.
+#define CF_JUST_MASK                0x0f
+//      CF_AIXHACK                     0
+#define CF_USER                        1 // left if text, right if numeric
+#define CF_LEFT                        2
+#define CF_RIGHT                       3
+#define CF_UNLIMITED                   4
+#define CF_WCHAN                       5 // left if text, right if numeric
+#define CF_SIGNAL                      6 // right in 9, or 16 if screen_cols>107
+// Then the other flags
+#define CF_CUMUL              0x00000010 // mark cumulative (Summed) headers with 'C' */
+#define CF_PIDMAX             0x00000020 // react to pid_max
+#define CF_PRINT_THREAD_ONLY  0x10000000
+#define CF_PRINT_PROCESS_ONLY 0x20000000
+#define CF_PRINT_EVERY_TIME   0x40000000
+#define CF_PRINT_AS_NEEDED    0x80000000 // means we have no clue, so assume EVERY TIME
+
+
 #define needs_for_select (PROC_FILLSTAT | PROC_FILLSTATUS)
 
 /* thread_flags */
@@ -226,7 +245,7 @@ typedef struct sf_node {
 /********************* UNDECIDED GLOBALS **************/
 
 /* output.c */
-extern void show_one_proc(const proc_t *restrict const p);
+extern void show_one_proc(const proc_t *restrict const p, const format_node *restrict fmt);
 extern void print_format_specifiers(void);
 extern const aix_struct *search_aix_array(const int findme);
 extern const shortsort_struct *search_shortsort_array(const int findme);
index 39bb895ca587f9911876f318421c6e78a42d24c1..0871bbee3eda0d30ea805edf3ab71ba524a6bef2 100644 (file)
@@ -251,11 +251,11 @@ static void simple_spew(void){
   memset(&buf, '#', sizeof(proc_t));
   while(readproc(ptp,&buf)){
     if(want_this_proc(&buf)){
-      if(thread_flags & TF_show_proc) show_one_proc(&buf);
+      if(thread_flags & TF_show_proc) show_one_proc(&buf,format_list);
       if(thread_flags & TF_show_task){
         proc_t buf2;
         // must still have the process allocated
-        while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2);
+        while(readtask(ptp,&buf,&buf2)) show_one_proc(&buf2,format_list);
         // must not attempt to free cmdline and environ
       }
     }
@@ -313,7 +313,7 @@ static int compare_two_procs(const void *a, const void *b){
 static void show_proc_array(int n){
   proc_t **p = processes;
   while(n--){
-    show_one_proc(*p);
+    show_one_proc(*p,format_list);
     /* no point freeing any of this -- won't need more mem */
 //    if((*p)->cmdline) free((void*)*(*p)->cmdline);
 //    if((*p)->environ) free((void*)*(*p)->environ);
@@ -334,7 +334,7 @@ static void show_tree(const int self, const int n, const int level, const int ha
     else             forest_prefix[level-1] = 'L';
     forest_prefix[level] = '\0';
   }
-  show_one_proc(processes[self]);  /* first show self */
+  show_one_proc(processes[self],format_list);  /* first show self */
   /* no point freeing any of this -- won't need more mem */
 //  if(processes[self]->cmdline) free((void*)*processes[self]->cmdline);
 //  if(processes[self]->environ) free((void*)*processes[self]->environ);
@@ -461,6 +461,6 @@ int main(int argc, char *argv[]){
 
   if(forest_type || sort_list) fancy_spew(); /* sort or forest */
   else simple_spew(); /* no sort, no forest */
-  show_one_proc((proc_t *)-1); /* no output yet? */
+  show_one_proc((proc_t *)-1,format_list); /* no output yet? */
   return 0;
 }
index 1f1c0eb5af0d79fdf2b495316b30a48c5ad02295..5290994bb6165de731fdce3ae734a1ef603bc201 100644 (file)
@@ -42,9 +42,6 @@
 #include "config.h"
 #endif
  
-/* proc_t offset macro */
-#define PO(q) ((unsigned long)(&(((proc_t*)0)->q)))
-
 #include <ctype.h>
 #include <fcntl.h>
 #include <grp.h>
@@ -86,19 +83,6 @@ static unsigned max_rightward = 0x12345678; /* space for RIGHT stuff */
 static unsigned max_leftward = 0x12345678; /* space for LEFT stuff */
 
 
-/* Justification control for flags field. */
-#define JUST_MASK   0x0f
-//      AIXHACK        0
-#define USER           1  // left if text, right if numeric
-#define LEFT           2
-#define RIGHT          3
-#define UNLIMITED      4
-#define WCHAN          5  // left if text, right if numeric
-#define SIGNAL         6  // right in 9, or 16 if screen_cols>107
-
-#define CUMUL       0x10  // mark cumulative (Summed) headers with 'C' */
-#define PIDMAX      0x20  // react to pid_max
-
 
 static int wide_signals;  /* true if we have room */
 
@@ -1122,6 +1106,20 @@ static int sr_context ( const proc_t* P, const proc_t* Q ) {
  * BSD n:   "user" becomes "uid" and "wchan" becomes "nwchan" (number)
  */
 
+/* Justification control for flags field. */
+#define USER      CF_USER   // left if text, right if numeric
+#define LEFT      CF_LEFT
+#define RIGHT     CF_RIGHT
+#define UNLIMITED CF_UNLIMITED
+#define WCHAN     CF_WCHAN  // left if text, right if numeric
+#define SIGNAL    CF_SIGNAL // right in 9, or 16 if room
+#define CUMUL     CF_CUMUL
+#define PIDMAX    CF_PIDMAX
+#define TO        CF_PRINT_THREAD_ONLY
+#define PO        CF_PRINT_PROCESS_ONLY
+#define ET        CF_PRINT_EVERY_TIME
+#define AN        CF_PRINT_AS_NEEDED // no idea
+
 /* short names to save space */
 #define MEM PROC_FILLMEM     /* read statm  */
 #define ARG PROC_FILLARG     /* read cmdline (cleared if c option) */
@@ -1131,10 +1129,6 @@ static int sr_context ( const proc_t* P, const proc_t* Q ) {
 #define GRP PROC_FILLGRP     /* gid_t -> group names */
 #define WCH PROC_FILLWCHAN   /* do WCHAN lookup */
 
-#define TO PRINT_THREAD_ONLY
-#define PO PRINT_PROCESS_ONLY
-#define ET PRINT_EVERY_TIME
-#define AN PRINT_AS_NEEDED // no idea
 
 /* TODO
  *      pull out annoying BSD aliases into another table (to macro table?)
@@ -1364,6 +1358,14 @@ static const format_struct format_array[] = {
 {"~",         "-",       pr_nop,      sr_nop,     1,   0,    LNX, AN|RIGHT}  /* NULL would ruin alphabetical order */
 };
 
+#undef USER
+#undef LEFT
+#undef RIGHT
+#undef UNLIMITED
+#undef WCHAN
+#undef SIGNAL
+#undef CUMUL
+#undef PIDMAX
 #undef PO
 #undef TO
 #undef AN
@@ -1567,19 +1569,19 @@ static void check_header_width(void){
   unsigned int i = 0;
   unsigned int sigs = 0;
   while(walk){
-    switch((walk->flags) & JUST_MASK){
+    switch((walk->flags) & CF_JUST_MASK){
     default:
       total += walk->width;
       total += was_normal;
       was_normal = 1;
       break;
-    case SIGNAL:
+    case CF_SIGNAL:
       sigs++;
       total += walk->width;
       total += was_normal;
       was_normal = 1;
       break;
-    case UNLIMITED:  /* could chop this a bit */
+    case CF_UNLIMITED:  /* could chop this a bit */
       if(walk->next) total += walk->width;
       else total += 3; /* not strlen(walk->name) */
       total += was_normal;
@@ -1599,12 +1601,6 @@ static void check_header_width(void){
     if(screen_cols*i >= OUTBUF_SIZE/2) break; /* can't go over */
   }
   wide_signals = (total+sigs*7 <= active_cols);
-  
-#if 0
-  printf("123456789-123456789-123456789-123456789-"
-         "123456789-123456789-123456789-123456789\n");
-  printf("need %d, using %d\n", total, active_cols);
-#endif
 }
 
 
@@ -1615,7 +1611,7 @@ static void check_header_width(void){
 
 static char *saved_outbuf;
 
-void show_one_proc(const proc_t *restrict const p){
+void show_one_proc(const proc_t *restrict const p, const format_node *restrict fmt){
   /* unknown: maybe set correct & actual to 1, remove +/- 1 below */
   int correct  = 0;  /* screen position we should be at */
   int actual   = 0;  /* screen position we are at */
@@ -1624,17 +1620,15 @@ void show_one_proc(const proc_t *restrict const p){
   int space    = 0;  /* amount of space we actually need to print */
   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(unlikely(-1==(long)p)){    /* true only once, at the end */
-    check_header_width();  /* temporary test code */
     if(did_stuff) return;
     /* have _never_ printed anything, but might need a header */
     if(!--lines_to_next_header){
       lines_to_next_header = header_gap;
-      show_one_proc(NULL);
+      show_one_proc(NULL,fmt);
     }
     /* fprintf(stderr, "No processes available.\n"); */  /* legal? */
     exit(1);
@@ -1642,7 +1636,7 @@ void show_one_proc(const proc_t *restrict const p){
   if(likely(p)){  /* not header, maybe we should call ourselves for it */
     if(unlikely(!--lines_to_next_header)){
       lines_to_next_header = header_gap;
-      show_one_proc(NULL);
+      show_one_proc(NULL,fmt);
     }
   }
   did_stuff = 1;
@@ -1658,18 +1652,18 @@ void show_one_proc(const proc_t *restrict const p){
     /* prepare data and calculate leftpad */
     if(likely(p) && likely(fmt->pr)) amount = (*fmt->pr)(outbuf,p);
     else amount = strlen(strcpy(outbuf, fmt->name)); /* AIX or headers */
-    switch((fmt->flags) & JUST_MASK){
+    switch((fmt->flags) & CF_JUST_MASK){
     case 0:  /* for AIX, assigned outside this file */
       leftpad = 0;
       break;
-    case LEFT:          /* bad */
+    case CF_LEFT:          /* bad */
       leftpad = 0;
       break;
-    case RIGHT:     /* OK */
+    case CF_RIGHT:     /* OK */
       leftpad = fmt->width - amount;
       if(leftpad < 0) leftpad = 0;
       break;
-    case SIGNAL:
+    case CF_SIGNAL:
       /* if the screen is wide enough, use full 16-character output */
       if(wide_signals){
         leftpad = 16 - amount;
@@ -1679,12 +1673,12 @@ void show_one_proc(const proc_t *restrict const p){
       }
       if(leftpad < 0) leftpad = 0;
       break;
-    case USER:       /* bad */
+    case CF_USER:       /* bad */
       leftpad = fmt->width - amount;
       if(leftpad < 0) leftpad = 0;
       if(!user_is_number) leftpad = 0;
       break;
-    case WCHAN:       /* bad */
+    case CF_WCHAN:       /* bad */
       if(wchan_is_number){
         leftpad = fmt->width - amount;
         if(leftpad < 0) leftpad = 0;
@@ -1704,7 +1698,7 @@ void show_one_proc(const proc_t *restrict const p){
         leftpad = 0;
         break;
       }
-    case UNLIMITED:
+    case CF_UNLIMITED:
       if(unlikely(fmt->next)){
         outbuf[fmt->width] = '\0';  /* Must chop, more columns! */
       }else{
index 8750590a0745b2ad2cf8abefc23a20e4020c0248..0c247d5a701cc5adb8b658a852b76f5d31603e64 100644 (file)
@@ -31,11 +31,6 @@ static int have_gnu_sort = 0;           /* if true, "O" must be format */
 static int already_parsed_sort = 0;     /* redundantly set in & out of fn */
 static int already_parsed_format = 0;
 
-#ifndef COL_PIDMAX
-#warning Ugly wart needs fixing, use common.h to sync w/ output.c
-#define COL_PIDMAX 0x20
-#endif
-
 
 /****************  Parse single format specifier *******************/
 static format_node *do_one_spec(const char *spec, const char *override){
@@ -47,7 +42,7 @@ static format_node *do_one_spec(const char *spec, const char *override){
     int w1, w2;
     format_node *thisnode;
     thisnode = malloc(sizeof(format_node));
-    if(fs->flags & COL_PIDMAX){
+    if(fs->flags & CF_PIDMAX){
       w1 = (int)get_pid_digits();
       w2 = strlen(fs->head);
       if(w2>w1) w1=w2; // FIXME w/ separate header/body column sizing