]>
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.
68 tvSubUsec(struct timeval t1
, struct timeval t2
)
70 return (t2
.tv_sec
- t1
.tv_sec
) * 1000000 +
71 (t2
.tv_usec
- t1
.tv_usec
);
75 tvSubDsec(struct timeval t1
, struct timeval t2
)
77 return (double) (t2
.tv_sec
- t1
.tv_sec
) +
78 (double) (t2
.tv_usec
- t1
.tv_usec
) / 1000000.0;
81 /* somewhat safer calculation of %s */
83 xpercent(double part
, double whole
)
85 return xdiv(100 * part
, whole
);
89 xpercentInt(double part
, double whole
)
92 return (int) rint(xpercent(part
, whole
));
94 /* SCO 3.2v4.2 doesn't have rint() -- mauri@mbp.ee */
95 return (int) floor(xpercent(part
, whole
) + 0.5);
99 /* somewhat safer division */
101 xdiv(double nom
, double denom
)
103 return (denom
!= 0.0) ? nom
/ denom
: -1.0;
106 /* integer to string */
110 static char buf
[24]; /* 2^64 = 18446744073709551616 */
111 snprintf(buf
, sizeof(buf
), "%d", num
);
115 /* int64_t to string */
117 xint64toa(int64_t num
)
119 static char buf
[24]; /* 2^64 = 18446744073709551616 */
120 snprintf(buf
, sizeof(buf
), "%" PRId64
, num
);
127 g
->gb
+= (g
->bytes
>> 30);
128 g
->bytes
&= (1 << 30) - 1;
132 gb_to_double(const gb_t
* g
)
134 return ((double) g
->gb
) * ((double) (1 << 30)) + ((double) g
->bytes
);
138 double_to_str(char *buf
, int buf_size
, double value
)
143 snprintf(buf
, buf_size
, "%.2f MB", value
/ 1e6
);
144 else if (value
< 1e12
)
145 snprintf(buf
, buf_size
, "%.3f GB", value
/ 1e9
);
147 snprintf(buf
, buf_size
, "%.4f TB", value
/ 1e12
);
153 gb_to_str(const gb_t
* g
)
156 * it is often convenient to call gb_to_str several times for _one_ printf
158 #define max_cc_calls 5
159 typedef char GbBuf
[32];
160 static GbBuf bufs
[max_cc_calls
];
161 static int call_id
= 0;
162 double value
= gb_to_double(g
);
163 char *buf
= bufs
[call_id
++];
165 if (call_id
>= max_cc_calls
)
170 snprintf(buf
, sizeof(GbBuf
), "%.2f MB", value
/ 1e6
);
171 else if (value
< 1e12
)
172 snprintf(buf
, sizeof(GbBuf
), "%.2f GB", value
/ 1e9
);
174 snprintf(buf
, sizeof(GbBuf
), "%.2f TB", value
/ 1e12
);
180 * rounds num to the next upper integer multiple of what
182 unsigned int RoundTo(const unsigned int num
, const unsigned int what
)
184 return what
* ((num
+ what
-1)/what
);