free: Fix first column justification
free has for many years had a problem with translated header columns or the first column. This is because printf("-9s", str) doesn't use the wide length of the string but the char length meaning they are mis-aligned. Using the mbstowcs() function to get the wide length and then a precision parameter to append the right number of spaces after the number means we get what we need. References: procps-ng/procps#229 procps-ng/procps#204 procps-ng/procps#206 https://bugs.debian.org/1001689 Signed-off-by: Craig Small <csmall@dropbear.xyz>
This commit is contained in:
parent
50a0d9a56c
commit
9f4db0fb56
1
NEWS
1
NEWS
@ -3,6 +3,7 @@ procps-ng-NEXT
|
||||
* Rename pwait to pidwait
|
||||
* free: Add committed line option merge #25
|
||||
* free: Fix -h --si combined options issue #133, #223
|
||||
* free: Fix first column justification issue #229, #204, #206, Debian #1001689
|
||||
* library: renamed to libproc-2 and reset to 0:0:0
|
||||
* library: add support for accessing smaps_rollup issue #112, #201
|
||||
* library: add support for accessing autogroups
|
||||
|
36
free.c
36
free.c
@ -173,6 +173,30 @@ static void check_unit_set(int *unit_set)
|
||||
*unit_set = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the header columns.
|
||||
* We cannot simply use the second printf because the length of the
|
||||
* translated strings doesn't work with it. Instead we need to find
|
||||
* the wide length of the string and use that.
|
||||
* This method also removes the messy wprintf/printf buffering issues
|
||||
*/
|
||||
#define HC_WIDTH 9
|
||||
static void print_head_col(const char *str)
|
||||
{
|
||||
int len;
|
||||
int spaces = 9;
|
||||
|
||||
len = mbstowcs(NULL, str, 0);
|
||||
if (len < 0)
|
||||
spaces = 9;
|
||||
else if (len < HC_WIDTH)
|
||||
spaces = HC_WIDTH - len;
|
||||
else
|
||||
spaces = 0;
|
||||
|
||||
printf("%s%.*s", str, spaces, " ");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int c, flags = 0, unit_set = 0;
|
||||
@ -343,7 +367,7 @@ int main(int argc, char **argv)
|
||||
printf(_(" total used free shared buff/cache available"));
|
||||
}
|
||||
printf("\n");
|
||||
printf("%-9s", _("Mem:"));
|
||||
print_head_col(_("Mem:"));
|
||||
printf("%11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_TOTAL, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_USED, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_FREE, ul_int), flags, args));
|
||||
@ -366,27 +390,27 @@ int main(int argc, char **argv)
|
||||
* to print the high info, even if it is zero.
|
||||
*/
|
||||
if (flags & FREE_LOHI) {
|
||||
printf("%-9s", _("Low:"));
|
||||
print_head_col(_("Low:"));
|
||||
printf("%11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_LOW_TOTAL, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_LOW_USED, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_LOW_FREE, ul_int), flags, args));
|
||||
printf("\n");
|
||||
|
||||
printf("%-9s", _("High:"));
|
||||
print_head_col( _("High:"));
|
||||
printf("%11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_HIGH_TOTAL, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_HIGH_USED, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_HIGH_FREE, ul_int), flags, args));
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("%-9s", _("Swap:"));
|
||||
print_head_col(_("Swap:"));
|
||||
printf("%11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_SWAP_TOTAL, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_SWAP_USED, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_SWAP_FREE, ul_int), flags, args));
|
||||
printf("\n");
|
||||
|
||||
if (flags & FREE_TOTAL) {
|
||||
printf("%-9s", _("Total:"));
|
||||
print_head_col(_("Total:"));
|
||||
printf("%11s", scale_size(
|
||||
MEMINFO_GET(mem_info, MEMINFO_MEM_TOTAL, ul_int) +
|
||||
MEMINFO_GET(mem_info, MEMINFO_SWAP_TOTAL, ul_int), flags, args));
|
||||
@ -399,7 +423,7 @@ int main(int argc, char **argv)
|
||||
printf("\n");
|
||||
}
|
||||
if (flags & FREE_COMMITTED) {
|
||||
printf("%-9s", _("Comm:"));
|
||||
print_head_col(_("Comm:"));
|
||||
printf("%11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_COMMIT_LIMIT, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(MEMINFO_GET(mem_info, MEMINFO_MEM_COMMITTED_AS, ul_int), flags, args));
|
||||
printf(" %11s", scale_size(
|
||||
|
Loading…
Reference in New Issue
Block a user