updates.
[silc.git] / lib / silcmath / mp_gmp.c
1 /*
2
3   mp_gmp.c
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 2001 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20 /* $Id$ */
21
22 #include "silcincludes.h"
23 #include <gmp.h>
24
25 void silc_mp_init(SilcMPInt *mp)
26 {
27   mpz_init(mp);
28 }
29
30 void silc_mp_uninit(SilcMPInt *mp)
31 {
32   mpz_clear(mp);
33 }
34
35 size_t silc_mp_size(SilcMPInt *mp)
36 {
37   return mpz_size(mp);
38 }
39
40 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
41 {
42   return mpz_sizeinbase(mp, base);
43 }
44
45 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
46 {
47   mpz_set(dst, src);
48 }
49
50 void silc_mp_set_ui(SilcMPInt *dst, uint32 ui)
51 {
52   mpz_set_ui(dst, ui);
53 }
54
55 void silc_mp_set_si(SilcMPInt *dst, int32 si)
56 {
57   mpz_set_si(dst, si);
58 }
59
60 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
61 {
62   mpz_set_str(dst, str, base);
63 }
64
65 uint32 silc_mp_get_ui(SilcMPInt *mp)
66 {
67   return (uint32)mpz_get_ui(mp);
68 }
69
70 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
71 {
72   return mpz_get_str(str, base, mp);
73 }
74
75 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
76 {
77   mpz_add(dst, mp1, mp2);
78 }
79
80 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
81 {
82   mpz_add_ui(dst, mp1, ui);
83 }
84
85 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
86 {
87   mpz_sub(dst, mp1, mp2);
88 }
89
90 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
91 {
92   mpz_sub_ui(dst, mp1, ui);
93 }
94
95 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
96 {
97   mpz_mul(dst, mp1, mp2);
98 }
99
100 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
101 {
102   mpz_mul_ui(dst, mp1, ui);
103 }
104
105 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
106 {
107   mpz_mul_2exp(dst, mp1, exp);
108 }
109
110 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
111 {
112   mpz_sqrt(dst, src);
113 }
114
115 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
116 {
117   mpz_div(dst, mp1, mp2);
118 }
119
120 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
121 {
122   mpz_div_ui(dst, mp1, ui);
123 }
124
125 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, 
126                     SilcMPInt *mp2)
127 {
128   if (q && r)
129     mpz_fdiv_qr(q, r, mp1, mp2);
130   if (q && !r)
131     mpz_div(q, mp1, mp2);
132   if (!q && r)
133     mpz_mod(r, mp1, mp2);
134 }
135
136 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
137 {
138   mpz_fdiv_q_2exp(dst, mp1, exp);
139 }
140
141 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, 
142                          uint32 exp)
143 {
144   if (q)
145     mpz_fdiv_q_2exp(q, mp1, exp);
146   if (r)
147     mpz_fdiv_r_2exp(r, mp1, exp);
148 }
149
150 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
151 {
152   mpz_mod(dst, mp1, mp2);
153 }
154
155 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
156 {
157   mpz_mod_ui(dst, mp1, ui);
158 }
159
160 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
161 {
162   mpz_mod_2exp(dst, mp1, ui);
163 }
164
165 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
166 {
167   uint32 uiexp = mpz_get_ui(exp);
168   mpz_pow_ui(dst, mp1, uiexp);
169 }
170
171 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
172 {
173   mpz_pow_ui(dst, mp1, exp);
174 }
175
176 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp, 
177                      SilcMPInt *mod)
178 {
179   mpz_powm(dst, mp1, exp, mod);
180 }
181
182 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp, 
183                         SilcMPInt *mod)
184 {
185   mpz_powm_ui(dst, mp1, exp, mod);
186 }
187
188 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
189 {
190   mpz_gcd(dst, mp1, mp2);
191 }
192
193 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
194                     SilcMPInt *mp2)
195 {
196   mpz_gcdext(g, s, t, mp1, mp2);
197 }
198
199 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
200 {
201   return mpz_cmp(mp1, mp2);
202 }
203
204 int silc_mp_cmp_si(SilcMPInt *mp1, int32 si)
205 {
206   return mpz_cmp_si(mp1, si);
207 }
208
209 int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui)
210 {
211   return mpz_cmp_ui(mp1, ui);
212 }
213
214 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
215 {
216   mpz_abs(dst, src);
217 }
218
219 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
220 {
221   mpz_neg(dst, src);
222 }
223
224 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
225 {
226   mpz_and(dst, mp1, mp2);
227 }
228
229 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
230 {
231   mpz_ior(dst, mp1, mp2);
232 }
233
234 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
235 {
236   mpz_xor(dst, mp1, mp2);
237 }