md5, sha1, sha256, sha512: add gl_SET_CRYPTO_CHECK_DEFAULT
[gnulib.git] / lib / gcd.c
index 4d9e88f..6ce0322 100644 (file)
--- a/lib/gcd.c
+++ b/lib/gcd.c
@@ -1,11 +1,11 @@
 /* Arithmetic.
-   Copyright (C) 2001 Free Software Foundation, Inc.
-   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+   Copyright (C) 2001-2002, 2006, 2009-2013 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2001.
 
-   This program is free software; you can redistribute it and/or modify
+   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, or (at your option)
-   any later version.
+   the Free Software Foundation; either version 3 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
    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#include <config.h>
+
+/* This file can also be used to define gcd functions for other unsigned
+   types, such as 'unsigned long long' or 'uintmax_t'.  */
+#ifndef WORD_T
 /* Specification.  */
-#include "gcd.h"
+# include "gcd.h"
+# define WORD_T unsigned long
+# define GCD gcd
+#endif
 
 #include <stdlib.h>
 
 /* Return the greatest common divisor of a > 0 and b > 0.  */
-unsigned int
-gcd (a, b)
-     unsigned int a;
-     unsigned int b;
+WORD_T
+GCD (WORD_T a, WORD_T b)
 {
   /* Why no division, as in Euclid's algorithm? Because in Euclid's algorithm
      the division result floor(a/b) or floor(b/a) is very often = 1 or = 2,
@@ -35,46 +40,46 @@ gcd (a, b)
      bit in a single instruction, and the algorithm uses fewer variables than
      Euclid's algorithm.  */
 
-  unsigned int c = a | b;
+  WORD_T c = a | b;
   c = c ^ (c - 1);
   /* c = largest power of 2 that divides a and b.  */
 
   if (a & c)
     {
       if (b & c)
-       goto odd_odd;
+        goto odd_odd;
       else
-       goto odd_even;
+        goto odd_even;
     }
   else
     {
       if (b & c)
-       goto even_odd;
+        goto even_odd;
       else
-       abort ();
+        abort ();
     }
 
   for (;;)
     {
     odd_odd: /* a/c and b/c both odd */
       if (a == b)
-       break;
+        break;
       if (a > b)
-       {
-         a = a - b;
-       even_odd: /* a/c even, b/c odd */
-         do
-           a = a >> 1;
-         while ((a & c) == 0);
-       }
+        {
+          a = a - b;
+        even_odd: /* a/c even, b/c odd */
+          do
+            a = a >> 1;
+          while ((a & c) == 0);
+        }
       else
-       {
-         b = b - a;
-       odd_even: /* a/c odd, b/c even */
-         do
-           b = b >> 1;
-         while ((b & c) == 0);
-       }
+        {
+          b = b - a;
+        odd_even: /* a/c odd, b/c even */
+          do
+            b = b >> 1;
+          while ((b & c) == 0);
+        }
     }
 
   /* a = b */