top: code shrink, -26 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-06-06 17:40:54 +02:00
parent 87496aa081
commit d94332f2b6

View File

@ -103,11 +103,11 @@ struct globals {
}; //FIX_ALIASING; - large code growth }; //FIX_ALIASING; - large code growth
enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) }; enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) };
#define G (*(struct globals*)&bb_common_bufsiz1) #define G (*(struct globals*)&bb_common_bufsiz1)
#define INIT_G() do { \ struct BUG_bad_size {
struct G_sizecheck { \ char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
char G_sizecheck[sizeof(G) > COMMON_BUFSIZE ? -1 : 1]; \ char BUG_line_buf_too_small[LINE_BUF_SIZE > 80 ? 1 : -1];
}; \ };
} while (0) #define INIT_G() do { } while (0)
#define top (G.top ) #define top (G.top )
#define ntop (G.ntop ) #define ntop (G.ntop )
#define sort_field (G.sort_field ) #define sort_field (G.sort_field )
@ -705,7 +705,7 @@ static void display_topmem_header(int scr_width, int *lines_rem_p)
MWRITE, ANON, MAP, SLAB, MWRITE, ANON, MAP, SLAB,
NUM_FIELDS NUM_FIELDS
}; };
static const char match[NUM_FIELDS][11] = { static const char match[NUM_FIELDS][12] = {
"\x09" "MemTotal:", // TOTAL "\x09" "MemTotal:", // TOTAL
"\x08" "MemFree:", // MFREE "\x08" "MemFree:", // MFREE
"\x08" "Buffers:", // BUF "\x08" "Buffers:", // BUF
@ -718,52 +718,46 @@ static void display_topmem_header(int scr_width, int *lines_rem_p)
"\x07" "Mapped:", // MAP "\x07" "Mapped:", // MAP
"\x05" "Slab:", // SLAB "\x05" "Slab:", // SLAB
}; };
//TODO? Note that fields always appear in the above order. char meminfo_buf[4 * 1024];
//Thus, as each new line read from /proc/meminfo, we can compare it *once* const char *Z[NUM_FIELDS];
//with match[last_matched+1], instead of looping thru all match[i]'s.
//If it matches, memorize its data and last_matched++ (and if == NUM_FIELDS,
//we're done with reading /proc/meminfo!); otherwise fgets next line.
//The code below is slower, but is robust against a case when /proc/meminfo
//gets reordered in the future.
char Z[NUM_FIELDS][sizeof(long long)*3];
char linebuf[128];
unsigned i; unsigned i;
FILE *fp; int sz;
memset(&Z, 0, sizeof(Z));
for (i = 0; i < NUM_FIELDS; i++) for (i = 0; i < NUM_FIELDS; i++)
Z[i][0] = '?'; Z[i] = "?";
/* read memory info */ /* read memory info */
fp = xfopen_for_read("meminfo"); sz = open_read_close("meminfo", meminfo_buf, sizeof(meminfo_buf) - 1);
while (fgets(linebuf, sizeof(linebuf), fp)) { if (sz >= 0) {
char *p = meminfo_buf;
meminfo_buf[sz] = '\0';
/* Note that fields always appear in the match[] order */
for (i = 0; i < NUM_FIELDS; i++) { for (i = 0; i < NUM_FIELDS; i++) {
unsigned sz = (unsigned char)match[i][0]; char *found = strstr(p, match[i] + 1);
if (strncmp(linebuf, match[i] + 1, sz) == 0) { if (found) {
/* Cut "NNNN" out of " NNNN kb" */ /* Cut "NNNN" out of " NNNN kb" */
char *s = skip_whitespace(linebuf + sz); char *s = skip_whitespace(found + match[i][0]);
skip_non_whitespace(s)[0] = '\0'; p = skip_non_whitespace(s);
safe_strncpy(Z[i], s, sizeof(Z[i])); *p++ = '\0';
break; Z[i] = s;
} }
} }
} }
fclose(fp);
snprintf(linebuf, sizeof(linebuf), snprintf(line_buf, LINE_BUF_SIZE,
"Mem total:%s anon:%s map:%s free:%s", "Mem total:%s anon:%s map:%s free:%s",
Z[TOTAL], Z[ANON], Z[MAP], Z[MFREE]); Z[TOTAL], Z[ANON], Z[MAP], Z[MFREE]);
printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, linebuf); printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, line_buf);
snprintf(linebuf, sizeof(linebuf), snprintf(line_buf, LINE_BUF_SIZE,
" slab:%s buf:%s cache:%s dirty:%s write:%s", " slab:%s buf:%s cache:%s dirty:%s write:%s",
Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]); Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]);
printf("%.*s\n", scr_width, linebuf); printf("%.*s\n", scr_width, line_buf);
snprintf(linebuf, sizeof(linebuf), snprintf(line_buf, LINE_BUF_SIZE,
"Swap total:%s free:%s", // TODO: % used? "Swap total:%s free:%s", // TODO: % used?
Z[SWAPTOTAL], Z[SWAPFREE]); Z[SWAPTOTAL], Z[SWAPFREE]);
printf("%.*s\n", scr_width, linebuf); printf("%.*s\n", scr_width, line_buf);
(*lines_rem_p) -= 3; (*lines_rem_p) -= 3;
} }