/* cntr.h
*
* COPYRIGHT (c) 1992 AT&T Bell Laboratories
*
* Large counters for large (> 2^31) values.
*/
#ifndef _CNTR_
#define _CNTR_
#define ONE_MILLION 1000000
typedef struct {
Unsigned32_t millions;
Unsigned32_t ones;
} cntr_t;
#define CNTR_INCR(cp, i) { \
cntr_t *__cp = (cp); \
__cp->ones += (i); \
while (__cp->ones > ONE_MILLION) { \
__cp->ones -= ONE_MILLION; \
__cp->millions++; \
} \
}
#define CNTR_INCR1(cp) { \
cntr_t *__cp = (cp); \
__cp->ones++; \
if (__cp->ones > ONE_MILLION) { \
__cp->ones -= ONE_MILLION; \
__cp->millions++; \
} \
}
#define CNTR_ZERO(cp) { \
cntr_t *__cp = (cp); \
__cp->ones = __cp->millions = 0; \
}
#define CNTR_TO_REAL(cp) \
(((double)((cp)->millions)*(double)ONE_MILLION) + (double)((cp)->ones))
/* Add cp2 to cp1 */
#define CNTR_ADD(cp1, cp2) { \
cntr_t *__cp1 = (cp1); \
cntr_t *__cp2 = (cp2); \
__cp1->ones += __cp2->ones; \
if (__cp1->ones > ONE_MILLION) { \
__cp1->ones -= ONE_MILLION; \
__cp1->millions++; \
} \
__cp1->millions += __cp2->millions; \
}
#define CNTR_PERCENT(cp1, cp2) ((100.0*CNTR_TO_REAL(cp1)) / CNTR_TO_REAL(cp2))
#define CNTR_FPRINTF(f,cp,wid) { \
cntr_t *__cp = (cp); \
int __w = (wid); \
if (__cp->millions > 0) \
fprintf (f, "%*d%06d", __w-6, __cp->millions, __cp->ones); \
else \
fprintf (f, "%*d", __w, __cp->ones); \
}
#endif /* !_CNTR_ */
syntax highlighted by Code2HTML, v. 0.9.1