Rizin
unix-like reverse engineering framework and cli tools
big-gmp.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2010 pancake <pancake@nopcode.org>
2 // SPDX-FileCopyrightText: 2020 FXTi <zjxiang1998@gmail.com>
3 // SPDX-License-Identifier: LGPL-3.0-only
4 
5 #include <rz_util.h>
6 
9  if (n) {
10  mpz_init(*n);
11  }
12  return n;
13 }
14 
16  mpz_clear(*b);
17  free(b);
18 }
19 
21  mpz_init(*b);
22 }
23 
25  mpz_clear(*b);
26 }
27 
29  mpz_set_si(*b, v);
30 }
31 
33  return mpz_get_si(*b);
34 }
35 
36 RZ_API void rz_big_from_hexstr(RzNumBig *b, const char *str) {
37  if (rz_str_startswith(str, "0x")) {
38  str += 2;
39  mpz_set_str(*b, str, 16);
40  } else if (rz_str_startswith(str, "-0x")) {
41  str += 3;
42  mpz_set_str(*b, str, 16);
43  mpz_mul_si(*b, *b, -1);
44  }
45 }
46 
48  char *tmp = mpz_get_str(NULL, 16, *b);
49  char *res;
50  if (tmp[0] == '-') {
51  res = rz_str_newf("-0x%s", &tmp[1]);
52  } else {
53  res = rz_str_newf("0x%s", tmp);
54  }
55  free(tmp);
56  return res;
57 }
58 
60  mpz_set(*dst, *src);
61 }
62 
64  mpz_add(*c, *a, *b);
65 }
66 
68  mpz_sub(*c, *a, *b);
69 }
70 
72  mpz_mul(*c, *a, *b);
73 }
74 
76  mpz_tdiv_q(*c, *a, *b);
77 }
78 
80  mpz_mod(*c, *a, *b);
81 }
82 
84  mpz_tdiv_qr(*c, *d, *a, *b);
85 }
86 
88  mpz_and(*c, *a, *b);
89 }
90 
92  mpz_ior(*c, *a, *b);
93 }
94 
96  mpz_xor(*c, *a, *b);
97 }
98 
99 RZ_API void rz_big_lshift(RzNumBig *c, RzNumBig *a, size_t nbits) {
100  mpz_mul_2exp(*c, *a, nbits);
101 }
102 
103 RZ_API void rz_big_rshift(RzNumBig *c, RzNumBig *a, size_t nbits) {
104  mpz_tdiv_q_2exp(*c, *a, nbits);
105 }
106 
108  int res = mpz_cmp(*a, *b);
109  if (res > 0) {
110  return 1;
111  } else if (res < 0) {
112  return -1;
113  } else {
114  return 0;
115  }
116 }
117 
119  return mpz_cmp_ui(*a, 0) == 0;
120 }
121 
123  RzNumBig tmp;
124  mpz_init_set_si(tmp, 1);
125  mpz_add(*a, *a, tmp);
126 }
127 
129  RzNumBig tmp;
130  mpz_init_set_si(tmp, 1);
131  mpz_sub(*a, *a, tmp);
132 }
133 
135  mpz_powm(*c, *a, *b, *m);
136 }
137 
139  mpz_sqrt(*c, *a);
140 }
lzma_index * src
Definition: index.h:567
RZ_API char * rz_big_to_hexstr(RzNumBig *b)
Definition: big-gmp.c:47
RZ_API void rz_big_dec(RzNumBig *a)
Definition: big-gmp.c:128
RZ_API int rz_big_cmp(RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:107
RZ_API void rz_big_assign(RzNumBig *dst, RzNumBig *src)
Definition: big-gmp.c:59
RZ_API void rz_big_and(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:87
RZ_API void rz_big_xor(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:95
RZ_API void rz_big_fini(RzNumBig *b)
Definition: big-gmp.c:24
RZ_API void rz_big_add(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:63
RZ_API void rz_big_isqrt(RzNumBig *c, RzNumBig *a)
Definition: big-gmp.c:138
RZ_API void rz_big_from_hexstr(RzNumBig *b, const char *str)
Definition: big-gmp.c:36
RZ_API void rz_big_divmod(RzNumBig *c, RzNumBig *d, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:83
RZ_API void rz_big_free(RzNumBig *b)
Definition: big-gmp.c:15
RZ_API void rz_big_rshift(RzNumBig *c, RzNumBig *a, size_t nbits)
Definition: big-gmp.c:103
RZ_API void rz_big_lshift(RzNumBig *c, RzNumBig *a, size_t nbits)
Definition: big-gmp.c:99
RZ_API void rz_big_or(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:91
RZ_API st64 rz_big_to_int(RzNumBig *b)
Definition: big-gmp.c:32
RZ_API RzNumBig * rz_big_new(void)
Definition: big-gmp.c:7
RZ_API void rz_big_powm(RzNumBig *c, RzNumBig *a, RzNumBig *b, RzNumBig *m)
Definition: big-gmp.c:134
RZ_API void rz_big_div(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:75
RZ_API void rz_big_init(RzNumBig *b)
Definition: big-gmp.c:20
RZ_API void rz_big_sub(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:67
RZ_API void rz_big_mod(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:79
RZ_API void rz_big_inc(RzNumBig *a)
Definition: big-gmp.c:122
RZ_API void rz_big_from_int(RzNumBig *b, st64 v)
Definition: big-gmp.c:28
RZ_API void rz_big_mul(RzNumBig *c, RzNumBig *a, RzNumBig *b)
Definition: big-gmp.c:71
RZ_API int rz_big_is_zero(RzNumBig *a)
Definition: big-gmp.c:118
#define RZ_API
#define NULL
Definition: cris-opc.c:27
const char * v
Definition: dsignal.c:12
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
char * dst
Definition: lz4.h:724
int n
Definition: mipsasm.c:19
RZ_API char * rz_str_newf(const char *fmt,...) RZ_PRINTF_CHECK(1
RZ_API bool rz_str_startswith(RZ_NONNULL const char *str, RZ_NONNULL const char *needle)
Checks if a string starts with a specifc sequence of characters (case sensitive)
Definition: str.c:3286
#define RZ_NEW(x)
Definition: rz_types.h:285
#define st64
Definition: rz_types_base.h:10
#define d(i)
Definition: sha256.c:44
#define b(i)
Definition: sha256.c:42
#define c(i)
Definition: sha256.c:43
#define a(i)
Definition: sha256.c:41