Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 110581
b: refs/heads/master
c: 3c9f368
h: refs/heads/master
i:
  110579: 7b1768f
v: v3
  • Loading branch information
James Bottomley authored and James Bottomley committed Oct 3, 2008
1 parent 7de2ae4 commit 8703566
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 114f1ea408944f9515e45aa7452238fb15a1fa00
refs/heads/master: 3c9f3681d0b4af09c1cbf04f92fdfb72bd81ad7b
16 changes: 16 additions & 0 deletions trunk/include/linux/string_helpers.h
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
3 changes: 2 additions & 1 deletion trunk/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ lib-$(CONFIG_SMP) += cpumask.o
lib-y += kobject.o kref.o klist.o

obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o
bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
string_helpers.o

ifeq ($(CONFIG_DEBUG_KOBJECT),y)
CFLAGS_kobject.o += -DDEBUG
Expand Down
64 changes: 64 additions & 0 deletions trunk/lib/string_helpers.c
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);

0 comments on commit 8703566

Please sign in to comment.