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