~ubuntu-branches/ubuntu/trusty/procps/trusty-proposed

« back to all changes in this revision

Viewing changes to .pc/p_pid-enum.diff/top/top.h

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-12-05 13:27:37 UTC
  • Revision ID: package-import@ubuntu.com-20131205132737-0ftdo3qzvtwxrqa5
Tags: 1:3.3.8-2ubuntu2
* Build using dh-autoreconf, update libtool.m4.
* Fix build with glibc-2.18/linux-3.13.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* top.h - Header file:         show Linux processes */
 
2
/*
 
3
 * Copyright (c) 2002-2013, by: James C. Warner
 
4
 *    All rights reserved.      8921 Hilloway Road
 
5
 *                              Eden Prairie, Minnesota 55347 USA
 
6
 *
 
7
 * This file may be used subject to the terms and conditions of the
 
8
 * GNU Library General Public License Version 2, or any later version
 
9
 * at your option, as published by the Free Software Foundation.
 
10
 * This program is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 * GNU Library General Public License for more details.
 
14
 */
 
15
/* For contributions to this program, the author wishes to thank:
 
16
 *    Craig Small, <csmall@small.dropbear.id.au>
 
17
 *    Albert D. Cahalan, <albert@users.sf.net>
 
18
 *    Sami Kerola, <kerolasa@iki.fi>
 
19
 */
 
20
#ifndef _Itop
 
21
#define _Itop
 
22
 
 
23
#include "../proc/readproc.h"
 
24
 
 
25
        /* Defines represented in configure.ac ----------------------------- */
 
26
//#define BOOST_PERCNT            /* enable extra precision for two % fields */
 
27
//#define NOBOOST_MEMS            /* disable extra precision for mem fields  */
 
28
//#define NUMA_DISABLE            /* disable summary area NUMA/Nodes display */
 
29
//#define OOMEM_ENABLE            /* enable the SuSE out-of-memory additions */
 
30
//#define SIGNALS_LESS            /* favor reduced signal load over response */
 
31
 
 
32
        /* Development/Debugging defines ----------------------------------- */
 
33
//#define ATEOJ_RPTHSH            /* report on hash specifics, at end-of-job */
 
34
//#define ATEOJ_RPTSTD            /* report on misc stuff, at end-of-job     */
 
35
//#define CASEUP_HEXES            /* show any hex values in upper case       */
 
36
//#define CASEUP_SUFIX            /* show time/mem/cnts suffix in upper case */
 
37
//#define CPU_ZEROTICS            /* tolerate few tics when cpu off vs. idle */
 
38
//#define EQUCOLHDRYES            /* yes, do equalize column header lengths  */
 
39
//#define INSP_JUSTNOT            /* don't smooth unprintable right margins  */
 
40
//#define INSP_OFFDEMO            /* disable demo screens, issue msg instead */
 
41
//#define INSP_SAVEBUF            /* preserve 'Insp_buf' contents in a file  */
 
42
//#define INSP_SLIDE_1            /* when scrolling left/right don't move 8  */
 
43
//#define OFF_HST_HASH            /* use BOTH qsort+bsrch vs. hashing scheme */
 
44
//#define OFF_STDIOLBF            /* disable our own stdout _IOFBF override  */
 
45
//#define PRETEND2_5_X            /* pretend we're linux 2.5.x (for IO-wait) */
 
46
//#define PRETEND8CPUS            /* pretend we're smp with 8 ticsers (sic)  */
 
47
//#define PRETENDNOCAP            /* use a terminal without essential caps   */
 
48
//#define PRETEND_NUMA            /* pretend we've got some linux NUMA Nodes */
 
49
//#define RCFILE_NOERR            /* rcfile errs silently default, vs. fatal */
 
50
//#define RECALL_FIXED            /* don't reorder saved strings if recalled */
 
51
//#define RMAN_IGNORED            /* don't consider auto right margin glitch */
 
52
//#define SCROLLVAR_NO            /* disable intra-column horizontal scroll  */
 
53
//#define STRINGCASENO            /* case insenstive compare/locate versions */
 
54
//#define TERMIOS_ONLY            /* just limp along with native input only  */
 
55
//#define TREE_NORESET            /* sort keys do NOT force forest view OFF  */
 
56
//#define USE_X_COLHDR            /* emphasize header vs. whole col, for 'x' */
 
57
//#define VALIDATE_NLS            /* validate the integrity of all nls tbls  */
 
58
 
 
59
 
 
60
/*######  Notes, etc.  ###################################################*/
 
61
 
 
62
        /* The following convention is used to identify those areas where
 
63
           adaptations for hotplugging are to be found ...
 
64
              *** hotplug_acclimated ***
 
65
           ( hopefully libproc will also be supportive of our efforts ) */
 
66
 
 
67
        /* For introducing inaugural cgroup support, thanks to:
 
68
              Jan Gorig <jgorig@redhat.com> - April, 2011 */
 
69
 
 
70
        /* For the motivation and path to nls support, thanks to:
 
71
              Sami Kerola, <kerolasa@iki.fi> - December, 2011 */
 
72
 
 
73
        /* There are still some short strings that may yet be candidates
 
74
           for nls support inclusion.  They're identified with:
 
75
              // nls_maybe */
 
76
 
 
77
        /* For initiating the topic of potential % CPU distortions due to
 
78
           to kernel and/or cpu anomalies (see CPU_ZEROTICS), thanks to:
 
79
              Jaromir Capik, <jcapik@redhat.com> - February, 2012 */
 
80
 
 
81
        /* For the impetus and NUMA/Node prototype design, thanks to:
 
82
              Lance Shelton <LShelton@fusionio.com> - April, 2013 */
 
83
 
 
84
#ifdef PRETEND2_5_X
 
85
#define linux_version_code LINUX_VERSION(2,5,43)
 
86
#endif
 
87
 
 
88
   // pretend as if #define _GNU_SOURCE
 
89
char *strcasestr(const char *haystack, const char *needle);
 
90
 
 
91
#ifdef STRINGCASENO
 
92
#define STRSTR  strcasestr
 
93
#define STRCMP  strcasecmp
 
94
#else
 
95
#define STRSTR  strstr
 
96
#define STRCMP  strcmp
 
97
#endif
 
98
 
 
99
 
 
100
/*######  Some Miscellaneous constants  ##################################*/
 
101
 
 
102
        /* The default delay twix updates */
 
103
#define DEF_DELAY  3.0
 
104
 
 
105
        /* Length of time a message is displayed and the duration
 
106
           of a 'priming' wait during library startup (in microseconds) */
 
107
#define MSG_USLEEP  1250000
 
108
#define LIB_USLEEP  150000
 
109
 
 
110
        /* Specific process id monitoring support (command line only) */
 
111
#define MONPIDMAX  20
 
112
 
 
113
        /* Output override minimums (the -w switch and/or env vars) */
 
114
#define W_MIN_COL  3
 
115
#define W_MIN_ROW  3
 
116
 
 
117
        /* Miscellaneous buffers with liberal values and some other defines
 
118
           -- mostly just to pinpoint source code usage/dependancies */
 
119
#define SCREENMAX   512
 
120
   /* the above might seem pretty stingy, until you consider that with every
 
121
      field displayed the column header would be approximately 250 bytes
 
122
      -- so SCREENMAX provides for all fields plus a 250+ byte command line */
 
123
#define CAPBUFSIZ    32
 
124
#define CLRBUFSIZ    64
 
125
#define PFLAGSSIZ    64
 
126
#define SMLBUFSIZ   128
 
127
#define MEDBUFSIZ   256
 
128
#define LRGBUFSIZ   512
 
129
#define OURPATHSZ  1024
 
130
#define BIGBUFSIZ  2048
 
131
   /* in addition to the actual display data, our row might have to accommodate
 
132
      many termcap/color transitions - these definitions ensure we have room */
 
133
#define ROWMINSIZ  ( SCREENMAX +  4 * (CAPBUFSIZ + CLRBUFSIZ) )
 
134
#define ROWMAXSIZ  ( SCREENMAX + 16 * (CAPBUFSIZ + CLRBUFSIZ) )
 
135
   // minimum size guarantee for dynamically acquired 'readfile' buffer
 
136
#define READMINSZ  2048
 
137
   // size of preallocated search string buffers, same as ioline()
 
138
#define FNDBUFSIZ  MEDBUFSIZ
 
139
 
 
140
 
 
141
   // space between task fields/columns
 
142
#define COLPADSTR   " "
 
143
#define COLPADSIZ   ( sizeof(COLPADSTR) - 1 )
 
144
   // continuation ch when field/column truncated
 
145
#define COLPLUSCH   '+'
 
146
 
 
147
   // support for keyboard stuff (cursor motion keystrokes, mostly)
 
148
#define kbd_ESC    '\033'
 
149
#define kbd_SPACE  ' '
 
150
#define kbd_ENTER  '\n'
 
151
#define kbd_UP     129
 
152
#define kbd_DOWN   130
 
153
#define kbd_LEFT   131
 
154
#define kbd_RIGHT  132
 
155
#define kbd_PGUP   133
 
156
#define kbd_PGDN   134
 
157
#define kbd_HOME   135
 
158
#define kbd_END    136
 
159
#define kbd_BKSP   137
 
160
#define kbd_INS    138
 
161
#define kbd_DEL    139
 
162
#define kbd_CtrlO  '\017'
 
163
 
 
164
        /* Special value in Pseudo_row to force an additional procs refresh
 
165
           -- used at startup and for task/thread mode transitions */
 
166
#define PROC_XTRA  -1
 
167
 
 
168
#ifndef CPU_ZEROTICS
 
169
        /* This is the % used in establishing the tics threshold below
 
170
           which a cpu is treated as 'idle' rather than displaying
 
171
           misleading state percentages */
 
172
#define TICS_EDGE  20
 
173
#endif
 
174
 
 
175
 
 
176
/* #####  Enum's and Typedef's  ############################################ */
 
177
 
 
178
        /* Flags for each possible field (and then some) --
 
179
           these MUST be kept in sync with the FLD_t Fieldstab[] array !! */
 
180
enum pflag {
 
181
   P_PID = 0, P_PPD,
 
182
   P_UED, P_UEN, P_URD, P_URN, P_USD, P_USN,
 
183
   P_GID, P_GRP, P_PGD, P_TTY, P_TPG, P_SID,
 
184
   P_PRI, P_NCE, P_THD,
 
185
   P_CPN, P_CPU, P_TME, P_TM2,
 
186
   P_MEM, P_VRT, P_SWP, P_RES, P_COD, P_DAT, P_SHR,
 
187
   P_FL1, P_FL2, P_DRT,
 
188
   P_STA, P_CMD, P_WCH, P_FLG, P_CGR,
 
189
   P_SGD, P_SGN, P_TGD,
 
190
#ifdef OOMEM_ENABLE
 
191
   P_OOA, P_OOM,
 
192
#endif
 
193
   P_ENV,
 
194
   P_FV1, P_FV2,
 
195
   P_USE,
 
196
#ifdef USE_X_COLHDR
 
197
   // not really pflags, used with tbl indexing
 
198
   P_MAXPFLGS
 
199
#else
 
200
   // not really pflags, used with tbl indexing & col highlighting
 
201
   P_MAXPFLGS, X_XON, X_XOF
 
202
#endif
 
203
};
 
204
 
 
205
        /* The scaling 'target' used with memory fields */
 
206
enum scale_enum {
 
207
   SK_Kb, SK_Mb, SK_Gb, SK_Tb, SK_Pb, SK_Eb, SK_SENTINEL
 
208
};
 
209
 
 
210
        /* Used to manipulate (and document) the Frames_resize states */
 
211
enum resize_states {
 
212
   RESIZ_clr, RESIZ_kbd, RESIZ_sig
 
213
};
 
214
 
 
215
        /* This typedef just ensures consistent 'process flags' handling */
 
216
typedef unsigned char FLG_t;
 
217
 
 
218
        /* These typedefs attempt to ensure consistent 'ticks' handling */
 
219
typedef unsigned long long TIC_t;
 
220
typedef          long long SIC_t;
 
221
 
 
222
        /* Sort support, callback function signature */
 
223
typedef int (*QFP_t)(const void *, const void *);
 
224
 
 
225
        /* This structure consolidates the information that's used
 
226
           in a variety of display roles. */
 
227
typedef struct FLD_t {
 
228
   int           width;         // field width, if applicable
 
229
   int           scale;         // scaled target, if applicable
 
230
   const int     align;         // the default column alignment flag
 
231
   const QFP_t   sort;          // sort function
 
232
   const int     lflg;          // PROC_FILLxxx flag(s) needed by this field
 
233
} FLD_t;
 
234
 
 
235
#ifdef OFF_HST_HASH
 
236
        /* This structure supports 'history' processing and records the
 
237
           bare minimum of needed information from one frame to the next --
 
238
           we don't calc and save data that goes unused like the old top. */
 
239
typedef struct HST_t {
 
240
   TIC_t tics;                  // last frame's tics count
 
241
   unsigned long maj, min;      // last frame's maj/min_flt counts
 
242
   int pid;                     // record 'key'
 
243
} HST_t;
 
244
#else
 
245
        /* This structure supports 'history' processing and records the
 
246
           bare minimum of needed information from one frame to the next --
 
247
           we don't calc and save data that goes unused like the old top nor
 
248
           do we incure the overhead of sorting to support a binary search
 
249
           (or worse, a friggin' for loop) when retrieval is necessary! */
 
250
typedef struct HST_t {
 
251
   TIC_t tics;                  // last frame's tics count
 
252
   unsigned long maj, min;      // last frame's maj/min_flt counts
 
253
   int pid;                     // record 'key'
 
254
   int lnk;                     // next on hash chain
 
255
} HST_t;
 
256
#endif
 
257
 
 
258
        /* These 2 structures store a frame's cpu tics used in history
 
259
           calculations.  They exist primarily for SMP support but serve
 
260
           all environments. */
 
261
typedef struct CT_t {
 
262
   /* other kernels: u == user/us, n == nice/ni, s == system/sy, i == idle/id
 
263
      2.5.41 kernel: w == IO-wait/wa (io wait time)
 
264
      2.6.0  kernel: x == hi (hardware irq time), y == si (software irq time)
 
265
      2.6.11 kernel: z == st (virtual steal time) */
 
266
   TIC_t u, n, s, i, w, x, y, z;  // as represented in /proc/stat
 
267
#ifndef CPU_ZEROTICS
 
268
   SIC_t tot;                     // total from /proc/stat line 1
 
269
#endif
 
270
} CT_t;
 
271
 
 
272
typedef struct CPU_t {
 
273
   CT_t cur;                      // current frame's cpu tics
 
274
   CT_t sav;                      // prior frame's cpu tics
 
275
#ifndef CPU_ZEROTICS
 
276
   SIC_t edge;                    // tics adjustment threshold boundary
 
277
#endif
 
278
   int id;                        // the cpu id number (0 - nn)
 
279
#ifndef NUMA_DISABLE
 
280
   int node;                      // the numa node it belongs to
 
281
#endif
 
282
} CPU_t;
 
283
 
 
284
        /* /////////////////////////////////////////////////////////////// */
 
285
        /* Special Section: multiple windows/field groups  --------------- */
 
286
        /* ( kind of a header within a header: constants, types & macros ) */
 
287
 
 
288
#define CAPTABMAX  9             /* max entries in each win's caps table   */
 
289
#define GROUPSMAX  4             /* the max number of simultaneous windows */
 
290
#define WINNAMSIZ  4             /* size of RCW_t winname buf (incl '\0')  */
 
291
#define GRPNAMSIZ  WINNAMSIZ+2   /* window's name + number as in: '#:...'  */
 
292
 
 
293
        /* The Persistent 'Mode' flags!
 
294
           These are preserved in the rc file, as a single integer and the
 
295
           letter shown is the corresponding 'command' toggle */
 
296
        // 'View_' flags affect the summary (minimum), taken from 'Curwin'
 
297
#define View_CPUSUM  0x008000     // '1' - show combined cpu stats (vs. each)
 
298
#define View_CPUNOD  0x400000     // '2' - show numa node cpu stats ('3' also)
 
299
#define View_LOADAV  0x004000     // 'l' - display load avg and uptime summary
 
300
#define View_STATES  0x002000     // 't' - display task/cpu(s) states summary
 
301
#define View_MEMORY  0x001000     // 'm' - display memory summary
 
302
#define View_NOBOLD  0x000008     // 'B' - disable 'bold' attribute globally
 
303
#define View_SCROLL  0x080000     // 'C' - enable coordinates msg w/ scrolling
 
304
        // 'Show_' & 'Qsrt_' flags are for task display in a visible window
 
305
#define Show_COLORS  0x000800     // 'z' - show in color (vs. mono)
 
306
#define Show_HIBOLD  0x000400     // 'b' - rows and/or cols bold (vs. reverse)
 
307
#define Show_HICOLS  0x000200     // 'x' - show sort column emphasized
 
308
#define Show_HIROWS  0x000100     // 'y' - show running tasks highlighted
 
309
#define Show_CMDLIN  0x000080     // 'c' - show cmdline vs. name
 
310
#define Show_CTIMES  0x000040     // 'S' - show times as cumulative
 
311
#define Show_IDLEPS  0x000020     // 'i' - show idle processes (all tasks)
 
312
#define Show_TASKON  0x000010     // '-' - tasks showable when Mode_altscr
 
313
#define Show_FOREST  0x000002     // 'V' - show cmd/cmdlines with ascii art
 
314
#define Qsrt_NORMAL  0x000004     // 'R' - reversed column sort (high to low)
 
315
#define Show_JRSTRS  0x040000     // 'j' - right justify "string" data cols
 
316
#define Show_JRNUMS  0x020000     // 'J' - right justify "numeric" data cols
 
317
        // these flag(s) have no command as such - they're for internal use
 
318
#define INFINDS_xxx  0x010000     // build rows for find_string, not display
 
319
#define EQUWINS_xxx  0x000001     // rebalance all wins & tasks (off i,n,u/U)
 
320
#ifndef USE_X_COLHDR
 
321
#define NOHISEL_xxx  0x200000     // restrict Show_HICOLS for osel temporarily
 
322
#define NOHIFND_xxx  0x100000     // restrict Show_HICOLS for find temporarily
 
323
#endif
 
324
 
 
325
        // Default flags if there's no rcfile to provide user customizations
 
326
#define DEF_WINFLGS ( View_LOADAV | View_STATES | View_CPUSUM | View_MEMORY \
 
327
   | Show_HIBOLD | Show_HIROWS | Show_IDLEPS | Show_TASKON | Show_JRNUMS \
 
328
   | Qsrt_NORMAL )
 
329
 
 
330
        /* These are used to direct wins_reflag */
 
331
enum reflag_enum {
 
332
   Flags_TOG, Flags_SET, Flags_OFF
 
333
};
 
334
 
 
335
        /* These are used to direct win_warn */
 
336
enum warn_enum {
 
337
   Warn_ALT, Warn_VIZ
 
338
};
 
339
 
 
340
        /* This type helps support both a window AND the rcfile */
 
341
typedef struct RCW_t {  // the 'window' portion of an rcfile
 
342
   int    sortindx,             // sort field, represented as a procflag
 
343
          winflags,             // 'view', 'show' and 'sort' mode flags
 
344
          maxtasks,             // user requested maximum, 0 equals all
 
345
          summclr,                      // color num used in summ info
 
346
          msgsclr,                      //        "       in msgs/pmts
 
347
          headclr,                      //        "       in cols head
 
348
          taskclr;                      //        "       in task rows
 
349
   char   winname [WINNAMSIZ],          // window name, user changeable
 
350
          fieldscur [PFLAGSSIZ];        // fields displayed and ordered
 
351
} RCW_t;
 
352
 
 
353
        /* This represents the complete rcfile */
 
354
typedef struct RCF_t {
 
355
   char   id;                   // rcfile version id
 
356
   int    mode_altscr;          // 'A' - Alt display mode (multi task windows)
 
357
   int    mode_irixps;          // 'I' - Irix vs. Solaris mode (SMP-only)
 
358
   float  delay_time;           // 'd'/'s' - How long to sleep twixt updates
 
359
   int    win_index;            // Curwin, as index
 
360
   RCW_t  win [GROUPSMAX];      // a 'WIN_t.rc' for each window
 
361
   int    fixed_widest;         // 'X' - wider non-scalable col addition
 
362
   int    summ_mscale;          // 'E' - scaling of summary memory values
 
363
   int    task_mscale;          // 'e' - scaling of process memory values
 
364
   int    zero_suppress;        // '0' - suppress scaled zeros toggle
 
365
} RCF_t;
 
366
 
 
367
        /* This structure stores configurable information for each window.
 
368
           By expending a little effort in its creation and user requested
 
369
           maintenance, the only real additional per frame cost of having
 
370
           windows is an extra sort -- but that's just on pointers! */
 
371
typedef struct WIN_t {
 
372
   FLG_t  pflgsall [PFLAGSSIZ],        // all 'active/on' fieldscur, as enum
 
373
          procflgs [PFLAGSSIZ];        // fieldscur subset, as enum
 
374
   RCW_t  rc;                          // stuff that gets saved in the rcfile
 
375
   int    winnum,          // a window's number (array pos + 1)
 
376
          winlines,        // current task window's rows (volatile)
 
377
          maxpflgs,        // number of displayed procflgs ("on" in fieldscur)
 
378
          totpflgs,        // total of displayable procflgs in pflgsall array
 
379
          begpflg,         // scrolled beginning pos into pflgsall array
 
380
          endpflg,         // scrolled ending pos into pflgsall array
 
381
          begtask,         // scrolled beginning pos into Frame_maxtask
 
382
#ifndef SCROLLVAR_NO
 
383
          varcolbeg,       // scrolled position within variable width col
 
384
#endif
 
385
          varcolsz,        // max length of variable width column(s)
 
386
          usrseluid,       // validated uid for 'u/U' user selection
 
387
          usrseltyp,       // the basis for matching above uid
 
388
          usrselflg,       // flag denoting include/exclude matches
 
389
          hdrcaplen;       // column header xtra caps len, if any
 
390
   char   capclr_sum [CLRBUFSIZ],      // terminfo strings built from
 
391
          capclr_msg [CLRBUFSIZ],      //   RCW_t colors (& rebuilt too),
 
392
          capclr_pmt [CLRBUFSIZ],      //   but NO recurring costs !
 
393
          capclr_hdr [CLRBUFSIZ],      //   note: sum, msg and pmt strs
 
394
          capclr_rowhigh [CLRBUFSIZ],  //         are only used when this
 
395
          capclr_rownorm [CLRBUFSIZ],  //         window is the 'Curwin'!
 
396
          cap_bold [CAPBUFSIZ],        // support for View_NOBOLD toggle
 
397
          grpname [GRPNAMSIZ],         // window number:name, printable
 
398
#ifdef USE_X_COLHDR
 
399
          columnhdr [ROWMINSIZ],       // column headings for procflgs
 
400
#else
 
401
          columnhdr [SCREENMAX],       // column headings for procflgs
 
402
#endif
 
403
         *captab [CAPTABMAX];          // captab needed by show_special()
 
404
   struct osel_s *osel_1st;            // other selection criteria anchor
 
405
   int    osel_tot;                    // total of other selection criteria
 
406
   char  *osel_prt;                    // other stuff printable as status line
 
407
   char  *findstr;                     // window's current/active search string
 
408
   int    findlen;                     // above's strlen, without call overhead
 
409
   proc_t **ppt;                       // this window's proc_t ptr array
 
410
   struct WIN_t *next,                 // next window in window stack
 
411
                *prev;                 // prior window in window stack
 
412
} WIN_t;
 
413
 
 
414
        // Used to test/manipulate the window flags
 
415
#define CHKw(q,f)    (int)((q)->rc.winflags & (f))
 
416
#define TOGw(q,f)    (q)->rc.winflags ^=  (f)
 
417
#define SETw(q,f)    (q)->rc.winflags |=  (f)
 
418
#define OFFw(q,f)    (q)->rc.winflags &= ~(f)
 
419
#define ALTCHKw      (Rc.mode_altscr ? 1 : win_warn(Warn_ALT))
 
420
#define VIZISw(q)    (!Rc.mode_altscr || CHKw(q,Show_TASKON))
 
421
#define VIZCHKw(q)   (VIZISw(q)) ? 1 : win_warn(Warn_VIZ)
 
422
#define VIZTOGw(q,f) (VIZISw(q)) ? TOGw(q,(f)) : win_warn(Warn_VIZ)
 
423
 
 
424
        // Used to test/manipulte fieldscur values
 
425
#define FLDon(c)     ((c) |= 0x80)
 
426
#define FLDget(q,i)  ((FLG_t)((q)->rc.fieldscur[i] & 0x7f) - FLD_OFFSET)
 
427
#define FLDtog(q,i)  ((q)->rc.fieldscur[i] ^= 0x80)
 
428
#define FLDviz(q,i)  ((q)->rc.fieldscur[i] &  0x80)
 
429
#define ENUchk(w,E)  (NULL != strchr((w)->rc.fieldscur, (E + FLD_OFFSET) | 0x80))
 
430
#define ENUset(w,E)  do { char *t; \
 
431
      if ((t = strchr((w)->rc.fieldscur, E + FLD_OFFSET))) \
 
432
         *t = (E + FLD_OFFSET) | 0x80; \
 
433
   /* else fieldscur char already has high bit on! */ \
 
434
   } while (0)
 
435
#define ENUviz(w,E)  (NULL != memchr((w)->procflgs, E, (w)->maxpflgs))
 
436
#define ENUpos(w,E)  ((int)((FLG_t*)memchr((w)->pflgsall, E, (w)->totpflgs) - (w)->pflgsall))
 
437
 
 
438
        // Support for variable width columns (and potentially scrolling too)
 
439
#define VARcol(E)    (-1 == Fieldstab[E].width)
 
440
#ifndef SCROLLVAR_NO
 
441
#ifdef USE_X_COLHDR
 
442
#define VARright(w)  (1 == w->maxpflgs && VARcol(w->procflgs[0]))
 
443
#else
 
444
#define VARright(w) ((1 == w->maxpflgs && VARcol(w->procflgs[0])) || \
 
445
                     (3 == w->maxpflgs && X_XON == w->procflgs[0] && VARcol(w->procflgs[1])))
 
446
#endif
 
447
#define VARleft(w)   (w->varcolbeg && VARright(w))
 
448
#define SCROLLAMT    8
 
449
#endif
 
450
 
 
451
        /* Special Section: end ------------------------------------------ */
 
452
        /* /////////////////////////////////////////////////////////////// */
 
453
 
 
454
 
 
455
/*######  Some Miscellaneous Macro definitions  ##########################*/
 
456
 
 
457
        /* Yield table size as 'int' */
 
458
#define MAXTBL(t)  (int)(sizeof(t) / sizeof(t[0]))
 
459
 
 
460
        /* A null-terminating strncpy, assuming strlcpy is not available.
 
461
           ( and assuming callers don't need the string length returned ) */
 
462
#define STRLCPY(dst,src) { strncpy(dst, src, sizeof(dst)); dst[sizeof(dst) - 1] = '\0'; }
 
463
 
 
464
        /* Used to clear all or part of our Pseudo_screen */
 
465
#define PSU_CLREOS(y) memset(&Pseudo_screen[ROWMAXSIZ*y], '\0', Pseudo_size-(ROWMAXSIZ*y))
 
466
 
 
467
        /* Used as return arguments in *some* of the sort callbacks */
 
468
#define SORT_lt  ( Frame_srtflg > 0 ?  1 : -1 )
 
469
#define SORT_gt  ( Frame_srtflg > 0 ? -1 :  1 )
 
470
#define SORT_eq  0
 
471
 
 
472
        /* Used to create *most* of the sort callback functions
 
473
           note: some of the callbacks are NOT your father's callbacks, they're
 
474
                 highly optimized to save them ol' precious cycles! */
 
475
#define SCB_NAME(f) sort_P_ ## f
 
476
#define SCB_NUM1(f,n) \
 
477
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
478
      if ( (*P)->n < (*Q)->n ) return SORT_lt; \
 
479
      if ( (*P)->n > (*Q)->n ) return SORT_gt; \
 
480
      return SORT_eq; }
 
481
#define SCB_NUM2(f,n1,n2) \
 
482
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
483
      if ( ((*P)->n1+(*P)->n2) < ((*Q)->n1+(*Q)->n2) ) return SORT_lt; \
 
484
      if ( ((*P)->n1+(*P)->n2) > ((*Q)->n1+(*Q)->n2) ) return SORT_gt; \
 
485
      return SORT_eq; }
 
486
#define SCB_NUMx(f,n) \
 
487
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
488
      return Frame_srtflg * ( (*Q)->n - (*P)->n ); }
 
489
#define SCB_STRS(f,s) \
 
490
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
491
      if (!(*P)->s || !(*Q)->s) return SORT_eq; \
 
492
      return Frame_srtflg * STRCMP((*Q)->s, (*P)->s); }
 
493
#define SCB_STRV(f,b,v,s) \
 
494
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
495
      if (b) { \
 
496
         if (!(*P)->v || !(*Q)->v) return SORT_eq; \
 
497
         return Frame_srtflg * STRCMP((*Q)->v[0], (*P)->v[0]); } \
 
498
      return Frame_srtflg * STRCMP((*Q)->s, (*P)->s); }
 
499
#define SCB_STRX(f,s) \
 
500
   int strverscmp(const char *s1, const char *s2); \
 
501
   static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
 
502
      if (!(*P)->s || !(*Q)->s) return SORT_eq; \
 
503
      return Frame_srtflg * strverscmp((*Q)->s, (*P)->s); }
 
504
 
 
505
/*
 
506
 * The following three macros are used to 'inline' those portions of the
 
507
 * display process involved in formatting, while protecting against any
 
508
 * potential embedded 'millesecond delay' escape sequences.
 
509
 */
 
510
        /**  PUTT - Put to Tty (used in many places)
 
511
               . for temporary, possibly interactive, 'replacement' output
 
512
               . may contain ANY valid terminfo escape sequences
 
513
               . need NOT represent an entire screen row */
 
514
#define PUTT(fmt,arg...) do { \
 
515
      char _str[ROWMAXSIZ]; \
 
516
      snprintf(_str, sizeof(_str), fmt, ## arg); \
 
517
      putp(_str); \
 
518
   } while (0)
 
519
 
 
520
        /**  PUFF - Put for Frame (used in only 3 places)
 
521
               . for more permanent frame-oriented 'update' output
 
522
               . may NOT contain cursor motion terminfo escapes
 
523
               . assumed to represent a complete screen ROW
 
524
               . subject to optimization, thus MAY be discarded */
 
525
#define PUFF(fmt,arg...) do { \
 
526
      char _str[ROWMAXSIZ], *_eol; \
 
527
      _eol = _str + snprintf(_str, sizeof(_str), fmt, ## arg); \
 
528
      if (Batch) { \
 
529
         while (*(--_eol) == ' '); *(++_eol) = '\0'; putp(_str); } \
 
530
      else { \
 
531
         char *_ptr = &Pseudo_screen[Pseudo_row * ROWMAXSIZ]; \
 
532
         if (Pseudo_row + 1 < Screen_rows) ++Pseudo_row; \
 
533
         if (!strcmp(_ptr, _str)) putp("\n"); \
 
534
         else { \
 
535
            strcpy(_ptr, _str); \
 
536
            putp(_ptr); } } \
 
537
   } while (0)
 
538
 
 
539
        /**  POOF - Pulled Out of Frame (used in only 1 place)
 
540
               . for output that is/was sent directly to the terminal
 
541
                 but would otherwise have been counted as a Pseudo_row */
 
542
#define POOF(str,cap) do { \
 
543
      putp(str); putp(cap); \
 
544
      Pseudo_screen[Pseudo_row * ROWMAXSIZ] = '\0'; \
 
545
      if (Pseudo_row + 1 < Screen_rows) ++Pseudo_row; \
 
546
   } while (0)
 
547
 
 
548
        /* Orderly end, with any sort of message - see fmtmk */
 
549
#define debug_END(s) { \
 
550
           void error_exit (const char *); \
 
551
           fputs(Cap_clr_scr, stdout); \
 
552
           error_exit(s); \
 
553
        }
 
554
 
 
555
        /* A poor man's breakpoint, if he's too lazy to learn gdb */
 
556
#define its_YOUR_fault { *((char *)0) = '!'; }
 
557
 
 
558
 
 
559
/*######  Display Support *Data*  ########################################*/
 
560
/*######  Some Display Support *Data*  ###################################*/
 
561
/*      ( see module top_nls.c for the nls translatable data ) */
 
562
 
 
563
        /* Configuration files support */
 
564
#define SYS_RCFILESPEC  "/etc/toprc"
 
565
#define RCF_EYECATCHER  "Config File (Linux processes with windows)\n"
 
566
#define RCF_VERSION_ID  'g'
 
567
 
 
568
        /* The default fields displayed and their order, if nothing is
 
569
           specified by the loser, oops user.
 
570
           note: any *contiguous* ascii sequence can serve as fieldscur
 
571
                 characters as long as the initial value is coordinated
 
572
                 with that specified for FLD_OFFSET
 
573
           ( we're providing for up to 55 fields initially, )
 
574
           ( with values chosen to avoid the need to escape ) */
 
575
#define FLD_OFFSET  '%'
 
576
   //   seq_fields  "%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ["
 
577
#define DEF_FIELDS  "�������ķ���&')*+,-./012568<>?ABCFGHIJKLMNOPQRSTUVWXYZ["
 
578
        /* Pre-configured windows/field groups */
 
579
#define JOB_FIELDS  "�������Ļ����()*+,-./012568>?@ABCFGHIJKLMNOPQRSTUVWXYZ["
 
580
#define MEM_FIELDS  "����������ij���&'()*+,-./0125689BFGHIJKLMNOPQRSTUVWXYZ["
 
581
#define USR_FIELDS  "�����������)+,-./1234568;<=>?@ABCFGHIJKLMNOPQRSTUVWXYZ["
 
582
#ifdef OOMEM_ENABLE
 
583
        // the suse old top fields ( 'a'-'z' + '{|' ) in positions 0-27
 
584
        // ( the extra chars above represent the 'off' state )
 
585
#define CVT_FIELDS  "%&*'(-0346789:;<=>?@ACDEFGML)+,./125BHIJKNOPQRSTUVWXYZ["
 
586
#define CVT_FLDMAX  28
 
587
#else
 
588
        // other old top fields ( 'a'-'z' ) in positions 0-25
 
589
#define CVT_FIELDS  "%&*'(-0346789:;<=>?@ACDEFG)+,./125BHIJKLMNOPQRSTUVWXYZ["
 
590
#define CVT_FLDMAX  26
 
591
#endif
 
592
 
 
593
        /* The default values for the local config file */
 
594
#define DEF_RCFILE { \
 
595
   RCF_VERSION_ID, 0, 1, DEF_DELAY, 0, { \
 
596
   { P_CPU, DEF_WINFLGS, 0, \
 
597
      COLOR_RED, COLOR_RED, COLOR_YELLOW, COLOR_RED, \
 
598
      "Def", DEF_FIELDS }, \
 
599
   { P_PID, DEF_WINFLGS, 0, \
 
600
      COLOR_CYAN, COLOR_CYAN, COLOR_WHITE, COLOR_CYAN, \
 
601
      "Job", JOB_FIELDS }, \
 
602
   { P_MEM, DEF_WINFLGS, 0, \
 
603
      COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLUE, COLOR_MAGENTA, \
 
604
      "Mem", MEM_FIELDS }, \
 
605
   { P_UEN, DEF_WINFLGS, 0, \
 
606
      COLOR_YELLOW, COLOR_YELLOW, COLOR_GREEN, COLOR_YELLOW, \
 
607
      "Usr", USR_FIELDS } \
 
608
   }, 0, SK_Kb, SK_Kb, 0 }
 
609
 
 
610
        /* Summary Lines specially formatted string(s) --
 
611
           see 'show_special' for syntax details + other cautions. */
 
612
#define LOADAV_line  "%s -%s\n"
 
613
#define LOADAV_line_alt  "%s~6 -%s\n"
 
614
 
 
615
 
 
616
/*######  For Piece of mind  #############################################*/
 
617
 
 
618
        /* just sanity check(s)... */
 
619
#if defined(ATEOJ_RPTHSH) && defined(OFF_HST_HASH)
 
620
# error 'ATEOJ_RPTHSH' conflicts with 'OFF_HST_HASH'
 
621
#endif
 
622
#if defined(RECALL_FIXED) && defined(TERMIOS_ONLY)
 
623
# error 'RECALL_FIXED' conflicts with 'TERMIOS_ONLY'
 
624
#endif
 
625
#if defined(PRETEND_NUMA) && defined(NUMA_DISABLE)
 
626
# error 'PRETEND_NUMA' confilcts with 'NUMA_DISABLE'
 
627
#endif
 
628
#if (LRGBUFSIZ < SCREENMAX)
 
629
# error 'LRGBUFSIZ' must NOT be less than 'SCREENMAX'
 
630
#endif
 
631
#if defined(TERMIOS_ONLY)
 
632
# warning 'TERMIOS_ONLY' disables input recall and makes man doc incorrect
 
633
#endif
 
634
 
 
635
 
 
636
/*######  Some Prototypes (ha!)  #########################################*/
 
637
 
 
638
   /* These 'prototypes' are here exclusively for documentation purposes. */
 
639
   /* ( see the find_string function for the one true required protoype ) */
 
640
/*------  Sort callbacks  ------------------------------------------------*/
 
641
/*        for each possible field, in the form of:                        */
 
642
/*atic int           sort_P_XXX (const proc_t **P, const proc_t **Q);     */
 
643
/*------  Tiny useful routine(s)  ----------------------------------------*/
 
644
//atic const char   *fmtmk (const char *fmts, ...);
 
645
//atic inline char  *scat (char *dst, const char *src);
 
646
//atic const char   *tg2 (int x, int y);
 
647
/*------  Exit/Interrput routines  ---------------------------------------*/
 
648
//atic void          at_eoj (void);
 
649
//atic void          bye_bye (const char *str);
 
650
//atic void          error_exit (const char *str);
 
651
//atic void          library_err (const char *fmts, ...);
 
652
//atic void          sig_abexit (int sig);
 
653
//atic void          sig_endpgm (int dont_care_sig);
 
654
//atic void          sig_paused (int dont_care_sig);
 
655
//atic void          sig_resize (int dont_care_sig);
 
656
/*------  Misc Color/Display support  ------------------------------------*/
 
657
//atic void          capsmk (WIN_t *q);
 
658
//atic void          show_msg (const char *str);
 
659
//atic int           show_pmt (const char *str);
 
660
//atic inline void   show_scroll (void);
 
661
//atic void          show_special (int interact, const char *glob);
 
662
//atic void          updt_scroll_msg (void);
 
663
/*------  Low Level Memory/Keyboard/File I/O support  --------------------*/
 
664
//atic void         *alloc_c (size_t num);
 
665
//atic void         *alloc_r (void *ptr, size_t num);
 
666
//atic char         *alloc_s (const char *str);
 
667
//atic inline int    ioa (struct timespec *ts);
 
668
//atic int           ioch (int ech, char *buf, unsigned cnt);
 
669
//atic int           iokey (int action);
 
670
//atic char         *ioline (const char *prompt);
 
671
//atic int           readfile (FILE *fp, char **baddr, size_t *bsize, size_t *bread);
 
672
/*------  Small Utility routines  ----------------------------------------*/
 
673
//atic float         get_float (const char *prompt);
 
674
//atic int           get_int (const char *prompt);
 
675
//atic inline const char *hex_make (KLONG num, int noz);
 
676
//atic void          osel_clear (WIN_t *q);
 
677
//atic inline int    osel_matched (const WIN_t *q, FLG_t enu, const char *str);
 
678
//atic const char   *user_certify (WIN_t *q, const char *str, char typ);
 
679
//atic inline int    user_matched (const WIN_t *q, const proc_t *p);
 
680
/*------  Basic Formatting support  --------------------------------------*/
 
681
//atic inline const char *justify_pad (const char *str, int width, int justr);
 
682
//atic inline const char *make_chr (const char ch, int width, int justr);
 
683
//atic inline const char *make_num (long num, int width, int justr, int col);
 
684
//atic inline const char *make_str (const char *str, int width, int justr, int col);
 
685
//atic const char   *scale_mem (int target, unsigned long num, int width, int justr);
 
686
//atic const char   *scale_num (unsigned long num, int width, int justr);
 
687
//atic const char   *scale_pcnt (float num, int width, int justr);
 
688
//atic const char   *scale_tics (TIC_t tics, int width, int justr);
 
689
/*------  Fields Management support  -------------------------------------*/
 
690
/*atic FLD_t         Fieldstab[] = { ... }                                */
 
691
//atic void          adj_geometry (void);
 
692
//atic void          build_headers (void);
 
693
//atic void          calibrate_fields (void);
 
694
//atic void          display_fields (int focus, int extend);
 
695
//atic void          fields_utility (void);
 
696
//atic inline void   widths_resize (void);
 
697
//atic void          zap_fieldstab (void);
 
698
/*------  Library Interface  ---------------------------------------------*/
 
699
//atic CPU_t        *cpus_refresh (CPU_t *cpus);
 
700
#ifdef OFF_HST_HASH
 
701
//atic inline HST_t *hstbsrch (HST_t *hst, int max, int pid);
 
702
#else
 
703
//atic inline HST_t *hstget (int pid);
 
704
//atic inline void   hstput (unsigned idx);
 
705
#endif
 
706
//atic void          procs_hlp (proc_t *p);
 
707
//atic void          procs_refresh (void);
 
708
//atic void          sysinfo_refresh (int forced);
 
709
/*------  Inspect Other Output  ------------------------------------------*/
 
710
//atic void          insp_cnt_nl (void);
 
711
#ifndef INSP_OFFDEMO
 
712
//atic void          insp_do_demo (char *fmts, int pid);
 
713
#endif
 
714
//atic void          insp_do_file (char *fmts, int pid);
 
715
//atic void          insp_do_pipe (char *fmts, int pid);
 
716
//atic inline int    insp_find_ofs (int col, int row);
 
717
//atic void          insp_find_str (int ch, int *col, int *row);
 
718
//atic inline void   insp_make_row (int col, int row);
 
719
//atic void          insp_show_pgs (int col, int row, int max);
 
720
//atic int           insp_view_choice (proc_t *obj);
 
721
//atic void          inspection_utility (int pid);
 
722
/*------  Startup routines  ----------------------------------------------*/
 
723
//atic void          before (char *me);
 
724
//atic int           config_cvt (WIN_t *q);
 
725
//atic void          configs_read (void);
 
726
//atic void          parse_args (char **args);
 
727
//atic void          whack_terminal (void);
 
728
/*------  Windows/Field Groups support  ----------------------------------*/
 
729
//atic void          win_names (WIN_t *q, const char *name);
 
730
//atic void          win_reset (WIN_t *q);
 
731
//atic WIN_t        *win_select (int ch);
 
732
//atic int           win_warn (int what);
 
733
//atic void          wins_clrhlp (WIN_t *q, int save);
 
734
//atic void          wins_colors (void);
 
735
//atic void          wins_reflag (int what, int flg);
 
736
//atic void          wins_stage_1 (void);
 
737
//atic void          wins_stage_2 (void);
 
738
/*------  Interactive Input Tertiary support  ----------------------------*/
 
739
//atic inline int    find_ofs (const WIN_t *q, const char *buf);
 
740
//atic void          find_string (int ch);
 
741
//atic void          help_view (void);
 
742
//atic void          other_selection (int ch);
 
743
//atic void          write_rcfile (void);
 
744
/*------  Interactive Input Secondary support (do_key helpers)  ----------*/
 
745
//atic void          keys_global (int ch);
 
746
//atic void          keys_summary (int ch);
 
747
//atic void          keys_task (int ch);
 
748
//atic void          keys_window (int ch);
 
749
//atic void          keys_xtra (int ch);
 
750
/*------  Forest View support  -------------------------------------------*/
 
751
//atic void          forest_adds (const int self, const int level);
 
752
//atic int           forest_based (const proc_t **x, const proc_t **y);
 
753
//atic void          forest_create (WIN_t *q);
 
754
//atic inline const char *forest_display (const WIN_t *q, const proc_t *p);
 
755
/*------  Main Screen routines  ------------------------------------------*/
 
756
//atic void          do_key (int ch);
 
757
//atic void          summary_hlp (CPU_t *cpu, const char *pfx);
 
758
//atic void          summary_show (void);
 
759
//atic const char   *task_show (const WIN_t *q, const proc_t *p);
 
760
//atic int           window_show (WIN_t *q, int wmax);
 
761
/*------  Entry point plus two  ------------------------------------------*/
 
762
//atic void          frame_hlp (int wix, int max);
 
763
//atic void          frame_make (void);
 
764
//     int           main (int dont_care_argc, char **argv);
 
765
 
 
766
#endif /* _Itop */
 
767