diff --git a/top/top.c b/top/top.c index 8d0214d2..3ebe7456 100644 --- a/top/top.c +++ b/top/top.c @@ -311,6 +311,28 @@ static const char *fmtmk (const char *fmts, ...) { } // 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) */ @@ -439,7 +461,7 @@ static void bye_bye (const char *str) { , 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) ); } } @@ -2244,7 +2266,6 @@ static void display_fields (int focus, int extend) { /* 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 '= ' @@ -2284,14 +2305,14 @@ static void fields_utility (void) { #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; @@ -2349,7 +2370,8 @@ signify_that: case 'w': Curwin = w = ('a' == key) ? w->next : w->prev; spewFI - h = p = NULL; + h = NULL; + p = NULL; break; default: // keep gcc happy break; @@ -3560,79 +3582,6 @@ static void before (char *me) { } // 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 */ @@ -3780,7 +3729,7 @@ static const char *configs_file (FILE *fp, const char *name, float *delay) { , &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; @@ -3796,18 +3745,17 @@ static const char *configs_file (FILE *fp, const char *name, float *delay) { *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" @@ -3839,38 +3787,26 @@ static const char *configs_file (FILE *fp, const char *name, float *delay) { 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 @@ -4964,7 +4900,7 @@ static void other_filters (int ch) { static void write_rcfile (void) { FILE *fp; - int i; + int i, j, n; if (Rc_questions) { show_pmt(N_txt(XTRA_warncfg_txt)); @@ -4991,8 +4927,14 @@ static void write_rcfile (void) { , (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 diff --git a/top/top.h b/top/top.h index 773e5d18..3c4255fb 100644 --- a/top/top.h +++ b/top/top.h @@ -226,7 +226,7 @@ enum resize_states { }; /* 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; @@ -316,8 +316,8 @@ typedef struct RCW_t { // the 'window' portion of an rcfile 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 */ @@ -399,12 +399,11 @@ typedef struct WIN_t { #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) @@ -507,33 +506,47 @@ typedef struct WIN_t { #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" -#ifdef ORIG_TOPDEFS -#define DEF_FIELDS "¥¨³´»½ÀÄ·º¹Å&')*+,-./012568<>?ABCFGHIJKLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J -#else -#define DEF_FIELDS "¥&K¨³´»½@·º¹56ÄFÅ')*+,-./0128<>?ABCGHIJLMNOPQRSTUVWXYZ[" RCF_PLUS_H RCF_PLUS_J -#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 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 OLD_FIELDS +#else +#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 +#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 { \ @@ -557,7 +570,6 @@ typedef struct WIN_t { #define LOADAV_line "%s -%s\n" #define LOADAV_line_alt "%s~6 -%s\n" - /*###### For Piece of mind #############################################*/ /* just sanity check(s)... */ @@ -586,6 +598,8 @@ typedef struct WIN_t { /* ( 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 ---------------------------------------*/ @@ -667,7 +681,6 @@ typedef struct WIN_t { //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);