From 62e3c17b5b34bdb88da1b5a352c7066cfc8008f9 Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 23 Feb 2001 18:21:06 +0000 Subject: [PATCH] 64-bit integer routines git-svn-id: svn://svn.tartarus.org/sgt/putty@937 cda61777-01e9-0310-a592-d414129be87e --- int64.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int64.h | 18 ++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 int64.c create mode 100644 int64.h diff --git a/int64.c b/int64.c new file mode 100644 index 00000000..b43feea1 --- /dev/null +++ b/int64.c @@ -0,0 +1,66 @@ +/* + * Handling of the int64 and uint64 types. Done in 32-bit integers, + * for (pre-C99) portability. Hopefully once C99 becomes widespread + * we can kiss this lot goodbye... + */ + +#include + +typedef struct { + unsigned long hi, lo; +} uint64, int64; + +uint64 uint64_div10(uint64 x, int *remainder) { + uint64 y; + int rem, r2; + y.hi = x.hi / 10; + y.lo = x.lo / 10; + rem = x.lo % 10; + /* + * Now we have to add in the remainder left over from x.hi. + */ + r2 = x.hi % 10; + y.lo += r2 * 2 * (0x80000000 / 10); + rem += r2 * 2 * (0x80000000 % 10); + y.lo += rem / 10; + rem %= 10; + + if (remainder) + *remainder = rem; + return y; +} + +void uint64_decimal(uint64 x, char *buffer) { + char buf[20]; + int start = 20; + int d; + + while (x.hi || x.lo) { + x = uint64_div10(x, &d); + assert(start > 0); + buf[--start] = d + '0'; + } + + memcpy(buffer, buf+start, sizeof(buf)-start); + buffer[sizeof(buf)-start] = '\0'; +} + +uint64 uint64_make(unsigned long hi, unsigned long lo) { + uint64 y; + y.hi = hi; + y.lo = lo; + return y; +} + +uint64 uint64_add(uint64 x, uint64 y) { + x.lo += y.lo; + x.hi += y.hi + (x.lo < y.lo ? 1 : 0); + return x; +} + +uint64 uint64_add32(uint64 x, unsigned long y) { + uint64 yy; + yy.hi = 0; + yy.lo = y; + return uint64_add(x, yy); +} diff --git a/int64.h b/int64.h new file mode 100644 index 00000000..4ff33c7a --- /dev/null +++ b/int64.h @@ -0,0 +1,18 @@ +/* + * Header for int64.c. + */ + +#ifndef PUTTY_INT64_H +#define PUTTY_INT64_H + +typedef struct { + unsigned long hi, lo; +} uint64, int64; + +uint64 uint64_div10(uint64 x, int *remainder); +void uint64_decimal(uint64 x, char *buffer); +uint64 uint64_make(unsigned long hi, unsigned long lo); +uint64 uint64_add(uint64 x, uint64 y); +uint64 uint64_add32(uint64 x, unsigned long y); + +#endif -- 2.11.0