} // end: fmtmk
+ /*
+ * Interger based fieldscur version of 'strlen' */
+static inline int mlen (const int *mem) {
+ int i;
+
+ for (i = 0; mem[i]; i++)
+ ;
+ return i;
+} // end: mlen
+
+
+ /*
+ * Interger based fieldscur version of 'strchr' */
+static inline int *msch (const int *mem, int obj, int max) {
+ int i;
+
+ for (i = 0; i < max; i++)
+ if (*(mem + i) == obj) return (int *)mem + i;
+ return NULL;
+} // end: msch
+
+
/*
* This guy is just our way of avoiding the overhead of the standard
* strcat function (should the caller choose to participate) */
, Curwin->rc.sortindx, Curwin->rc.maxtasks
, Curwin->varcolsz, Curwin->winlines
, (int)strlen(Curwin->columnhdr)
- , EU_MAXPFLGS, (int)strlen(Curwin->rc.fieldscur)
+ , EU_MAXPFLGS, mlen(Curwin->rc.fieldscur)
);
}
}
/* prep sacrificial suffix (allowing for beginning '= ')
note: width passed to 'utf8_embody' may go negative, but he'll be just fine */
snprintf(sbuf, sizeof(sbuf), "= %.*s", utf8_embody(N_fld(f), smax - xEQUS), N_fld(f));
-
// obtain translated deltas (if any) ...
xcol = utf8_delta(fmtmk("%.*s", utf8_embody(N_col(f), 7), N_col(f)));
xfld = utf8_delta(sbuf + xEQUS); // ignore beginning '= '
#else
#define unSCRL { w->begpflg = 0; OFFw(w, Show_HICOLS); }
#endif
- #define swapEM { char c; unSCRL; c = w->rc.fieldscur[i]; \
+ #define swapEM { int c; unSCRL; c = w->rc.fieldscur[i]; \
w->rc.fieldscur[i] = *p; *p = c; p = &w->rc.fieldscur[i]; }
- #define spewFI { char *t; f = w->rc.sortindx; t = strchr(w->rc.fieldscur, f + FLD_OFFSET); \
- if (!t) t = strchr(w->rc.fieldscur, (f + FLD_OFFSET) | 0x80); \
+ #define spewFI { int *t; f = w->rc.sortindx; t = msch(w->rc.fieldscur, f + FLD_OFFSET, EU_MAXPFLGS); \
+ if (!t) t = msch(w->rc.fieldscur, (f + FLD_OFFSET) | 0x01, EU_MAXPFLGS); \
i = (t) ? (int)(t - w->rc.fieldscur) : 0; }
WIN_t *w = Curwin; // avoid gcc bloat with a local copy
const char *h = NULL;
- char *p = NULL;
+ int *p = NULL;
int i, key;
FLG_t f;
case 'w':
Curwin = w = ('a' == key) ? w->next : w->prev;
spewFI
- h = p = NULL;
+ h = NULL;
+ p = NULL;
break;
default: // keep gcc happy
break;
} // end: before
- /*
- * A configs_file *Helper* function responsible for converting
- * a single window's old rc stuff into a new style rcfile entry */
-static int config_cvt (WIN_t *q) {
- static struct {
- int old, new;
- } flags_tab[] = {
- #define old_View_NOBOLD 0x000001
- #define old_VISIBLE_tsk 0x000008
- #define old_Qsrt_NORMAL 0x000010
- #define old_Show_HICOLS 0x000200
- #define old_Show_THREAD 0x010000
- { old_View_NOBOLD, View_NOBOLD },
- { old_VISIBLE_tsk, Show_TASKON },
- { old_Qsrt_NORMAL, Qsrt_NORMAL },
- { old_Show_HICOLS, Show_HICOLS },
- { old_Show_THREAD, 0 }
- #undef old_View_NOBOLD
- #undef old_VISIBLE_tsk
- #undef old_Qsrt_NORMAL
- #undef old_Show_HICOLS
- #undef old_Show_THREAD
- };
- static const char fields_src[] = CVT_FIELDS;
- char fields_dst[PFLAGSSIZ], *p1, *p2;
- int i, j, x;
-
- // first we'll touch up this window's winflags...
- x = q->rc.winflags;
- q->rc.winflags = 0;
- for (i = 0; i < MAXTBL(flags_tab); i++) {
- if (x & flags_tab[i].old) {
- x &= ~flags_tab[i].old;
- q->rc.winflags |= flags_tab[i].new;
- }
- }
- q->rc.winflags |= x;
-
- // now let's convert old top's more limited fields...
- j = strlen(q->rc.fieldscur);
- if (j > CVT_FLDMAX)
- return 1;
- strcpy(fields_dst, fields_src);
- /* all other fields represent the 'on' state with a capitalized version
- of a particular qwerty key. for the 2 additional suse out-of-memory
- fields it makes perfect sense to do the exact opposite, doesn't it?
- in any case, we must turn them 'off' temporarily... */
- if ((p1 = strchr(q->rc.fieldscur, '['))) *p1 = '{';
- if ((p2 = strchr(q->rc.fieldscur, '\\'))) *p2 = '|';
- for (i = 0; i < j; i++) {
- int c = q->rc.fieldscur[i];
- x = tolower(c) - 'a';
- if (x < 0 || x >= CVT_FLDMAX)
- return 1;
- fields_dst[i] = fields_src[x];
- if (isupper(c))
- FLDon(fields_dst[i]);
- }
- // if we turned any suse only fields off, turn 'em back on OUR way...
- if (p1) FLDon(fields_dst[p1 - q->rc.fieldscur]);
- if (p2) FLDon(fields_dst[p2 - q->rc.fieldscur]);
- strcpy(q->rc.fieldscur, fields_dst);
-
- // lastly, we must adjust the old sort field enum...
- x = q->rc.sortindx;
- q->rc.sortindx = fields_src[x] - FLD_OFFSET;
- if (q->rc.sortindx < 0 || q->rc.sortindx >= EU_MAXPFLGS)
- return 1;
-
- return 0;
-} // end: config_cvt
-
-
/*
* A configs_file *Helper* function responsible for reading
* and validating a configuration file's 'Inspection' entries */
, &Rc.id, &Rc.mode_altscr, &Rc.mode_irixps, &tmp_whole, &tmp_fract, &i)) {
return p;
}
- if (Rc.id < 'a' || Rc.id > RCF_VERSION_ID)
+ if (Rc.id != RCF_VERSION_ID)
return p;
if (Rc.mode_altscr < 0 || Rc.mode_altscr > 1)
return p;
*delay = (float)tmp_whole + (float)tmp_fract / 1000;
for (i = 0 ; i < GROUPSMAX; i++) {
- int n, x;
+ int j, n, x;
WIN_t *w = &Winstk[i];
p = fmtmk(N_fmt(RC_bad_entry_fmt), i+1, name);
- // note: "fieldscur=%__s" on next line should equal (PFLAGSSIZ -1) !
- if (2 != fscanf(fp, "%3s\tfieldscur=%99s\n"
- , w->rc.winname, w->rc.fieldscur))
+ if (1 != fscanf(fp, "%3s\tfieldscur=", w->rc.winname))
+ return p;
+ for (j = 0; j < mlen(w->rc.fieldscur); j++) {
+ if (1 != fscanf(fp, "%d ", &w->rc.fieldscur[j]))
return p;
-#if PFLAGSSIZ != 100
- // too bad fscanf is not as flexible with his format string as snprintf
- #error Hey, fix the above fscanf 'PFLAGSSIZ' dependency !
-#endif
+ }
+
// be tolerant of missing release 3.3.10 graph modes additions
if (3 > fscanf(fp, "\twinflags=%d, sortindx=%d, maxtasks=%d, graph_cpus=%d, graph_mems=%d"
", double_up=%d, combine_cpus=%d\n"
switch (Rc.id) {
case 'a': // 3.2.8 (former procps)
- if (config_cvt(w))
- return p;
- // fall through
case 'f': // 3.3.0 thru 3.3.3 (ng)
- SETw(w, Show_JRNUMS);
- // fall through
case 'g': // from 3.3.4 thru 3.3.8
- scat(w->rc.fieldscur, RCF_PLUS_H);
- // fall through
case 'h': // this is release 3.3.9
- w->rc.graph_cpus = w->rc.graph_mems = 0;
- // these next 2 are really global, but best documented here
- Rc.summ_mscale = Rc.task_mscale = SK_Kb;
- // fall through
case 'i': // from 3.3.10 thru 3.3.16
- scat(w->rc.fieldscur, RCF_PLUS_J);
- w->rc.double_up = w->rc.combine_cpus = 0;
- // fall through
case 'j': // this is release 3.3.17
- Rc.tics_scaled = 0;
+ return p;
case 'k': // current RCF_VERSION_ID
default:
- if (strlen(w->rc.fieldscur) != sizeof(DEF_FIELDS) - 1)
+ if (mlen(w->rc.fieldscur) < EU_MAXPFLGS)
return p;
- for (x = 0; x < EU_MAXPFLGS; ++x)
- if (EU_MAXPFLGS <= FLDget(w, x))
+ for (x = 0; x < EU_MAXPFLGS; x++) {
+ FLG_t f = FLDget(w, x);
+ if (f >= EU_MAXPFLGS || f < 0)
return p;
+ }
break;
}
// ensure there's been no manual alteration of fieldscur
for (n = 0 ; n < EU_MAXPFLGS; n++) {
- if (&w->rc.fieldscur[n] != strrchr(w->rc.fieldscur, w->rc.fieldscur[n]))
+ if (&w->rc.fieldscur[n] != msch(w->rc.fieldscur, w->rc.fieldscur[n], EU_MAXPFLGS))
return p;
}
#ifndef USE_X_COLHDR
static void write_rcfile (void) {
FILE *fp;
- int i;
+ int i, j, n;
if (Rc_questions) {
show_pmt(N_txt(XTRA_warncfg_txt));
, (int)(Curwin - Winstk));
for (i = 0 ; i < GROUPSMAX; i++) {
- fprintf(fp, "%s\tfieldscur=%s\n"
- , Winstk[i].rc.winname, Winstk[i].rc.fieldscur);
+ n = mlen(Winstk[i].rc.fieldscur);
+ fprintf(fp, "%s\tfieldscur=", Winstk[i].rc.winname);
+ for (j = 0; j < n; j++) {
+ if (j && !(j % FLD_ROWMAX) && j < n)
+ fprintf(fp, "\n\t\t ");
+ fprintf(fp, "%4d ", (int)Winstk[i].rc.fieldscur[j]);
+ }
+ fprintf(fp, "\n");
fprintf(fp, "\twinflags=%d, sortindx=%d, maxtasks=%d, graph_cpus=%d, graph_mems=%d"
", double_up=%d, combine_cpus=%d\n"
, Winstk[i].rc.winflags, Winstk[i].rc.sortindx, Winstk[i].rc.maxtasks
};
/* This typedef just ensures consistent 'process flags' handling */
-typedef unsigned char FLG_t;
+typedef int FLG_t;
/* These typedefs attempt to ensure consistent 'ticks' handling */
typedef unsigned long long TIC_t;
msgsclr, // " in msgs/pmts
headclr, // " in cols head
taskclr; // " in task rows
- char winname [WINNAMSIZ], // name for the window, user changeable
- fieldscur [PFLAGSSIZ]; // the fields for display & their order
+ char winname [WINNAMSIZ]; // name for the window, user changeable
+ FLG_t fieldscur [PFLAGSSIZ]; // the fields for display & their order
} RCW_t;
/* This represents the complete rcfile */
#define VIZTOGw(q,f) (VIZISw(q)) ? TOGw(q,(f)) : win_warn(Warn_VIZ)
// Used to test/manipulte fieldscur values
-#define FLDon(c) ((c) |= 0x80)
-#define FLDget(q,i) ((FLG_t)((q)->rc.fieldscur[i] & 0x7f) - FLD_OFFSET)
-#define FLDtog(q,i) ((q)->rc.fieldscur[i] ^= 0x80)
-#define FLDviz(q,i) ((q)->rc.fieldscur[i] & 0x80)
-#define ENUviz(w,E) (NULL != memchr((w)->procflgs, E, (w)->maxpflgs))
-#define ENUpos(w,E) ((int)((FLG_t*)memchr((w)->pflgsall, E, (w)->totpflgs) - (w)->pflgsall))
+#define FLDget(q,i) ( (((q)->rc.fieldscur[i]) >> 1) - FLD_OFFSET )
+#define FLDtog(q,i) ( (q)->rc.fieldscur[i] ^= 0x01 )
+#define FLDviz(q,i) ( (q)->rc.fieldscur[i] & 0x01 )
+#define ENUviz(w,E) ( NULL != msch((w)->procflgs, E, w->maxpflgs) )
+#define ENUpos(w,E) ( (int)(msch((w)->pflgsall, E, (w)->totpflgs) - (w)->pflgsall) )
// Support for variable width columns (and potentially scrolling too)
#define VARcol(E) (-1 == Fieldstab[E].width)
#define SYS_RCRESTRICT "/etc/toprc"
#define SYS_RCDEFAULTS "/etc/topdefaultrc"
#define RCF_EYECATCHER "Config File (Linux processes with windows)\n"
-#define RCF_PLUS_H "\\]^_`abcdefghij"
-#define RCF_PLUS_J "klmnopqrstuvwxyz"
#define RCF_VERSION_ID 'k'
- /* The default fields displayed and their order, if nothing is
- specified by the loser, oops user.
- note: any *contiguous* ascii sequence can serve as fieldscur
- characters as long as the initial value is coordinated
- with that specified for FLD_OFFSET
- ( we're providing for up to 86 fields currently, )
- ( with just one escaped value, the '\' character ) */
-#define FLD_OFFSET '%'
- // seq_fields "%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz"
+#define FLD_OFFSET ( (int)'%' )
+#define FLD_ROWMAX 20
+
+ /* The default fields displayed and their order,
+ if nothing is specified by the loser, oops user. */
+#define OLD_FIELDS { \
+ 75, 81, 103, 105, 119, 123, 129, 137, 111, 117, 115, 139, 76, 78, 82, 84, 86, 88, 90, 92, \
+ 94, 96, 98, 100, 106, 108, 112, 120, 124, 126, 130, 132, 134, 140, 142, 144, 146, 148, 150, 152, \
+ 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, \
+ 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, \
+ 234, 236, 238, 240, 242, 244, }
#ifdef ORIG_TOPDEFS
-#define DEF_FIELDS "¥¨³´»½ÀÄ·º¹Å&')*+,-./012568<>?ABCFGHIJKLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J
+#define DEF_FIELDS OLD_FIELDS
#else
-#define DEF_FIELDS "¥&K¨³´»½@·º¹56ÄFÅ')*+,-./0128<>?ABCGHIJLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J
+#define DEF_FIELDS { \
+ 75, 76, 150, 81, 103, 105, 119, 123, 128, 111, 117, 115, 106, 108, 137, 140, 139, 78, 82, 84, \
+ 86, 88, 90, 92, 94, 96, 98, 100, 112, 120, 124, 126, 130, 132, 134, 142, 144, 146, 148, 152, \
+ 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, \
+ 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, \
+ 234, 236, 238, 240, 242, 244 }
#endif
- /* Pre-configured windows/field groups */
-#define JOB_FIELDS "¥¦¹·º(³´Ä»½@<§Å)*+,-./012568>?ABCFGHIJKLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J
-#define MEM_FIELDS "¥º»<½¾¿ÀÁMBNÃD34·Å&'()*+,-./0125689FGHIJKLOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J
-#define USR_FIELDS "¥¦§¨ª°¹·ºÄÅ)+,-./1234568;<=>?@ABCFGHIJKLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J
- // old top fields ( 'a'-'z' ) in positions 0-25
- // other suse old top fields ( '{|' ) in positions 26-27
-#define CVT_FIELDS "%&*'(-0346789:;<=>?@ACDEFGML)+,./125BHIJKNOPQRSTUVWXYZ["
-#define CVT_FLDMAX 28
-
+#define JOB_FIELDS { \
+ 75, 77, 115, 111, 117, 80, 103, 105, 137, 119, 123, 128, 120, 79, 139, 82, 84, 86, 88, 90, \
+ 92, 94, 96, 98, 100, 106, 108, 112, 124, 126, 130, 132, 134, 140, 142, 144, 146, 148, 150, 152, \
+ 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, \
+ 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, \
+ 234, 236, 238, 240, 242, 244 }
+#define MEM_FIELDS { \
+ 75, 117, 119, 120, 123, 125, 127, 129, 131, 154, 132, 156, 135, 136, 102, 104, 111, 139, 76, 78, \
+ 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 106, 108, 112, 114, 140, 142, 144, 146, 148, \
+ 150, 152, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, \
+ 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, \
+ 234, 236, 238, 240, 242, 244 }
+#define USR_FIELDS { \
+ 75, 77, 79, 81, 85, 97, 115, 111, 117, 137, 139, 82, 86, 88, 90, 92, 94, 98, 100, 102, \
+ 104, 106, 108, 112, 118, 120, 122, 124, 126, 128, 130, 132, 134, 140, 142, 144, 146, 148, 150, 152, \
+ 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, \
+ 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, \
+ 234, 236, 238, 240, 242, 244 }
/* The default values for the local config file */
#define DEF_RCFILE { \
#define LOADAV_line "%s -%s\n"
#define LOADAV_line_alt "%s~6 -%s\n"
-
/*###### For Piece of mind #############################################*/
/* just sanity check(s)... */
/* ( see the find_string function for the one true required protoype ) */
/*------ Tiny useful routine(s) ----------------------------------------*/
//atic const char *fmtmk (const char *fmts, ...);
+//atic inline int mlen (const int *mem);
+//atic inline int *msch (const int *mem, int obj, int max);
//atic inline char *scat (char *dst, const char *src);
//atic const char *tg2 (int x, int y);
/*------ Exit/Interrput routines ---------------------------------------*/
//atic inline int osel_matched (const WIN_t *q, FLG_t enu, const char *str);
/*------ Startup routines ----------------------------------------------*/
//atic void before (char *me);
-//atic int config_cvt (WIN_t *q);
//atic int config_insp (FILE *fp, char *buf, size_t size);
//atic int config_osel (FILE *fp, char *buf, size_t size);
//atic const char *configs_file (FILE *fp, const char *name, float *delay);