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 scaled number n
1N/A * string width is 5 chars or less
1N/A * if m>1 then n divided by m before scaling
1N/A */
1N/A
1N/A#include <ast.h>
1N/A
1N/Achar*
1N/Afmtnum(register unsigned long n, int m)
1N/A{
1N/A register int i;
1N/A register unsigned long r;
1N/A char* buf;
1N/A int z;
1N/A
1N/A char suf[2];
1N/A
1N/A if (m > 1)
1N/A {
1N/A r = n;
1N/A n /= m;
1N/A r -= n;
1N/A }
1N/A else
1N/A r = 0;
1N/A suf[1] = 0;
1N/A if (n < 1024)
1N/A suf[0] = 0;
1N/A else if (n < 1024 * 1024)
1N/A {
1N/A suf[0] = 'k';
1N/A r = ((n % 1024) * 100) / 1024;
1N/A n /= 1024;
1N/A }
1N/A else if (n < 1024 * 1024 * 1024)
1N/A {
1N/A suf[0] = 'm';
1N/A r = ((n % (1024 * 1024)) * 100) / (1024 * 1024);
1N/A n /= 1024 * 1024;
1N/A }
1N/A else
1N/A {
1N/A suf[0] = 'g';
1N/A r = ((n % (1024 * 1024 * 1024)) * 100) / (1024 * 1024 * 1024);
1N/A n /= 1024 * 1024 * 1024;
1N/A }
1N/A if (r)
1N/A {
1N/A if (n >= 100)
1N/A r = 0;
1N/A else if (n >= 10)
1N/A {
1N/A i = 1;
1N/A if (r >= 10)
1N/A r /= 10;
1N/A }
1N/A else
1N/A i = 2;
1N/A }
1N/A buf = fmtbuf(z = 8);
1N/A if (r)
1N/A sfsprintf(buf, z, "%lu.%0*lu%s", n, i, r, suf);
1N/A else
1N/A sfsprintf(buf, z, "%lu%s", n, suf);
1N/A return buf;
1N/A}