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