69 lines
1.9 KiB
C
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;
|
||
|
|