-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
James Bottomley
authored and
James Bottomley
committed
Oct 3, 2008
1 parent
7de2ae4
commit 8703566
Showing
4 changed files
with
83 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 114f1ea408944f9515e45aa7452238fb15a1fa00 | ||
refs/heads/master: 3c9f3681d0b4af09c1cbf04f92fdfb72bd81ad7b |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#ifndef _LINUX_STRING_HELPERS_H_ | ||
#define _LINUX_STRING_HELPERS_H_ | ||
|
||
#include <linux/types.h> | ||
|
||
/* Descriptions of the types of units to | ||
* print in */ | ||
enum string_size_units { | ||
STRING_UNITS_10, /* use powers of 10^3 (standard SI) */ | ||
STRING_UNITS_2, /* use binary powers of 2^10 */ | ||
}; | ||
|
||
int string_get_size(u64 size, enum string_size_units units, | ||
char *buf, int len); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Helpers for formatting and printing strings | ||
* | ||
* Copyright 31 August 2008 James Bottomley | ||
*/ | ||
#include <linux/kernel.h> | ||
#include <linux/math64.h> | ||
#include <linux/module.h> | ||
#include <linux/string_helpers.h> | ||
|
||
/** | ||
* string_get_size - get the size in the specified units | ||
* @size: The size to be converted | ||
* @units: units to use (powers of 1000 or 1024) | ||
* @buf: buffer to format to | ||
* @len: length of buffer | ||
* | ||
* This function returns a string formatted to 3 significant figures | ||
* giving the size in the required units. Returns 0 on success or | ||
* error on failure. @buf is always zero terminated. | ||
* | ||
*/ | ||
int string_get_size(u64 size, const enum string_size_units units, | ||
char *buf, int len) | ||
{ | ||
const char *units_10[] = { "B", "KB", "MB", "GB", "TB", "PB", | ||
"EB", "ZB", "YB", NULL}; | ||
const char *units_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB", | ||
"EiB", "ZiB", "YiB", NULL }; | ||
const char **units_str[] = { | ||
[STRING_UNITS_10] = units_10, | ||
[STRING_UNITS_2] = units_2, | ||
}; | ||
const int divisor[] = { | ||
[STRING_UNITS_10] = 1000, | ||
[STRING_UNITS_2] = 1024, | ||
}; | ||
int i, j; | ||
u64 remainder = 0, sf_cap; | ||
char tmp[8]; | ||
|
||
tmp[0] = '\0'; | ||
|
||
for (i = 0; size > divisor[units] && units_str[units][i]; i++) | ||
remainder = do_div(size, divisor[units]); | ||
|
||
sf_cap = size; | ||
for (j = 0; sf_cap*10 < 1000; j++) | ||
sf_cap *= 10; | ||
|
||
if (j) { | ||
remainder *= 1000; | ||
do_div(remainder, divisor[units]); | ||
snprintf(tmp, sizeof(tmp), ".%03lld", | ||
(unsigned long long)remainder); | ||
tmp[j+1] = '\0'; | ||
} | ||
|
||
snprintf(buf, len, "%lld%s%s", (unsigned long long)size, | ||
tmp, units_str[units][i]); | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL(string_get_size); |