73 lines · c
1/* mpi-cmp.c - MPI functions2 * Copyright (C) 1998, 1999 Free Software Foundation, Inc.3 *4 * This file is part of GnuPG.5 *6 * GnuPG is free software; you can redistribute it and/or modify7 * it under the terms of the GNU General Public License as published by8 * the Free Software Foundation; either version 2 of the License, or9 * (at your option) any later version.10 *11 * GnuPG is distributed in the hope that it will be useful,12 * but WITHOUT ANY WARRANTY; without even the implied warranty of13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 * GNU General Public License for more details.15 *16 * You should have received a copy of the GNU General Public License17 * along with this program; if not, write to the Free Software18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA19 */20 21#include "mpi-internal.h"22 23int mpi_cmp_ui(MPI u, unsigned long v)24{25 mpi_limb_t limb = v;26 27 mpi_normalize(u);28 if (u->nlimbs == 0) {29 if (v == 0)30 return 0;31 else32 return -1;33 }34 if (u->sign)35 return -1;36 if (u->nlimbs > 1)37 return 1;38 39 if (u->d[0] == limb)40 return 0;41 else if (u->d[0] > limb)42 return 1;43 else44 return -1;45}46EXPORT_SYMBOL_GPL(mpi_cmp_ui);47 48int mpi_cmp(MPI u, MPI v)49{50 mpi_size_t usize, vsize;51 int cmp;52 53 mpi_normalize(u);54 mpi_normalize(v);55 usize = u->nlimbs;56 vsize = v->nlimbs;57 if (!u->sign && v->sign)58 return 1;59 if (u->sign && !v->sign)60 return -1;61 if (usize != vsize && !u->sign && !v->sign)62 return usize - vsize;63 if (usize != vsize && u->sign && v->sign)64 return vsize - usize;65 if (!usize)66 return 0;67 cmp = mpihelp_cmp(u->d, v->d, usize);68 if (u->sign)69 return -cmp;70 return cmp;71}72EXPORT_SYMBOL_GPL(mpi_cmp);73