12a598d0bSHerbert Xu /* mpi-cmp.c - MPI functions
22a598d0bSHerbert Xu * Copyright (C) 1998, 1999 Free Software Foundation, Inc.
32a598d0bSHerbert Xu *
42a598d0bSHerbert Xu * This file is part of GnuPG.
52a598d0bSHerbert Xu *
62a598d0bSHerbert Xu * GnuPG is free software; you can redistribute it and/or modify
72a598d0bSHerbert Xu * it under the terms of the GNU General Public License as published by
82a598d0bSHerbert Xu * the Free Software Foundation; either version 2 of the License, or
92a598d0bSHerbert Xu * (at your option) any later version.
102a598d0bSHerbert Xu *
112a598d0bSHerbert Xu * GnuPG is distributed in the hope that it will be useful,
122a598d0bSHerbert Xu * but WITHOUT ANY WARRANTY; without even the implied warranty of
132a598d0bSHerbert Xu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
142a598d0bSHerbert Xu * GNU General Public License for more details.
152a598d0bSHerbert Xu *
162a598d0bSHerbert Xu * You should have received a copy of the GNU General Public License
172a598d0bSHerbert Xu * along with this program; if not, write to the Free Software
182a598d0bSHerbert Xu * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
192a598d0bSHerbert Xu */
202a598d0bSHerbert Xu
212a598d0bSHerbert Xu #include "mpi-internal.h"
222a598d0bSHerbert Xu
mpi_cmp_ui(MPI u,unsigned long v)232a598d0bSHerbert Xu int mpi_cmp_ui(MPI u, unsigned long v)
242a598d0bSHerbert Xu {
252a598d0bSHerbert Xu mpi_limb_t limb = v;
262a598d0bSHerbert Xu
272a598d0bSHerbert Xu mpi_normalize(u);
28*9e47a758SMark O'Donovan if (u->nlimbs == 0) {
29*9e47a758SMark O'Donovan if (v == 0)
302a598d0bSHerbert Xu return 0;
31*9e47a758SMark O'Donovan else
32*9e47a758SMark O'Donovan return -1;
33*9e47a758SMark O'Donovan }
342a598d0bSHerbert Xu if (u->sign)
352a598d0bSHerbert Xu return -1;
362a598d0bSHerbert Xu if (u->nlimbs > 1)
372a598d0bSHerbert Xu return 1;
382a598d0bSHerbert Xu
392a598d0bSHerbert Xu if (u->d[0] == limb)
402a598d0bSHerbert Xu return 0;
412a598d0bSHerbert Xu else if (u->d[0] > limb)
422a598d0bSHerbert Xu return 1;
432a598d0bSHerbert Xu else
442a598d0bSHerbert Xu return -1;
452a598d0bSHerbert Xu }
462a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmp_ui);
472a598d0bSHerbert Xu
do_mpi_cmp(MPI u,MPI v,int absmode)482a598d0bSHerbert Xu static int do_mpi_cmp(MPI u, MPI v, int absmode)
492a598d0bSHerbert Xu {
502a598d0bSHerbert Xu mpi_size_t usize;
512a598d0bSHerbert Xu mpi_size_t vsize;
522a598d0bSHerbert Xu int usign;
532a598d0bSHerbert Xu int vsign;
542a598d0bSHerbert Xu int cmp;
552a598d0bSHerbert Xu
562a598d0bSHerbert Xu mpi_normalize(u);
572a598d0bSHerbert Xu mpi_normalize(v);
582a598d0bSHerbert Xu
592a598d0bSHerbert Xu usize = u->nlimbs;
602a598d0bSHerbert Xu vsize = v->nlimbs;
612a598d0bSHerbert Xu usign = absmode ? 0 : u->sign;
622a598d0bSHerbert Xu vsign = absmode ? 0 : v->sign;
632a598d0bSHerbert Xu
642a598d0bSHerbert Xu /* Compare sign bits. */
652a598d0bSHerbert Xu
662a598d0bSHerbert Xu if (!usign && vsign)
672a598d0bSHerbert Xu return 1;
682a598d0bSHerbert Xu if (usign && !vsign)
692a598d0bSHerbert Xu return -1;
702a598d0bSHerbert Xu
712a598d0bSHerbert Xu /* U and V are either both positive or both negative. */
722a598d0bSHerbert Xu
732a598d0bSHerbert Xu if (usize != vsize && !usign && !vsign)
742a598d0bSHerbert Xu return usize - vsize;
752a598d0bSHerbert Xu if (usize != vsize && usign && vsign)
762a598d0bSHerbert Xu return vsize + usize;
772a598d0bSHerbert Xu if (!usize)
782a598d0bSHerbert Xu return 0;
792a598d0bSHerbert Xu cmp = mpihelp_cmp(u->d, v->d, usize);
802a598d0bSHerbert Xu if (!cmp)
812a598d0bSHerbert Xu return 0;
822a598d0bSHerbert Xu if ((cmp < 0?1:0) == (usign?1:0))
832a598d0bSHerbert Xu return 1;
842a598d0bSHerbert Xu
852a598d0bSHerbert Xu return -1;
862a598d0bSHerbert Xu }
872a598d0bSHerbert Xu
mpi_cmp(MPI u,MPI v)882a598d0bSHerbert Xu int mpi_cmp(MPI u, MPI v)
892a598d0bSHerbert Xu {
902a598d0bSHerbert Xu return do_mpi_cmp(u, v, 0);
912a598d0bSHerbert Xu }
922a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmp);
932a598d0bSHerbert Xu
mpi_cmpabs(MPI u,MPI v)942a598d0bSHerbert Xu int mpi_cmpabs(MPI u, MPI v)
952a598d0bSHerbert Xu {
962a598d0bSHerbert Xu return do_mpi_cmp(u, v, 1);
972a598d0bSHerbert Xu }
982a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmpabs);
99