dockapps/wmmon/ulllib.c
Doug Torrance 3ec1a9cde3 wmmon: Fix jiffy counter overflowing long on 32-bit systems.
Based on patch by Pedro Gimeno Fortea for Debian bug #670151 [1].

[1] https://bugs.debian.org/670151
2017-08-12 22:40:32 +01:00

69 lines
1.9 KiB
C

/*
* Unsigned long long arithmetic limited library, tailored for wmmon's
* specific needs.
*
* Copyright (c) 2014 Pedro Gimeno Fortea
*
* This file is part of wmmon.
*
* wmmon is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wmmon is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with wmmon; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef HAVE_LONG_LONG_INT
#include "ulllib.h"
void ullreset(ullong *target) {
target->H = target->L = 0;
}
void ulladd(ullong *target, const ullong *toadd) {
unsigned long tmpL = toadd->L, tmpH = toadd->H;
target->L += tmpL;
/* Carry if the result is less than one of the operands */
target->H += tmpH + (target->L < tmpL);
}
long ullsub(const ullong *a, const ullong *b) {
/* Will wrap around correctly if necessary. Result is assumed to
fit a signed long. */
/* assert((a->H == b->H && a->L >= b->L)
|| (a->H == b->H + 1 && a->L < b->L)); */
return a->L - b->L;
}
void ullparse(ullong *target, const char *str) {
ullong tmp;
ullreset(target);
while (*str >= '0' && *str <= '9') {
tmp = *target;
ulladd(target, target); /* *2 */
ulladd(target, target); /* *4 */
ulladd(target, &tmp); /* *5 */
ulladd(target, target); /* *10 */
tmp.H = 0;
tmp.L = *str - '0';
ulladd(target, &tmp); /* + digit */
++str;
}
}
#endif /* HAVE_LONG_LONG_INT */
typedef int make_iso_compilers_happy;