xref: /aosp_15_r20/external/iperf3/src/units.c (revision 7ab6e6ace082586527a400463bc693a412a40341)
1*7ab6e6acSAndroid Build Coastguard Worker /*---------------------------------------------------------------
2*7ab6e6acSAndroid Build Coastguard Worker  * Copyright (c) 1999,2000,2001,2002,2003
3*7ab6e6acSAndroid Build Coastguard Worker  * The Board of Trustees of the University of Illinois
4*7ab6e6acSAndroid Build Coastguard Worker  * All Rights Reserved.
5*7ab6e6acSAndroid Build Coastguard Worker  *---------------------------------------------------------------
6*7ab6e6acSAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person
7*7ab6e6acSAndroid Build Coastguard Worker  * obtaining a copy of this software (Iperf) and associated
8*7ab6e6acSAndroid Build Coastguard Worker  * documentation files (the "Software"), to deal in the Software
9*7ab6e6acSAndroid Build Coastguard Worker  * without restriction, including without limitation the
10*7ab6e6acSAndroid Build Coastguard Worker  * rights to use, copy, modify, merge, publish, distribute,
11*7ab6e6acSAndroid Build Coastguard Worker  * sublicense, and/or sell copies of the Software, and to permit
12*7ab6e6acSAndroid Build Coastguard Worker  * persons to whom the Software is furnished to do
13*7ab6e6acSAndroid Build Coastguard Worker  * so, subject to the following conditions:
14*7ab6e6acSAndroid Build Coastguard Worker  *
15*7ab6e6acSAndroid Build Coastguard Worker  *
16*7ab6e6acSAndroid Build Coastguard Worker  * Redistributions of source code must retain the above
17*7ab6e6acSAndroid Build Coastguard Worker  * copyright notice, this list of conditions and
18*7ab6e6acSAndroid Build Coastguard Worker  * the following disclaimers.
19*7ab6e6acSAndroid Build Coastguard Worker  *
20*7ab6e6acSAndroid Build Coastguard Worker  *
21*7ab6e6acSAndroid Build Coastguard Worker  * Redistributions in binary form must reproduce the above
22*7ab6e6acSAndroid Build Coastguard Worker  * copyright notice, this list of conditions and the following
23*7ab6e6acSAndroid Build Coastguard Worker  * disclaimers in the documentation and/or other materials
24*7ab6e6acSAndroid Build Coastguard Worker  * provided with the distribution.
25*7ab6e6acSAndroid Build Coastguard Worker  *
26*7ab6e6acSAndroid Build Coastguard Worker  *
27*7ab6e6acSAndroid Build Coastguard Worker  * Neither the names of the University of Illinois, NCSA,
28*7ab6e6acSAndroid Build Coastguard Worker  * nor the names of its contributors may be used to endorse
29*7ab6e6acSAndroid Build Coastguard Worker  * or promote products derived from this Software without
30*7ab6e6acSAndroid Build Coastguard Worker  * specific prior written permission.
31*7ab6e6acSAndroid Build Coastguard Worker  *
32*7ab6e6acSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
33*7ab6e6acSAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
34*7ab6e6acSAndroid Build Coastguard Worker  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
35*7ab6e6acSAndroid Build Coastguard Worker  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT
36*7ab6e6acSAndroid Build Coastguard Worker  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
37*7ab6e6acSAndroid Build Coastguard Worker  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
38*7ab6e6acSAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE
39*7ab6e6acSAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
40*7ab6e6acSAndroid Build Coastguard Worker  * ________________________________________________________________
41*7ab6e6acSAndroid Build Coastguard Worker  * National Laboratory for Applied Network Research
42*7ab6e6acSAndroid Build Coastguard Worker  * National Center for Supercomputing Applications
43*7ab6e6acSAndroid Build Coastguard Worker  * University of Illinois at Urbana-Champaign
44*7ab6e6acSAndroid Build Coastguard Worker  * http://www.ncsa.uiuc.edu
45*7ab6e6acSAndroid Build Coastguard Worker  * ________________________________________________________________
46*7ab6e6acSAndroid Build Coastguard Worker  *
47*7ab6e6acSAndroid Build Coastguard Worker  * stdio.c
48*7ab6e6acSAndroid Build Coastguard Worker  * by Mark Gates <[email protected]>
49*7ab6e6acSAndroid Build Coastguard Worker  * and Ajay Tirumalla <[email protected]>
50*7ab6e6acSAndroid Build Coastguard Worker  * -------------------------------------------------------------------
51*7ab6e6acSAndroid Build Coastguard Worker  * input and output numbers, converting with kilo, mega, giga, tera
52*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
53*7ab6e6acSAndroid Build Coastguard Worker 
54*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
55*7ab6e6acSAndroid Build Coastguard Worker #include <assert.h>
56*7ab6e6acSAndroid Build Coastguard Worker #include <ctype.h>
57*7ab6e6acSAndroid Build Coastguard Worker #ifdef HAVE_STDINT_H
58*7ab6e6acSAndroid Build Coastguard Worker #include <stdint.h>
59*7ab6e6acSAndroid Build Coastguard Worker #endif
60*7ab6e6acSAndroid Build Coastguard Worker #include <sys/socket.h>
61*7ab6e6acSAndroid Build Coastguard Worker #include <sys/types.h>
62*7ab6e6acSAndroid Build Coastguard Worker #include <sys/time.h>
63*7ab6e6acSAndroid Build Coastguard Worker 
64*7ab6e6acSAndroid Build Coastguard Worker 
65*7ab6e6acSAndroid Build Coastguard Worker #include "iperf.h"
66*7ab6e6acSAndroid Build Coastguard Worker 
67*7ab6e6acSAndroid Build Coastguard Worker #ifdef __cplusplus
68*7ab6e6acSAndroid Build Coastguard Worker extern    "C"
69*7ab6e6acSAndroid Build Coastguard Worker {
70*7ab6e6acSAndroid Build Coastguard Worker #endif
71*7ab6e6acSAndroid Build Coastguard Worker 
72*7ab6e6acSAndroid Build Coastguard Worker     const double KILO_UNIT = 1024.0;
73*7ab6e6acSAndroid Build Coastguard Worker     const double MEGA_UNIT = 1024.0 * 1024.0;
74*7ab6e6acSAndroid Build Coastguard Worker     const double GIGA_UNIT = 1024.0 * 1024.0 * 1024.0;
75*7ab6e6acSAndroid Build Coastguard Worker     const double TERA_UNIT = 1024.0 * 1024.0 * 1024.0 * 1024.0;
76*7ab6e6acSAndroid Build Coastguard Worker 
77*7ab6e6acSAndroid Build Coastguard Worker     const double KILO_RATE_UNIT = 1000.0;
78*7ab6e6acSAndroid Build Coastguard Worker     const double MEGA_RATE_UNIT = 1000.0 * 1000.0;
79*7ab6e6acSAndroid Build Coastguard Worker     const double GIGA_RATE_UNIT = 1000.0 * 1000.0 * 1000.0;
80*7ab6e6acSAndroid Build Coastguard Worker     const double TERA_RATE_UNIT = 1000.0 * 1000.0 * 1000.0 * 1000.0;
81*7ab6e6acSAndroid Build Coastguard Worker 
82*7ab6e6acSAndroid Build Coastguard Worker /* -------------------------------------------------------------------
83*7ab6e6acSAndroid Build Coastguard Worker  * unit_atof
84*7ab6e6acSAndroid Build Coastguard Worker  *
85*7ab6e6acSAndroid Build Coastguard Worker  * Given a string of form #x where # is a number and x is a format
86*7ab6e6acSAndroid Build Coastguard Worker  * character listed below, this returns the interpreted integer.
87*7ab6e6acSAndroid Build Coastguard Worker  * Gg, Mm, Kk are giga, mega, kilo respectively
88*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
89*7ab6e6acSAndroid Build Coastguard Worker 
unit_atof(const char * s)90*7ab6e6acSAndroid Build Coastguard Worker     double    unit_atof(const char *s)
91*7ab6e6acSAndroid Build Coastguard Worker     {
92*7ab6e6acSAndroid Build Coastguard Worker 	double    n;
93*7ab6e6acSAndroid Build Coastguard Worker 	char      suffix = '\0';
94*7ab6e6acSAndroid Build Coastguard Worker 
95*7ab6e6acSAndroid Build Coastguard Worker 	          assert(s != NULL);
96*7ab6e6acSAndroid Build Coastguard Worker 
97*7ab6e6acSAndroid Build Coastguard Worker 	/* scan the number and any suffices */
98*7ab6e6acSAndroid Build Coastguard Worker 	          sscanf(s, "%lf%c", &n, &suffix);
99*7ab6e6acSAndroid Build Coastguard Worker 
100*7ab6e6acSAndroid Build Coastguard Worker 	/* convert according to [Tt Gg Mm Kk] */
101*7ab6e6acSAndroid Build Coastguard Worker 	switch    (suffix)
102*7ab6e6acSAndroid Build Coastguard Worker 	{
103*7ab6e6acSAndroid Build Coastguard Worker 	case 't': case 'T':
104*7ab6e6acSAndroid Build Coastguard Worker 	    n *= TERA_UNIT;
105*7ab6e6acSAndroid Build Coastguard Worker 	    break;
106*7ab6e6acSAndroid Build Coastguard Worker 	case 'g': case 'G':
107*7ab6e6acSAndroid Build Coastguard Worker 	    n *= GIGA_UNIT;
108*7ab6e6acSAndroid Build Coastguard Worker 	    break;
109*7ab6e6acSAndroid Build Coastguard Worker 	case 'm': case 'M':
110*7ab6e6acSAndroid Build Coastguard Worker 	    n *= MEGA_UNIT;
111*7ab6e6acSAndroid Build Coastguard Worker 	    break;
112*7ab6e6acSAndroid Build Coastguard Worker 	case 'k': case 'K':
113*7ab6e6acSAndroid Build Coastguard Worker 	    n *= KILO_UNIT;
114*7ab6e6acSAndroid Build Coastguard Worker 	    break;
115*7ab6e6acSAndroid Build Coastguard Worker 	default:
116*7ab6e6acSAndroid Build Coastguard Worker 	    break;
117*7ab6e6acSAndroid Build Coastguard Worker 	}
118*7ab6e6acSAndroid Build Coastguard Worker 	          return n;
119*7ab6e6acSAndroid Build Coastguard Worker     }				/* end unit_atof */
120*7ab6e6acSAndroid Build Coastguard Worker 
121*7ab6e6acSAndroid Build Coastguard Worker 
122*7ab6e6acSAndroid Build Coastguard Worker /* -------------------------------------------------------------------
123*7ab6e6acSAndroid Build Coastguard Worker  * unit_atof_rate
124*7ab6e6acSAndroid Build Coastguard Worker  *
125*7ab6e6acSAndroid Build Coastguard Worker  * Similar to unit_atof, but uses 10-based rather than 2-based
126*7ab6e6acSAndroid Build Coastguard Worker  * suffixes.
127*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
128*7ab6e6acSAndroid Build Coastguard Worker 
unit_atof_rate(const char * s)129*7ab6e6acSAndroid Build Coastguard Worker     double    unit_atof_rate(const char *s)
130*7ab6e6acSAndroid Build Coastguard Worker     {
131*7ab6e6acSAndroid Build Coastguard Worker 	double    n;
132*7ab6e6acSAndroid Build Coastguard Worker 	char      suffix = '\0';
133*7ab6e6acSAndroid Build Coastguard Worker 
134*7ab6e6acSAndroid Build Coastguard Worker 	          assert(s != NULL);
135*7ab6e6acSAndroid Build Coastguard Worker 
136*7ab6e6acSAndroid Build Coastguard Worker 	/* scan the number and any suffices */
137*7ab6e6acSAndroid Build Coastguard Worker 	          sscanf(s, "%lf%c", &n, &suffix);
138*7ab6e6acSAndroid Build Coastguard Worker 
139*7ab6e6acSAndroid Build Coastguard Worker 	/* convert according to [Tt Gg Mm Kk] */
140*7ab6e6acSAndroid Build Coastguard Worker 	switch    (suffix)
141*7ab6e6acSAndroid Build Coastguard Worker 	{
142*7ab6e6acSAndroid Build Coastguard Worker 	case 't': case 'T':
143*7ab6e6acSAndroid Build Coastguard Worker 	    n *= TERA_RATE_UNIT;
144*7ab6e6acSAndroid Build Coastguard Worker 	    break;
145*7ab6e6acSAndroid Build Coastguard Worker 	case 'g': case 'G':
146*7ab6e6acSAndroid Build Coastguard Worker 	    n *= GIGA_RATE_UNIT;
147*7ab6e6acSAndroid Build Coastguard Worker 	    break;
148*7ab6e6acSAndroid Build Coastguard Worker 	case 'm': case 'M':
149*7ab6e6acSAndroid Build Coastguard Worker 	    n *= MEGA_RATE_UNIT;
150*7ab6e6acSAndroid Build Coastguard Worker 	    break;
151*7ab6e6acSAndroid Build Coastguard Worker 	case 'k': case 'K':
152*7ab6e6acSAndroid Build Coastguard Worker 	    n *= KILO_RATE_UNIT;
153*7ab6e6acSAndroid Build Coastguard Worker 	    break;
154*7ab6e6acSAndroid Build Coastguard Worker 	default:
155*7ab6e6acSAndroid Build Coastguard Worker 	    break;
156*7ab6e6acSAndroid Build Coastguard Worker 	}
157*7ab6e6acSAndroid Build Coastguard Worker 	          return n;
158*7ab6e6acSAndroid Build Coastguard Worker     }				/* end unit_atof_rate */
159*7ab6e6acSAndroid Build Coastguard Worker 
160*7ab6e6acSAndroid Build Coastguard Worker 
161*7ab6e6acSAndroid Build Coastguard Worker 
162*7ab6e6acSAndroid Build Coastguard Worker /* -------------------------------------------------------------------
163*7ab6e6acSAndroid Build Coastguard Worker  * unit_atoi
164*7ab6e6acSAndroid Build Coastguard Worker  *
165*7ab6e6acSAndroid Build Coastguard Worker  * Given a string of form #x where # is a number and x is a format
166*7ab6e6acSAndroid Build Coastguard Worker  * character listed below, this returns the interpreted integer.
167*7ab6e6acSAndroid Build Coastguard Worker  * Tt, Gg, Mm, Kk are tera, giga, mega, kilo respectively
168*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
169*7ab6e6acSAndroid Build Coastguard Worker 
unit_atoi(const char * s)170*7ab6e6acSAndroid Build Coastguard Worker     iperf_size_t unit_atoi(const char *s)
171*7ab6e6acSAndroid Build Coastguard Worker     {
172*7ab6e6acSAndroid Build Coastguard Worker 	double    n;
173*7ab6e6acSAndroid Build Coastguard Worker 	char      suffix = '\0';
174*7ab6e6acSAndroid Build Coastguard Worker 
175*7ab6e6acSAndroid Build Coastguard Worker 	          assert(s != NULL);
176*7ab6e6acSAndroid Build Coastguard Worker 
177*7ab6e6acSAndroid Build Coastguard Worker 	/* scan the number and any suffices */
178*7ab6e6acSAndroid Build Coastguard Worker 	          sscanf(s, "%lf%c", &n, &suffix);
179*7ab6e6acSAndroid Build Coastguard Worker 
180*7ab6e6acSAndroid Build Coastguard Worker 	/* convert according to [Tt Gg Mm Kk] */
181*7ab6e6acSAndroid Build Coastguard Worker 	switch    (suffix)
182*7ab6e6acSAndroid Build Coastguard Worker 	{
183*7ab6e6acSAndroid Build Coastguard Worker 	case 't': case 'T':
184*7ab6e6acSAndroid Build Coastguard Worker 	    n *= TERA_UNIT;
185*7ab6e6acSAndroid Build Coastguard Worker 	    break;
186*7ab6e6acSAndroid Build Coastguard Worker 	case 'g': case 'G':
187*7ab6e6acSAndroid Build Coastguard Worker 	    n *= GIGA_UNIT;
188*7ab6e6acSAndroid Build Coastguard Worker 	    break;
189*7ab6e6acSAndroid Build Coastguard Worker 	case 'm': case 'M':
190*7ab6e6acSAndroid Build Coastguard Worker 	    n *= MEGA_UNIT;
191*7ab6e6acSAndroid Build Coastguard Worker 	    break;
192*7ab6e6acSAndroid Build Coastguard Worker 	case 'k': case 'K':
193*7ab6e6acSAndroid Build Coastguard Worker 	    n *= KILO_UNIT;
194*7ab6e6acSAndroid Build Coastguard Worker 	    break;
195*7ab6e6acSAndroid Build Coastguard Worker 	default:
196*7ab6e6acSAndroid Build Coastguard Worker 	    break;
197*7ab6e6acSAndroid Build Coastguard Worker 	}
198*7ab6e6acSAndroid Build Coastguard Worker 	          return (iperf_size_t) n;
199*7ab6e6acSAndroid Build Coastguard Worker     }				/* end unit_atof */
200*7ab6e6acSAndroid Build Coastguard Worker 
201*7ab6e6acSAndroid Build Coastguard Worker /* -------------------------------------------------------------------
202*7ab6e6acSAndroid Build Coastguard Worker  * constants for byte_printf
203*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
204*7ab6e6acSAndroid Build Coastguard Worker 
205*7ab6e6acSAndroid Build Coastguard Worker /* used as indices into conversion_bytes[], label_byte[], and label_bit[] */
206*7ab6e6acSAndroid Build Coastguard Worker     enum
207*7ab6e6acSAndroid Build Coastguard Worker     {
208*7ab6e6acSAndroid Build Coastguard Worker 	UNIT_CONV,
209*7ab6e6acSAndroid Build Coastguard Worker 	KILO_CONV,
210*7ab6e6acSAndroid Build Coastguard Worker 	MEGA_CONV,
211*7ab6e6acSAndroid Build Coastguard Worker 	GIGA_CONV,
212*7ab6e6acSAndroid Build Coastguard Worker 	TERA_CONV
213*7ab6e6acSAndroid Build Coastguard Worker     };
214*7ab6e6acSAndroid Build Coastguard Worker 
215*7ab6e6acSAndroid Build Coastguard Worker /* factor to multiply the number by */
216*7ab6e6acSAndroid Build Coastguard Worker     const double conversion_bytes[] =
217*7ab6e6acSAndroid Build Coastguard Worker     {
218*7ab6e6acSAndroid Build Coastguard Worker 	1.0,			/* unit */
219*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1024,		/* kilo */
220*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1024 / 1024,	/* mega */
221*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1024 / 1024 / 1024, /* giga */
222*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1024 / 1024 / 1024 / 1024 /* tera */
223*7ab6e6acSAndroid Build Coastguard Worker     };
224*7ab6e6acSAndroid Build Coastguard Worker 
225*7ab6e6acSAndroid Build Coastguard Worker /* factor to multiply the number by for bits*/
226*7ab6e6acSAndroid Build Coastguard Worker     const double conversion_bits[] =
227*7ab6e6acSAndroid Build Coastguard Worker     {
228*7ab6e6acSAndroid Build Coastguard Worker 	1.0,			/* unit */
229*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1000,		/* kilo */
230*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1000 / 1000,	/* mega */
231*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1000 / 1000 / 1000, /* giga */
232*7ab6e6acSAndroid Build Coastguard Worker 	1.0 / 1000 / 1000 / 1000 / 1000 /* tera */
233*7ab6e6acSAndroid Build Coastguard Worker     };
234*7ab6e6acSAndroid Build Coastguard Worker 
235*7ab6e6acSAndroid Build Coastguard Worker 
236*7ab6e6acSAndroid Build Coastguard Worker /* labels for Byte formats [KMGT] */
237*7ab6e6acSAndroid Build Coastguard Worker     const char *label_byte[] =
238*7ab6e6acSAndroid Build Coastguard Worker     {
239*7ab6e6acSAndroid Build Coastguard Worker 	"Byte",
240*7ab6e6acSAndroid Build Coastguard Worker 	"KByte",
241*7ab6e6acSAndroid Build Coastguard Worker 	"MByte",
242*7ab6e6acSAndroid Build Coastguard Worker 	"GByte",
243*7ab6e6acSAndroid Build Coastguard Worker 	"TByte"
244*7ab6e6acSAndroid Build Coastguard Worker     };
245*7ab6e6acSAndroid Build Coastguard Worker 
246*7ab6e6acSAndroid Build Coastguard Worker /* labels for bit formats [kmgt] */
247*7ab6e6acSAndroid Build Coastguard Worker     const char *label_bit[] =
248*7ab6e6acSAndroid Build Coastguard Worker     {
249*7ab6e6acSAndroid Build Coastguard Worker 	"bit",
250*7ab6e6acSAndroid Build Coastguard Worker 	"Kbit",
251*7ab6e6acSAndroid Build Coastguard Worker 	"Mbit",
252*7ab6e6acSAndroid Build Coastguard Worker 	"Gbit",
253*7ab6e6acSAndroid Build Coastguard Worker 	"Tbit"
254*7ab6e6acSAndroid Build Coastguard Worker     };
255*7ab6e6acSAndroid Build Coastguard Worker 
256*7ab6e6acSAndroid Build Coastguard Worker /* -------------------------------------------------------------------
257*7ab6e6acSAndroid Build Coastguard Worker  * unit_snprintf
258*7ab6e6acSAndroid Build Coastguard Worker  *
259*7ab6e6acSAndroid Build Coastguard Worker  * Given a number in bytes and a format, converts the number and
260*7ab6e6acSAndroid Build Coastguard Worker  * prints it out with a bits or bytes label.
261*7ab6e6acSAndroid Build Coastguard Worker  *   B, K, M, G, A for Byte, Kbyte, Mbyte, Gbyte, adaptive byte
262*7ab6e6acSAndroid Build Coastguard Worker  *   b, k, m, g, a for bit,  Kbit,  Mbit,  Gbit,  adaptive bit
263*7ab6e6acSAndroid Build Coastguard Worker  * adaptive picks the "best" one based on the number.
264*7ab6e6acSAndroid Build Coastguard Worker  * s should be at least 11 chars long
265*7ab6e6acSAndroid Build Coastguard Worker  * (4 digits + space + 5 chars max + null)
266*7ab6e6acSAndroid Build Coastguard Worker  * ------------------------------------------------------------------- */
267*7ab6e6acSAndroid Build Coastguard Worker 
unit_snprintf(char * s,int inLen,double inNum,char inFormat)268*7ab6e6acSAndroid Build Coastguard Worker     void      unit_snprintf(char *s, int inLen,
269*7ab6e6acSAndroid Build Coastguard Worker 			              double inNum, char inFormat)
270*7ab6e6acSAndroid Build Coastguard Worker     {
271*7ab6e6acSAndroid Build Coastguard Worker 	int       conv;
272*7ab6e6acSAndroid Build Coastguard Worker 	const char *suffix;
273*7ab6e6acSAndroid Build Coastguard Worker 	const char *format;
274*7ab6e6acSAndroid Build Coastguard Worker 
275*7ab6e6acSAndroid Build Coastguard Worker 	/* convert to bits for [bkmga] */
276*7ab6e6acSAndroid Build Coastguard Worker 	if        (!isupper((int) inFormat))
277*7ab6e6acSAndroid Build Coastguard Worker 	{
278*7ab6e6acSAndroid Build Coastguard Worker 	    inNum *= 8;
279*7ab6e6acSAndroid Build Coastguard Worker 	}
280*7ab6e6acSAndroid Build Coastguard Worker 	switch    (toupper((u_char)inFormat))
281*7ab6e6acSAndroid Build Coastguard Worker 	{
282*7ab6e6acSAndroid Build Coastguard Worker 	case 'B':
283*7ab6e6acSAndroid Build Coastguard Worker 	    conv = UNIT_CONV;
284*7ab6e6acSAndroid Build Coastguard Worker 	    break;
285*7ab6e6acSAndroid Build Coastguard Worker 	case 'K':
286*7ab6e6acSAndroid Build Coastguard Worker 	    conv = KILO_CONV;
287*7ab6e6acSAndroid Build Coastguard Worker 	    break;
288*7ab6e6acSAndroid Build Coastguard Worker 	case 'M':
289*7ab6e6acSAndroid Build Coastguard Worker 	    conv = MEGA_CONV;
290*7ab6e6acSAndroid Build Coastguard Worker 	    break;
291*7ab6e6acSAndroid Build Coastguard Worker 	case 'G':
292*7ab6e6acSAndroid Build Coastguard Worker 	    conv = GIGA_CONV;
293*7ab6e6acSAndroid Build Coastguard Worker 	    break;
294*7ab6e6acSAndroid Build Coastguard Worker 	case 'T':
295*7ab6e6acSAndroid Build Coastguard Worker 	    conv = TERA_CONV;
296*7ab6e6acSAndroid Build Coastguard Worker 	    break;
297*7ab6e6acSAndroid Build Coastguard Worker 
298*7ab6e6acSAndroid Build Coastguard Worker 	default:
299*7ab6e6acSAndroid Build Coastguard Worker 	case 'A':
300*7ab6e6acSAndroid Build Coastguard Worker 	    {
301*7ab6e6acSAndroid Build Coastguard Worker 		double    tmpNum = inNum;
302*7ab6e6acSAndroid Build Coastguard Worker 		conv = UNIT_CONV;
303*7ab6e6acSAndroid Build Coastguard Worker 
304*7ab6e6acSAndroid Build Coastguard Worker 		if (isupper((int) inFormat))
305*7ab6e6acSAndroid Build Coastguard Worker 		{
306*7ab6e6acSAndroid Build Coastguard Worker 		    while (tmpNum >= 1024.0 && conv < TERA_CONV)
307*7ab6e6acSAndroid Build Coastguard Worker 		    {
308*7ab6e6acSAndroid Build Coastguard Worker 			tmpNum /= 1024.0;
309*7ab6e6acSAndroid Build Coastguard Worker 			conv++;
310*7ab6e6acSAndroid Build Coastguard Worker 		    }
311*7ab6e6acSAndroid Build Coastguard Worker 		} else
312*7ab6e6acSAndroid Build Coastguard Worker 		{
313*7ab6e6acSAndroid Build Coastguard Worker 		    while (tmpNum >= 1000.0 && conv < TERA_CONV)
314*7ab6e6acSAndroid Build Coastguard Worker 		    {
315*7ab6e6acSAndroid Build Coastguard Worker 			tmpNum /= 1000.0;
316*7ab6e6acSAndroid Build Coastguard Worker 			conv++;
317*7ab6e6acSAndroid Build Coastguard Worker 		    }
318*7ab6e6acSAndroid Build Coastguard Worker 		}
319*7ab6e6acSAndroid Build Coastguard Worker 		break;
320*7ab6e6acSAndroid Build Coastguard Worker 	    }
321*7ab6e6acSAndroid Build Coastguard Worker 	}
322*7ab6e6acSAndroid Build Coastguard Worker 
323*7ab6e6acSAndroid Build Coastguard Worker 	if (!isupper((int) inFormat))
324*7ab6e6acSAndroid Build Coastguard Worker 	{
325*7ab6e6acSAndroid Build Coastguard Worker 	    inNum *= conversion_bits[conv];
326*7ab6e6acSAndroid Build Coastguard Worker 	    suffix = label_bit[conv];
327*7ab6e6acSAndroid Build Coastguard Worker 	} else
328*7ab6e6acSAndroid Build Coastguard Worker 	{
329*7ab6e6acSAndroid Build Coastguard Worker 	    inNum *= conversion_bytes[conv];
330*7ab6e6acSAndroid Build Coastguard Worker 	    suffix = label_byte[conv];
331*7ab6e6acSAndroid Build Coastguard Worker 	}
332*7ab6e6acSAndroid Build Coastguard Worker 
333*7ab6e6acSAndroid Build Coastguard Worker 	/* print such that we always fit in 4 places */
334*7ab6e6acSAndroid Build Coastguard Worker 	if (inNum < 9.995)
335*7ab6e6acSAndroid Build Coastguard Worker 	{			/* 9.995 would be rounded to 10.0 */
336*7ab6e6acSAndroid Build Coastguard Worker 	    format = "%4.2f %s";/* #.## */
337*7ab6e6acSAndroid Build Coastguard Worker 	} else if (inNum < 99.95)
338*7ab6e6acSAndroid Build Coastguard Worker 	{			/* 99.95 would be rounded to 100 */
339*7ab6e6acSAndroid Build Coastguard Worker 	    format = "%4.1f %s";/* ##.# */
340*7ab6e6acSAndroid Build Coastguard Worker 	} else if (inNum < 999.5)
341*7ab6e6acSAndroid Build Coastguard Worker 	{			/* 999.5 would be rounded to 1000 */
342*7ab6e6acSAndroid Build Coastguard Worker 	    format = "%4.0f %s";/* ### */
343*7ab6e6acSAndroid Build Coastguard Worker 	} else
344*7ab6e6acSAndroid Build Coastguard Worker 	{			/* 1000-1024 fits in 4 places If not using
345*7ab6e6acSAndroid Build Coastguard Worker 				 * Adaptive sizes then this code will not
346*7ab6e6acSAndroid Build Coastguard Worker 				 * control spaces */
347*7ab6e6acSAndroid Build Coastguard Worker 	    format = "%4.0f %s";/* #### */
348*7ab6e6acSAndroid Build Coastguard Worker 	}
349*7ab6e6acSAndroid Build Coastguard Worker 	snprintf(s, inLen, format, inNum, suffix);
350*7ab6e6acSAndroid Build Coastguard Worker     }				/* end unit_snprintf */
351*7ab6e6acSAndroid Build Coastguard Worker 
352*7ab6e6acSAndroid Build Coastguard Worker #ifdef __cplusplus
353*7ab6e6acSAndroid Build Coastguard Worker }				/* end extern "C" */
354*7ab6e6acSAndroid Build Coastguard Worker 
355*7ab6e6acSAndroid Build Coastguard Worker #endif
356