util.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2022 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #define _etext etext
10 
11 #include "squid.h"
12 #include "util.h"
13 
14 #if HAVE_STRING_H
15 #include <string.h>
16 #endif
17 #if HAVE_CTYPE_H
18 #include <ctype.h>
19 #endif
20 #if HAVE_UNISTD_H
21 #include <unistd.h>
22 #endif
23 #if HAVE_MATH_H
24 #include <math.h>
25 #endif
26 
27 void
28 Tolower(char *q)
29 {
30  char *s = q;
31 
32  while (*s) {
33  *s = xtolower(*s);
34  s++;
35  }
36 }
37 
38 /* somewhat safer calculation of %s */
39 double
40 xpercent(double part, double whole)
41 {
42  return xdiv(100 * part, whole);
43 }
44 
45 int
46 xpercentInt(double part, double whole)
47 {
48  return (int) rint(xpercent(part, whole));
49 }
50 
51 /* somewhat safer division */
52 double
53 xdiv(double nom, double denom)
54 {
55  return (denom != 0.0) ? nom / denom : -1.0;
56 }
57 
58 /* integer to string */
59 const char *
60 xitoa(int num)
61 {
62  static char buf[24]; /* 2^64 = 18446744073709551616 */
63  snprintf(buf, sizeof(buf), "%d", num);
64  return buf;
65 }
66 
67 /* int64_t to string */
68 const char *
69 xint64toa(int64_t num)
70 {
71  static char buf[24]; /* 2^64 = 18446744073709551616 */
72  snprintf(buf, sizeof(buf), "%" PRId64, num);
73  return buf;
74 }
75 
76 void
78 {
79  g->gb += (g->bytes >> 30);
80  g->bytes &= (1 << 30) - 1;
81 }
82 
83 double
84 gb_to_double(const gb_t * g)
85 {
86  return ((double) g->gb) * ((double) (1 << 30)) + ((double) g->bytes);
87 }
88 
89 const char *
90 double_to_str(char *buf, int buf_size, double value)
91 {
92  /* select format */
93 
94  if (value < 1e9)
95  snprintf(buf, buf_size, "%.2f MB", value / 1e6);
96  else if (value < 1e12)
97  snprintf(buf, buf_size, "%.3f GB", value / 1e9);
98  else
99  snprintf(buf, buf_size, "%.4f TB", value / 1e12);
100 
101  return buf;
102 }
103 
104 const char *
105 gb_to_str(const gb_t * g)
106 {
107  /*
108  * it is often convenient to call gb_to_str several times for _one_ printf
109  */
110 #define max_cc_calls 5
111  typedef char GbBuf[32];
112  static GbBuf bufs[max_cc_calls];
113  static int call_id = 0;
114  double value = gb_to_double(g);
115  char *buf = bufs[call_id++];
116 
117  if (call_id >= max_cc_calls)
118  call_id = 0;
119 
120  /* select format */
121  if (value < 1e9)
122  snprintf(buf, sizeof(GbBuf), "%.2f MB", value / 1e6);
123  else if (value < 1e12)
124  snprintf(buf, sizeof(GbBuf), "%.2f GB", value / 1e9);
125  else
126  snprintf(buf, sizeof(GbBuf), "%.2f TB", value / 1e12);
127 
128  return buf;
129 }
130 
134 unsigned int RoundTo(const unsigned int num, const unsigned int what)
135 {
136  return what * ((num + what -1)/what);
137 }
138 
double xdiv(double nom, double denom)
Definition: util.c:53
const char * xint64toa(int64_t num)
Definition: util.c:69
double gb_to_double(const gb_t *g)
Definition: util.c:84
const char * gb_to_str(const gb_t *g)
Definition: util.c:105
#define max_cc_calls
#define xtolower(x)
Definition: xis.h:19
Definition: util.h:25
size_t bytes
Definition: util.h:27
double xpercent(double part, double whole)
Definition: util.c:40
void gb_flush(gb_t *g)
Definition: util.c:77
int xpercentInt(double part, double whole)
Definition: util.c:46
void EVH void double
Definition: stub_event.cc:16
const char * xitoa(int num)
Definition: util.c:60
size_t gb
Definition: util.h:28
const char * double_to_str(char *buf, int buf_size, double value)
Definition: util.c:90
void Tolower(char *q)
Definition: util.c:28
#define PRId64
Definition: types.h:110
unsigned int RoundTo(const unsigned int num, const unsigned int what)
Definition: util.c:134

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors