1 | /* mpi-cmp.c - MPI functions |
2 | * 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 modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (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 of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
19 | */ |
20 | |
21 | #include "mpi-internal.h" |
22 | |
23 | int mpi_cmp_ui(MPI u, unsigned long v) |
24 | { |
25 | mpi_limb_t limb = v; |
26 | |
27 | mpi_normalize(a: u); |
28 | if (u->nlimbs == 0) { |
29 | if (v == 0) |
30 | return 0; |
31 | else |
32 | 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 | else |
44 | return -1; |
45 | } |
46 | EXPORT_SYMBOL_GPL(mpi_cmp_ui); |
47 | |
48 | static int do_mpi_cmp(MPI u, MPI v, int absmode) |
49 | { |
50 | mpi_size_t usize; |
51 | mpi_size_t vsize; |
52 | int usign; |
53 | int vsign; |
54 | int cmp; |
55 | |
56 | mpi_normalize(a: u); |
57 | mpi_normalize(a: v); |
58 | |
59 | usize = u->nlimbs; |
60 | vsize = v->nlimbs; |
61 | usign = absmode ? 0 : u->sign; |
62 | vsign = absmode ? 0 : v->sign; |
63 | |
64 | /* Compare sign bits. */ |
65 | |
66 | if (!usign && vsign) |
67 | return 1; |
68 | if (usign && !vsign) |
69 | return -1; |
70 | |
71 | /* U and V are either both positive or both negative. */ |
72 | |
73 | if (usize != vsize && !usign && !vsign) |
74 | return usize - vsize; |
75 | if (usize != vsize && usign && vsign) |
76 | return vsize + usize; |
77 | if (!usize) |
78 | return 0; |
79 | cmp = mpihelp_cmp(op1_ptr: u->d, op2_ptr: v->d, size: usize); |
80 | if (!cmp) |
81 | return 0; |
82 | if ((cmp < 0?1:0) == (usign?1:0)) |
83 | return 1; |
84 | |
85 | return -1; |
86 | } |
87 | |
88 | int mpi_cmp(MPI u, MPI v) |
89 | { |
90 | return do_mpi_cmp(u, v, absmode: 0); |
91 | } |
92 | EXPORT_SYMBOL_GPL(mpi_cmp); |
93 | |
94 | int mpi_cmpabs(MPI u, MPI v) |
95 | { |
96 | return do_mpi_cmp(u, v, absmode: 1); |
97 | } |
98 | EXPORT_SYMBOL_GPL(mpi_cmpabs); |
99 | |