top: code shrink

text    data     bss     dec     hex filename
 853034     453    6820  860307   d2093 busybox_old
 852726     453    6820  859999   d1f5f busybox_unstripped

Signed-off-by: Maksym Kryzhanovskyy <xmaks@email.cz>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Maksym Kryzhanovskyy 2010-06-06 08:24:39 +02:00 committed by Denys Vlasenko
parent f2177abe1d
commit 87496aa081

View File

@ -696,111 +696,76 @@ static int topmem_sort(char *a, char *b)
return inverted ? -n : n; return inverted ? -n : n;
} }
/* Cut "NNNN" out of " NNNN kb" */
static char *grab_number(char *str, const char *match, unsigned sz)
{
if (strncmp(str, match, sz) == 0) {
str = skip_whitespace(str + sz);
(skip_non_whitespace(str))[0] = '\0';
return xstrdup(str);
}
return NULL;
}
/* display header info (meminfo / loadavg) */ /* display header info (meminfo / loadavg) */
static void display_topmem_header(int scr_width, int *lines_rem_p) static void display_topmem_header(int scr_width, int *lines_rem_p)
{ {
enum {
TOTAL = 0, MFREE, BUF, CACHE,
SWAPTOTAL, SWAPFREE, DIRTY,
MWRITE, ANON, MAP, SLAB,
NUM_FIELDS
};
static const char match[NUM_FIELDS][11] = {
"\x09" "MemTotal:", // TOTAL
"\x08" "MemFree:", // MFREE
"\x08" "Buffers:", // BUF
"\x07" "Cached:", // CACHE
"\x0a" "SwapTotal:", // SWAPTOTAL
"\x09" "SwapFree:", // SWAPFREE
"\x06" "Dirty:", // DIRTY
"\x0a" "Writeback:", // MWRITE
"\x0a" "AnonPages:", // ANON
"\x07" "Mapped:", // MAP
"\x05" "Slab:", // SLAB
};
//TODO? Note that fields always appear in the above order.
//Thus, as each new line read from /proc/meminfo, we can compare it *once*
//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]; char linebuf[128];
unsigned i; unsigned i;
FILE *fp; FILE *fp;
union {
struct {
/* 1 */ char *total;
/* 2 */ char *mfree;
/* 3 */ char *buf;
/* 4 */ char *cache;
/* 5 */ char *swaptotal;
/* 6 */ char *swapfree;
/* 7 */ char *dirty;
/* 8 */ char *mwrite;
/* 9 */ char *anon;
/* 10 */ char *map;
/* 11 */ char *slab;
} u;
char *str[11];
} Z;
#define total Z.u.total
#define mfree Z.u.mfree
#define buf Z.u.buf
#define cache Z.u.cache
#define swaptotal Z.u.swaptotal
#define swapfree Z.u.swapfree
#define dirty Z.u.dirty
#define mwrite Z.u.mwrite
#define anon Z.u.anon
#define map Z.u.map
#define slab Z.u.slab
#define str Z.str
memset(&Z, 0, sizeof(Z)); memset(&Z, 0, sizeof(Z));
for (i = 0; i < NUM_FIELDS; i++)
Z[i][0] = '?';
/* read memory info */ /* read memory info */
fp = xfopen_for_read("meminfo"); fp = xfopen_for_read("meminfo");
while (fgets(linebuf, sizeof(linebuf), fp)) { while (fgets(linebuf, sizeof(linebuf), fp)) {
char *p; for (i = 0; i < NUM_FIELDS; i++) {
unsigned sz = (unsigned char)match[i][0];
#define SCAN(match, name) \ if (strncmp(linebuf, match[i] + 1, sz) == 0) {
p = grab_number(linebuf, match, sizeof(match)-1); \ /* Cut "NNNN" out of " NNNN kb" */
if (p) { name = p; continue; } char *s = skip_whitespace(linebuf + sz);
skip_non_whitespace(s)[0] = '\0';
SCAN("MemTotal:", total); safe_strncpy(Z[i], s, sizeof(Z[i]));
SCAN("MemFree:", mfree); break;
SCAN("Buffers:", buf); }
SCAN("Cached:", cache); }
SCAN("SwapTotal:", swaptotal);
SCAN("SwapFree:", swapfree);
SCAN("Dirty:", dirty);
SCAN("Writeback:", mwrite);
SCAN("AnonPages:", anon);
SCAN("Mapped:", map);
SCAN("Slab:", slab);
#undef SCAN
} }
fclose(fp); fclose(fp);
#define S(s) (s ? s : "0")
snprintf(linebuf, sizeof(linebuf), snprintf(linebuf, sizeof(linebuf),
"Mem total:%s anon:%s map:%s free:%s", "Mem total:%s anon:%s map:%s free:%s",
S(total), S(anon), S(map), S(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, linebuf);
snprintf(linebuf, sizeof(linebuf), snprintf(linebuf, sizeof(linebuf),
" slab:%s buf:%s cache:%s dirty:%s write:%s", " slab:%s buf:%s cache:%s dirty:%s write:%s",
S(slab), S(buf), S(cache), S(dirty), S(mwrite)); Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]);
printf("%.*s\n", scr_width, linebuf); printf("%.*s\n", scr_width, linebuf);
snprintf(linebuf, sizeof(linebuf), snprintf(linebuf, sizeof(linebuf),
"Swap total:%s free:%s", // TODO: % used? "Swap total:%s free:%s", // TODO: % used?
S(swaptotal), S(swapfree)); Z[SWAPTOTAL], Z[SWAPFREE]);
printf("%.*s\n", scr_width, linebuf); printf("%.*s\n", scr_width, linebuf);
(*lines_rem_p) -= 3; (*lines_rem_p) -= 3;
#undef S
for (i = 0; i < ARRAY_SIZE(str); i++)
free(str[i]);
#undef total
#undef free
#undef buf
#undef cache
#undef swaptotal
#undef swapfree
#undef dirty
#undef write
#undef anon
#undef map
#undef slab
#undef str
} }
static void ulltoa6_and_space(unsigned long long ul, char buf[6]) static void ulltoa6_and_space(unsigned long long ul, char buf[6])