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