|
Packit |
992a25 |
/***********************************************************************
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* This software is part of the ast package *
|
|
Packit |
992a25 |
* Copyright (c) 1985-2011 AT&T Intellectual Property *
|
|
Packit |
992a25 |
* and is licensed under the *
|
|
Packit |
992a25 |
* Eclipse Public License, Version 1.0 *
|
|
Packit |
992a25 |
* by AT&T Intellectual Property *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* A copy of the License is available at *
|
|
Packit |
992a25 |
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
Packit |
992a25 |
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Information and Software Systems Research *
|
|
Packit |
992a25 |
* AT&T Research *
|
|
Packit |
992a25 |
* Florham Park NJ *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Glenn Fowler <gsf@research.att.com> *
|
|
Packit |
992a25 |
* David Korn <dgk@research.att.com> *
|
|
Packit |
992a25 |
* Phong Vo <kpv@research.att.com> *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
***********************************************************************/
|
|
Packit |
992a25 |
#pragma prototyped
|
|
Packit |
992a25 |
/*
|
|
Packit |
992a25 |
* Glenn Fowler
|
|
Packit |
992a25 |
* AT&T Research
|
|
Packit |
992a25 |
*
|
|
Packit |
992a25 |
* return number n scaled to metric multiples of k { 1000 1024 }
|
|
Packit |
992a25 |
* return string length is at most 5 chars + terminating nul
|
|
Packit |
992a25 |
*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#include <ast.h>
|
|
Packit |
992a25 |
#include <lclib.h>
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
char*
|
|
Packit |
992a25 |
fmtscale(register Sfulong_t n, int k)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
register Sfulong_t m;
|
|
Packit |
992a25 |
int r;
|
|
Packit |
992a25 |
int z;
|
|
Packit |
992a25 |
const char* u;
|
|
Packit |
992a25 |
char suf[3];
|
|
Packit |
992a25 |
char* s;
|
|
Packit |
992a25 |
char* buf;
|
|
Packit |
992a25 |
Lc_numeric_t* p = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data;
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
static const char scale[] = "bkMGTPE";
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
u = scale;
|
|
Packit |
992a25 |
if (n < 1000)
|
|
Packit |
992a25 |
r = 0;
|
|
Packit |
992a25 |
else
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
m = 0;
|
|
Packit |
992a25 |
while (n >= k && *(u + 1))
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
m = n;
|
|
Packit |
992a25 |
n /= k;
|
|
Packit |
992a25 |
u++;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
if ((r = (10 * (m % k) + (k / 2)) / k) > 9)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
r = 0;
|
|
Packit |
992a25 |
n++;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
if (k == 1024 && n >= 1000)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
n = 1;
|
|
Packit |
992a25 |
r = 0;
|
|
Packit |
992a25 |
u++;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
buf = fmtbuf(z = 8);
|
|
Packit |
992a25 |
s = suf;
|
|
Packit |
992a25 |
if (u > scale)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
if (k == 1024)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
*s++ = *u == 'k' ? 'K' : *u;
|
|
Packit |
992a25 |
*s++ = 'i';
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
else
|
|
Packit |
992a25 |
*s++ = *u;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
*s = 0;
|
|
Packit |
992a25 |
if (n > 0 && n < 10)
|
|
Packit |
992a25 |
sfsprintf(buf, z, "%I*u%c%d%s", sizeof(n), n, p->decimal >= 0 ? p->decimal : '.', r, suf);
|
|
Packit |
992a25 |
else
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
if (r >= 5)
|
|
Packit |
992a25 |
n++;
|
|
Packit |
992a25 |
sfsprintf(buf, z, "%I*u%s", sizeof(n), n, suf);
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
return buf;
|
|
Packit |
992a25 |
}
|