Fix gcc portability on Solaris 9 SPARC boxes.
[libgcrypt.git] / mpi / mpi-inline.h
index 8c7cedb..94e2aec 100644 (file)
@@ -1,21 +1,21 @@
 /* mpi-inline.h  -  Internal to the Multi Precision Integers
- *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
- *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ * Copyright (C) 1994, 1996, 1998, 1999,
+ *               2001, 2002 Free Software Foundation, Inc.
  *
- * This file is part of GnuPG.
+ * This file is part of Libgcrypt.
  *
- * GnuPG 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.
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  *
- * GnuPG is distributed in the hope that it will be useful,
+ * Libgcrypt 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.
+ * GNU Lesser 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
+ * You should have received a copy of the GNU Lesser 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
  *
  * Note: This code is heavily based on the GNU MP Library.
  *      way the data is stored; this is to support the abstraction
  *      of an optional secure memory allocation which may be used
  *      to avoid revealing of sensitive data due to paging etc.
- *      The GNU MP Library itself is published under the LGPL;
- *      however I decided to publish this code under the plain GPL.
  */
 
 #ifndef G10_MPI_INLINE_H
 #define G10_MPI_INLINE_H
 
+/* Starting with gcc 4.3 "extern inline" conforms in c99 mode to the
+   c99 semantics.  To keep the useful old semantics we use an
+   attribute.  */
 #ifndef G10_MPI_INLINE_DECL
-  #define G10_MPI_INLINE_DECL  extern __inline__
+# ifdef __GNUC_STDC_INLINE__
+#  define G10_MPI_INLINE_DECL  extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define G10_MPI_INLINE_DECL  extern __inline__
+# endif
 #endif
 
 G10_MPI_INLINE_DECL  mpi_limb_t
-mpihelp_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+_gcry_mpih_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
               mpi_size_t s1_size, mpi_limb_t s2_limb)
 {
     mpi_limb_t x;
@@ -65,23 +70,23 @@ mpihelp_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
 
 
 G10_MPI_INLINE_DECL mpi_limb_t
-mpihelp_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+_gcry_mpih_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
                               mpi_ptr_t s2_ptr, mpi_size_t s2_size)
 {
     mpi_limb_t cy = 0;
 
     if( s2_size )
-       cy = mpihelp_add_n( res_ptr, s1_ptr, s2_ptr, s2_size );
+       cy = _gcry_mpih_add_n( res_ptr, s1_ptr, s2_ptr, s2_size );
 
     if( s1_size - s2_size )
-       cy = mpihelp_add_1( res_ptr + s2_size, s1_ptr + s2_size,
+       cy = _gcry_mpih_add_1( res_ptr + s2_size, s1_ptr + s2_size,
                            s1_size - s2_size, cy);
     return cy;
 }
 
 
 G10_MPI_INLINE_DECL mpi_limb_t
-mpihelp_sub_1(mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
+_gcry_mpih_sub_1(mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
              mpi_size_t s1_size, mpi_limb_t s2_limb )
 {
     mpi_limb_t x;
@@ -111,19 +116,46 @@ mpihelp_sub_1(mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
 
 
 G10_MPI_INLINE_DECL   mpi_limb_t
-mpihelp_sub( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+_gcry_mpih_sub( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
                                mpi_ptr_t s2_ptr, mpi_size_t s2_size)
 {
     mpi_limb_t cy = 0;
 
     if( s2_size )
-       cy = mpihelp_sub_n(res_ptr, s1_ptr, s2_ptr, s2_size);
+       cy = _gcry_mpih_sub_n(res_ptr, s1_ptr, s2_ptr, s2_size);
 
     if( s1_size - s2_size )
-       cy = mpihelp_sub_1(res_ptr + s2_size, s1_ptr + s2_size,
+       cy = _gcry_mpih_sub_1(res_ptr + s2_size, s1_ptr + s2_size,
                                      s1_size - s2_size, cy);
     return cy;
 }
 
+/****************
+ * Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE.
+ * There are no restrictions on the relative sizes of
+ * the two arguments.
+ * Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2.
+ */
+G10_MPI_INLINE_DECL int
+_gcry_mpih_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size )
+{
+    mpi_size_t i;
+    mpi_limb_t op1_word, op2_word;
+
+    for( i = size - 1; i >= 0 ; i--) {
+       op1_word = op1_ptr[i];
+       op2_word = op2_ptr[i];
+       if( op1_word != op2_word )
+           goto diff;
+    }
+    return 0;
+
+  diff:
+    /* This can *not* be simplified to
+     *  op2_word - op2_word
+     * since that expression might give signed overflow.  */
+    return (op1_word > op2_word) ? 1 : -1;
+}
+
 
 #endif /*G10_MPI_INLINE_H*/