Rizin
unix-like reverse engineering framework and cli tools
variable.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2021 RizinOrg <info@rizin.re>
2 // SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
3 // SPDX-FileCopyrightText: 2021 heersin <teablearcher@gmail.com>
4 // SPDX-License-Identifier: LGPL-3.0-only
5 
7 #include <string.h>
8 #include <stdlib.h>
9 
15  RzILVar *ret = RZ_NEW0(RzILVar);
16  if (!ret) {
17  return NULL;
18  }
19  ret->name = strdup(name);
20  if (!ret->name) {
21  free(ret);
22  return NULL;
23  }
24  ret->sort = sort;
25  return ret;
26 }
27 
33  if (!var) {
34  return;
35  }
36  free(var->name);
37  free(var);
38 }
39 
40 // Variable Set
41 
42 static void var_ht_free(HtPPKv *kv) {
43  free(kv->key);
44  rz_il_variable_free(kv->value);
45 }
46 
47 static void val_ht_free(HtPPKv *kv) {
48  free(kv->key);
49  rz_il_value_free(kv->value);
50 }
51 
61  rz_return_val_if_fail(vs, false);
62  memset(vs, 0, sizeof(*vs));
63  vs->vars = ht_pp_new(NULL, var_ht_free, NULL);
64  if (!vs->vars) {
65  return false;
66  }
67  vs->contents = ht_pp_new(NULL, val_ht_free, NULL);
68  if (!vs->contents) {
69  ht_pp_free(vs->vars);
70  vs->vars = NULL;
71  return false;
72  }
73  return true;
74 }
75 
77  ht_pp_free(vs->vars);
78  ht_pp_free(vs->contents);
79 }
80 
84 }
85 
92  if (ht_pp_find(vs->vars, name, NULL)) {
93  return NULL;
94  }
95  RzILVar *var = rz_il_variable_new(name, sort);
96  if (!var) {
97  return NULL;
98  }
99  ht_pp_insert(vs->vars, name, var);
100  return var;
101 }
102 
109  ht_pp_delete(vs->vars, name);
110  HtPPKv *kv = ht_pp_find_kv(vs->contents, name, NULL);
111  if (!kv) {
112  return NULL;
113  }
114  RzILVal *r = kv->value;
115  kv->value = NULL;
116  ht_pp_delete(vs->contents, name);
117  return r;
118 }
119 
130  rz_return_val_if_fail(vs && name && val, NULL);
131  RzILVar *var = ht_pp_find(vs->vars, name, NULL);
132  if (!var || !rz_il_sort_pure_eq(var->sort, rz_il_value_get_sort(val))) {
133  if (!var) {
134  RZ_LOG_ERROR("Attempted to bind value to non-existent variable \"%s\"\n", name);
135  } else {
136  RZ_LOG_ERROR("Attempted to bind mis-sorted value to variable \"%s\"\n", name);
137  }
139  return false;
140  }
141  ht_pp_update(vs->contents, name, val);
142  return true;
143 }
144 
149  return ht_pp_find(vs->vars, name, NULL);
150 }
151 
152 static bool vars_collect_cb(void *user, const void *k, const void *v) {
153  rz_pvector_push(user, (void *)v);
154  return true;
155 }
156 
163  if (!r) {
164  return NULL;
165  }
166  ht_pp_foreach(vs->vars, vars_collect_cb, r);
167  return r;
168 }
169 
175  return ht_pp_find(vs->contents, name, NULL);
176 }
177 
181 const char *rz_il_var_kind_name(RzILVarKind kind) {
182  switch (kind) {
184  return "global";
186  return "local";
188  return "local pure";
189  default:
190  return "invalid";
191  }
192 }
ut16 val
Definition: armass64_const.h:6
#define RZ_API
#define NULL
Definition: cris-opc.c:27
#define r
Definition: crypto_rc6.c:12
const char * k
Definition: dsignal.c:11
const char * v
Definition: dsignal.c:12
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
RZ_API RzILSortPure rz_il_value_get_sort(RZ_NONNULL RzILVal *val)
Definition: value.c:127
RZ_API void rz_il_value_free(RZ_NULLABLE RzILVal *val)
Definition: value.c:107
return memset(p, 0, total)
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
#define rz_return_val_if_fail(expr, val)
Definition: rz_assert.h:108
#define RZ_LOG_ERROR(fmtstr,...)
Definition: rz_log.h:58
#define RZ_NULLABLE
Definition: rz_types.h:65
#define RZ_OWN
Definition: rz_types.h:62
#define RZ_NEW0(x)
Definition: rz_types.h:284
#define RZ_NONNULL
Definition: rz_types.h:64
#define RZ_BORROW
Definition: rz_types.h:63
RZ_API RzPVector * rz_pvector_new(RzPVectorFree free)
Definition: vector.c:302
static void ** rz_pvector_push(RzPVector *vec, void *x)
Definition: rz_vector.h:300
static bool rz_il_sort_pure_eq(RzILSortPure a, RzILSortPure b)
Definition: sort.h:37
Definition: z80asm.h:102
Holds a set of variable definitions and their current contents This is meant only as a low-level cont...
Definition: variable.h:31
HtPP * vars
Definition: variable.h:32
HtPP * contents
Definition: variable.h:33
Definition of a variable inside the vm.
Definition: variable.h:19
RzILSortPure sort
"type" of the variable
Definition: variable.h:21
char * name
Definition: variable.h:20
static void val_ht_free(HtPPKv *kv)
Definition: variable.c:47
RZ_API RZ_BORROW RzILVar * rz_il_var_set_create_var(RzILVarSet *vs, const char *name, RzILSortPure sort)
Definition: variable.c:90
RZ_API void rz_il_variable_free(RZ_NULLABLE RzILVar *var)
Definition: variable.c:32
RZ_API bool rz_il_var_set_bind(RzILVarSet *vs, const char *name, RZ_OWN RzILVal *val)
Definition: variable.c:129
RZ_API bool rz_il_var_set_init(RzILVarSet *vs)
Definition: variable.c:60
RZ_API void rz_il_var_set_reset(RzILVarSet *vs)
Definition: variable.c:81
RZ_API RZ_OWN RzPVector * rz_il_var_set_get_all(RzILVarSet *vs)
Definition: variable.c:160
const char * rz_il_var_kind_name(RzILVarKind kind)
Definition: variable.c:181
RZ_API RZ_BORROW RzILVar * rz_il_var_set_get(RzILVarSet *vs, const char *name)
Definition: variable.c:148
RZ_API RZ_OWN RzILVar * rz_il_variable_new(RZ_NONNULL const char *name, RzILSortPure sort)
Definition: variable.c:13
RZ_API RZ_BORROW RzILVal * rz_il_var_set_get_value(RzILVarSet *vs, const char *name)
Definition: variable.c:173
static void var_ht_free(HtPPKv *kv)
Definition: variable.c:42
RZ_API void rz_il_var_set_fini(RzILVarSet *vs)
Definition: variable.c:76
static bool vars_collect_cb(void *user, const void *k, const void *v)
Definition: variable.c:152
RZ_API RZ_OWN RZ_NULLABLE RzILVal * rz_il_var_set_remove_var(RzILVarSet *vs, const char *name)
Definition: variable.c:107
RzILVarKind
Definition: variable.h:46
@ RZ_IL_VAR_KIND_GLOBAL
global var, usually bound to a physical representation like a register.
Definition: variable.h:47
@ RZ_IL_VAR_KIND_LOCAL
local var, defined and assigned by set ops, mutable and useable across effects.
Definition: variable.h:48
@ RZ_IL_VAR_KIND_LOCAL_PURE
local pure var, bound only by let expressions, scope is limited to the let's pure body,...
Definition: variable.h:49