Added two files that had to be obtained separately in former times
authorJoey Schulze <joey@infodrom.org>
Thu, 1 Nov 2001 18:27:27 +0000 (18:27 +0000)
committerJoey Schulze <joey@infodrom.org>
Thu, 1 Nov 2001 18:27:27 +0000 (18:27 +0000)
bigint.c [new file with mode: 0644]
bigint.h [new file with mode: 0644]

diff --git a/bigint.c b/bigint.c
new file mode 100644 (file)
index 0000000..059c71b
--- /dev/null
+++ b/bigint.c
@@ -0,0 +1,111 @@
+/*
+    bigint.c - Manage big positive integer numbers
+    Copyright (c) 1996  Martin Schulze <joey@artis.uni-oldenburg.de>
+
+    This program 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.
+
+    This program 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 this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+    $Id$
+ */
+
+#include "bigint.h"
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+
+bigint bigint_add(bigint a, bigint b)
+{
+  int i;
+  unsigned long int tmp;
+  bigint c;
+
+  for (i=0; i<BIGINT_LEN; i++) {
+    tmp = a.val[i] + b.val[i];
+    if (tmp >= BIGINT_MAX) {
+      c.val[i] = tmp - BIGINT_MAX;
+      if (i<BIGINT_LEN)
+       a.val[i+1]++;
+      else
+       fprintf(stderr, "Overflow in bigint addition.");
+    } else
+      c.val[i] = tmp;
+  }
+  return c;
+}
+
+bigint bigint_sub(bigint a, bigint b)
+{
+  /* FIXME */
+  fprintf (stderr, "bigint_sub not supported yet.\n");
+  return a;
+}
+
+bigint bigint_int(int num)
+{
+  bigint x;
+  int i;
+
+  for (i=0; i<BIGINT_LEN; i++) x.val[i] = 0L;
+  x.val[0] = num;
+  x.val[1] = 0;
+  return x;
+}
+
+bigint bigint_string(char *s)
+{
+  char tmp[BIGINT_PREC+1];
+  bigint a;
+  int i;
+  char *cp, *x;
+
+  for (i=0; i<BIGINT_LEN; i++) a.val[i] = 0L;
+  if ((x = (char *)malloc(strlen(s)+1))) {
+    strcpy(x, s);
+    for (i=0; i<BIGINT_LEN; i++) {
+      if (strlen(x)) {
+       cp = x;
+       if (strlen(x) > BIGINT_PREC)
+         cp += (strlen(x) - BIGINT_PREC);
+       strcpy(tmp, cp);
+       *cp = '\0';
+       sscanf(tmp, "%lu", &a.val[i]);
+      }
+    }
+    free (x);
+  }
+
+  return a;
+}
+
+void bigint_sprintf (char *res, char *format, bigint a)
+{
+  char s[(BIGINT_PREC*BIGINT_LEN)+1];
+  char tmp[BIGINT_PREC+1];
+  char form[6];
+  int i, max;
+
+  bzero(s, sizeof(s));
+  sprintf(form, "%%0%dlu", BIGINT_PREC);
+  max = BIGINT_LEN;
+  for (;max>0 && !a.val[max-1];max--);
+  for (i=0; i<max; i++) {
+    if (i<max-1)
+      sprintf(tmp, form, a.val[i]);
+    else
+      sprintf(tmp, "%lu", a.val[i]);
+    sprintf (res, "%s%s", tmp, s);
+    sprintf (s, "%s", res);
+  }
+  sprintf (res, format, s);
+}
diff --git a/bigint.h b/bigint.h
new file mode 100644 (file)
index 0000000..6a7754c
--- /dev/null
+++ b/bigint.h
@@ -0,0 +1,43 @@
+/*
+    bigint.h - Manage big positive integer numbers
+    Copyright (c) 1996  Martin Schulze <joey@artis.uni-oldenburg.de>
+
+    This program 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.
+
+    This program 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 this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+    $Id$
+ */
+
+/*
+ * 4294967295 is max (unsigned long int)
+ */
+
+#define BIGINT_LEN     2
+#define BIGINT_MAX     1000000000
+#define BIGINT_PREC    9
+
+typedef struct
+{
+  unsigned long int val[BIGINT_LEN];
+} bigint;
+
+bigint bigint_add(bigint a, bigint b);
+
+bigint bigint_sub(bigint a, bigint b);
+
+bigint bigint_int(int num);
+
+bigint bigint_string(char *s);
+
+void bigint_sprintf (char *res, char *format, bigint a);