aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksym Kryzhanovskyy <xmaks@email.cz>2010-06-06 08:24:39 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-06-06 08:24:39 +0200
commit87496aa08180cdfffed88f7802e46ab25f659890 (patch)
treef97ad876aef0b87dd8154a6605bf284fce40654f
parentf2177abe1d1da0f845147e29f5565a53d9cba09d (diff)
downloadbusybox-w32-87496aa08180cdfffed88f7802e46ab25f659890.tar.gz
busybox-w32-87496aa08180cdfffed88f7802e46ab25f659890.tar.bz2
busybox-w32-87496aa08180cdfffed88f7802e46ab25f659890.zip
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>
-rw-r--r--procps/top.c119
1 files changed, 42 insertions, 77 deletions
diff --git a/procps/top.c b/procps/top.c
index e4afafc4c..51b167171 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -696,111 +696,76 @@ static int topmem_sort(char *a, char *b)
696 return inverted ? -n : n; 696 return inverted ? -n : n;
697} 697}
698 698
699/* Cut "NNNN" out of " NNNN kb" */
700static char *grab_number(char *str, const char *match, unsigned sz)
701{
702 if (strncmp(str, match, sz) == 0) {
703 str = skip_whitespace(str + sz);
704 (skip_non_whitespace(str))[0] = '\0';
705 return xstrdup(str);
706 }
707 return NULL;
708}
709
710/* display header info (meminfo / loadavg) */ 699/* display header info (meminfo / loadavg) */
711static void display_topmem_header(int scr_width, int *lines_rem_p) 700static void display_topmem_header(int scr_width, int *lines_rem_p)
712{ 701{
702 enum {
703 TOTAL = 0, MFREE, BUF, CACHE,
704 SWAPTOTAL, SWAPFREE, DIRTY,
705 MWRITE, ANON, MAP, SLAB,
706 NUM_FIELDS
707 };
708 static const char match[NUM_FIELDS][11] = {
709 "\x09" "MemTotal:", // TOTAL
710 "\x08" "MemFree:", // MFREE
711 "\x08" "Buffers:", // BUF
712 "\x07" "Cached:", // CACHE
713 "\x0a" "SwapTotal:", // SWAPTOTAL
714 "\x09" "SwapFree:", // SWAPFREE
715 "\x06" "Dirty:", // DIRTY
716 "\x0a" "Writeback:", // MWRITE
717 "\x0a" "AnonPages:", // ANON
718 "\x07" "Mapped:", // MAP
719 "\x05" "Slab:", // SLAB
720 };
721//TODO? Note that fields always appear in the above order.
722//Thus, as each new line read from /proc/meminfo, we can compare it *once*
723//with match[last_matched+1], instead of looping thru all match[i]'s.
724//If it matches, memorize its data and last_matched++ (and if == NUM_FIELDS,
725//we're done with reading /proc/meminfo!); otherwise fgets next line.
726//The code below is slower, but is robust against a case when /proc/meminfo
727//gets reordered in the future.
728 char Z[NUM_FIELDS][sizeof(long long)*3];
713 char linebuf[128]; 729 char linebuf[128];
714 unsigned i; 730 unsigned i;
715 FILE *fp; 731 FILE *fp;
716 union {
717 struct {
718 /* 1 */ char *total;
719 /* 2 */ char *mfree;
720 /* 3 */ char *buf;
721 /* 4 */ char *cache;
722 /* 5 */ char *swaptotal;
723 /* 6 */ char *swapfree;
724 /* 7 */ char *dirty;
725 /* 8 */ char *mwrite;
726 /* 9 */ char *anon;
727 /* 10 */ char *map;
728 /* 11 */ char *slab;
729 } u;
730 char *str[11];
731 } Z;
732#define total Z.u.total
733#define mfree Z.u.mfree
734#define buf Z.u.buf
735#define cache Z.u.cache
736#define swaptotal Z.u.swaptotal
737#define swapfree Z.u.swapfree
738#define dirty Z.u.dirty
739#define mwrite Z.u.mwrite
740#define anon Z.u.anon
741#define map Z.u.map
742#define slab Z.u.slab
743#define str Z.str
744 732
745 memset(&Z, 0, sizeof(Z)); 733 memset(&Z, 0, sizeof(Z));
734 for (i = 0; i < NUM_FIELDS; i++)
735 Z[i][0] = '?';
746 736
747 /* read memory info */ 737 /* read memory info */
748 fp = xfopen_for_read("meminfo"); 738 fp = xfopen_for_read("meminfo");
749 while (fgets(linebuf, sizeof(linebuf), fp)) { 739 while (fgets(linebuf, sizeof(linebuf), fp)) {
750 char *p; 740 for (i = 0; i < NUM_FIELDS; i++) {
751 741 unsigned sz = (unsigned char)match[i][0];
752#define SCAN(match, name) \ 742 if (strncmp(linebuf, match[i] + 1, sz) == 0) {
753 p = grab_number(linebuf, match, sizeof(match)-1); \ 743 /* Cut "NNNN" out of " NNNN kb" */
754 if (p) { name = p; continue; } 744 char *s = skip_whitespace(linebuf + sz);
755 745 skip_non_whitespace(s)[0] = '\0';
756 SCAN("MemTotal:", total); 746 safe_strncpy(Z[i], s, sizeof(Z[i]));
757 SCAN("MemFree:", mfree); 747 break;
758 SCAN("Buffers:", buf); 748 }
759 SCAN("Cached:", cache); 749 }
760 SCAN("SwapTotal:", swaptotal);
761 SCAN("SwapFree:", swapfree);
762 SCAN("Dirty:", dirty);
763 SCAN("Writeback:", mwrite);
764 SCAN("AnonPages:", anon);
765 SCAN("Mapped:", map);
766 SCAN("Slab:", slab);
767#undef SCAN
768 } 750 }
769 fclose(fp); 751 fclose(fp);
770 752
771#define S(s) (s ? s : "0")
772 snprintf(linebuf, sizeof(linebuf), 753 snprintf(linebuf, sizeof(linebuf),
773 "Mem total:%s anon:%s map:%s free:%s", 754 "Mem total:%s anon:%s map:%s free:%s",
774 S(total), S(anon), S(map), S(mfree)); 755 Z[TOTAL], Z[ANON], Z[MAP], Z[MFREE]);
775 printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, linebuf); 756 printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, linebuf);
776 757
777 snprintf(linebuf, sizeof(linebuf), 758 snprintf(linebuf, sizeof(linebuf),
778 " slab:%s buf:%s cache:%s dirty:%s write:%s", 759 " slab:%s buf:%s cache:%s dirty:%s write:%s",
779 S(slab), S(buf), S(cache), S(dirty), S(mwrite)); 760 Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]);
780 printf("%.*s\n", scr_width, linebuf); 761 printf("%.*s\n", scr_width, linebuf);
781 762
782 snprintf(linebuf, sizeof(linebuf), 763 snprintf(linebuf, sizeof(linebuf),
783 "Swap total:%s free:%s", // TODO: % used? 764 "Swap total:%s free:%s", // TODO: % used?
784 S(swaptotal), S(swapfree)); 765 Z[SWAPTOTAL], Z[SWAPFREE]);
785 printf("%.*s\n", scr_width, linebuf); 766 printf("%.*s\n", scr_width, linebuf);
786 767
787 (*lines_rem_p) -= 3; 768 (*lines_rem_p) -= 3;
788#undef S
789
790 for (i = 0; i < ARRAY_SIZE(str); i++)
791 free(str[i]);
792#undef total
793#undef free
794#undef buf
795#undef cache
796#undef swaptotal
797#undef swapfree
798#undef dirty
799#undef write
800#undef anon
801#undef map
802#undef slab
803#undef str
804} 769}
805 770
806static void ulltoa6_and_space(unsigned long long ul, char buf[6]) 771static void ulltoa6_and_space(unsigned long long ul, char buf[6])