]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/util.c
5 * AUTHOR: Harvest Derived
7 * SQUID Web Proxy Cache http://www.squid-cache.org/
8 * ----------------------------------------------------------
10 * Squid is the result of efforts by numerous individuals from
11 * the Internet community; see the CONTRIBUTORS file for full
12 * details. Many organizations have provided support for Squid's
13 * development; see the SPONSORS file for full details. Squid is
14 * Copyrighted (C) 2001 by the Regents of the University of
15 * California; see the COPYRIGHT file for full details. Squid
16 * incorporates software developed and/or copyrighted by other
17 * sources; see the CREDITS file for full details.
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
38 #include "profiler/Profiler.h"
69 tvSubUsec(struct timeval t1
, struct timeval t2
)
71 return (t2
.tv_sec
- t1
.tv_sec
) * 1000000 +
72 (t2
.tv_usec
- t1
.tv_usec
);
76 tvSubDsec(struct timeval t1
, struct timeval t2
)
78 return (double) (t2
.tv_sec
- t1
.tv_sec
) +
79 (double) (t2
.tv_usec
- t1
.tv_usec
) / 1000000.0;
82 /* returns the number of leading white spaces in str; handy in skipping ws */
84 xcountws(const char *str
)
90 while (xisspace(*str
)) {
100 /* somewhat safer calculation of %s */
102 xpercent(double part
, double whole
)
104 return xdiv(100 * part
, whole
);
108 xpercentInt(double part
, double whole
)
111 return (int) rint(xpercent(part
, whole
));
113 /* SCO 3.2v4.2 doesn't have rint() -- mauri@mbp.ee */
114 return (int) floor(xpercent(part
, whole
) + 0.5);
118 /* somewhat safer division */
120 xdiv(double nom
, double denom
)
122 return (denom
!= 0.0) ? nom
/ denom
: -1.0;
125 /* integer to string */
129 static char buf
[24]; /* 2^64 = 18446744073709551616 */
130 snprintf(buf
, sizeof(buf
), "%d", num
);
134 /* int64_t to string */
136 xint64toa(int64_t num
)
138 static char buf
[24]; /* 2^64 = 18446744073709551616 */
139 snprintf(buf
, sizeof(buf
), "%" PRId64
, num
);
146 g
->gb
+= (g
->bytes
>> 30);
147 g
->bytes
&= (1 << 30) - 1;
151 gb_to_double(const gb_t
* g
)
153 return ((double) g
->gb
) * ((double) (1 << 30)) + ((double) g
->bytes
);
157 double_to_str(char *buf
, int buf_size
, double value
)
162 snprintf(buf
, buf_size
, "%.2f MB", value
/ 1e6
);
163 else if (value
< 1e12
)
164 snprintf(buf
, buf_size
, "%.3f GB", value
/ 1e9
);
166 snprintf(buf
, buf_size
, "%.4f TB", value
/ 1e12
);
172 gb_to_str(const gb_t
* g
)
175 * it is often convenient to call gb_to_str several times for _one_ printf
177 #define max_cc_calls 5
178 typedef char GbBuf
[32];
179 static GbBuf bufs
[max_cc_calls
];
180 static int call_id
= 0;
181 double value
= gb_to_double(g
);
182 char *buf
= bufs
[call_id
++];
184 if (call_id
>= max_cc_calls
)
189 snprintf(buf
, sizeof(GbBuf
), "%.2f MB", value
/ 1e6
);
190 else if (value
< 1e12
)
191 snprintf(buf
, sizeof(GbBuf
), "%.2f GB", value
/ 1e9
);
193 snprintf(buf
, sizeof(GbBuf
), "%.2f TB", value
/ 1e12
);
199 * rounds num to the next upper integer multiple of what
201 unsigned int RoundTo(const unsigned int num
, const unsigned int what
)
203 return what
* ((num
+ what
-1)/what
);