From 71053f17e91d66f4a376e984da3157fddef89801 Mon Sep 17 00:00:00 2001 From: radare Date: Wed, 7 Nov 2018 17:18:14 +0100 Subject: [PATCH] Move trie, mixed, slist into Sdb's Attic, and DES from util to crypto ##refactor --- binr/rafind2/Makefile | 2 +- binr/rafind2/meson.build | 1 + binr/ragg2/Makefile | 2 +- binr/rahash2/Makefile | 2 +- binr/rasm2/Makefile | 2 +- binr/rasm2/meson.build | 1 + binr/rax2/rax2.c | 8 +- libr/Makefile | 6 +- libr/anal/Makefile | 2 +- libr/anal/meson.build | 2 + libr/anal/p/Makefile | 2 +- libr/anal/p/anal_avr.c | 1 + libr/bin/format/mz/mz.c | 2 +- libr/bin/pdb/dbi.c | 6 +- libr/core/cmd_debug.c | 5 +- libr/core/p/Makefile | 12 +- libr/crypto/Makefile | 3 +- libr/{util => crypto}/des.c | 1 + libr/crypto/meson.build | 1 + libr/crypto/p/crypto_des.c | 8 +- libr/include/r_crypto.h | 1 + libr/include/{r_util => r_crypto}/r_des.h | 8 +- libr/include/r_slist.h | 45 ---- libr/include/r_types.h | 9 +- libr/include/r_util.h | 2 - libr/include/r_util/r_mixed.h | 29 --- libr/include/r_util/r_trie.h | 24 -- libr/include/sdb/sdb.h | 7 +- libr/include/sdb/sdb_version.h | 2 +- libr/meson.build | 3 + libr/util/Makefile | 8 +- libr/util/binheap.c | 4 +- libr/util/btree.c | 84 +++--- libr/util/iconv.c | 35 --- libr/util/meson.build | 3 - libr/util/mixed.c | 301 ---------------------- libr/util/pie.c | 30 +-- libr/util/slist.c | 197 -------------- libr/util/trie.c | 191 -------------- pkgcfg/r_anal.pc.acr | 2 +- shlr/sdb/config.mk | 2 +- shlr/sdb/src/array.c | 6 + shlr/sdb/src/dict.c | 44 ++-- shlr/sdb/src/disk.c | 3 +- shlr/sdb/src/ht.c | 4 - shlr/sdb/src/sdb.c | 10 +- shlr/sdb/src/sdb.h | 7 +- 47 files changed, 167 insertions(+), 963 deletions(-) rename libr/{util => crypto}/des.c (99%) rename libr/include/{r_util => r_crypto}/r_des.h (81%) delete mode 100644 libr/include/r_slist.h delete mode 100644 libr/include/r_util/r_mixed.h delete mode 100644 libr/include/r_util/r_trie.h delete mode 100644 libr/util/iconv.c delete mode 100644 libr/util/mixed.c delete mode 100644 libr/util/slist.c delete mode 100644 libr/util/trie.c diff --git a/binr/rafind2/Makefile b/binr/rafind2/Makefile index 269b8faf11faa..9d1c1240e0f29 100644 --- a/binr/rafind2/Makefile +++ b/binr/rafind2/Makefile @@ -1,6 +1,6 @@ BIN=rafind2 -BINDEPS=r_search r_io r_asm r_anal r_reg r_cons r_lang +BINDEPS=r_search r_io r_asm r_anal r_reg r_cons r_lang r_crypto BINDEPS+=r_socket r_parse r_util r_syscall r_flag r_hash include ../rules.mk diff --git a/binr/rafind2/meson.build b/binr/rafind2/meson.build index e50ce6e7c1243..57ce954ce70ee 100644 --- a/binr/rafind2/meson.build +++ b/binr/rafind2/meson.build @@ -3,6 +3,7 @@ executable('rafind2', 'rafind2.c', dependencies: [ r_util_dep, r_search_dep, + r_crypto_dep, r_io_dep, r_cons_dep ], diff --git a/binr/ragg2/Makefile b/binr/ragg2/Makefile index bf1fe5ab671a1..bfad58a8d3054 100644 --- a/binr/ragg2/Makefile +++ b/binr/ragg2/Makefile @@ -1,7 +1,7 @@ BIN=ragg2 BINDEPS=r_egg r_syscall r_asm BINDEPS+=r_core r_hash r_debug r_fs r_config r_bp r_crypto r_cons -BINDEPS+=r_lang r_parse r_anal r_reg r_flag +BINDEPS+=r_lang r_parse r_anal r_reg r_flag r_crypto BINDEPS+=r_bin r_search r_io r_socket BINDEPS+=r_magic r_util diff --git a/binr/rahash2/Makefile b/binr/rahash2/Makefile index 9ed92199d9e28..f7827d1ad0c5b 100644 --- a/binr/rahash2/Makefile +++ b/binr/rahash2/Makefile @@ -3,7 +3,7 @@ BIN=rahash2 BINDEPS=r_io r_hash r_socket r_asm r_cons BINDEPS+=r_anal r_syscall r_reg r_parse BINDEPS+=r_flag r_lang r_crypto r_util -BINDEPS+=r_search +BINDEPS+=r_search r_crypto include ../rules.mk diff --git a/binr/rasm2/Makefile b/binr/rasm2/Makefile index 9eb293b645ef3..d7734d26519b5 100644 --- a/binr/rasm2/Makefile +++ b/binr/rasm2/Makefile @@ -1,4 +1,4 @@ BIN=rasm2 BINDEPS=r_asm r_parse r_syscall r_anal r_reg r_hash -BINDEPS+=r_flag r_cons r_lang r_util r_search +BINDEPS+=r_flag r_cons r_lang r_util r_search r_crypto include ../rules.mk diff --git a/binr/rasm2/meson.build b/binr/rasm2/meson.build index bdf12034ffa85..e6ac0d15acb49 100644 --- a/binr/rasm2/meson.build +++ b/binr/rasm2/meson.build @@ -4,6 +4,7 @@ executable('rasm2', 'rasm2.c', r_util_dep, r_asm_dep, r_anal_dep, + r_crypto_dep, r_syscall_dep, r_hash_dep, sdb_dep diff --git a/binr/rax2/rax2.c b/binr/rax2/rax2.c index 3ba6df580d122..d5d53daedec7d 100644 --- a/binr/rax2/rax2.c +++ b/binr/rax2/rax2.c @@ -568,7 +568,7 @@ static int use_stdin() { return 0; } -int main(int argc, char **argv) { +R_API int r_core_main_rax2(int argc, char **argv) { int i; num = r_num_new (NULL, NULL, NULL); if (argc == 1) { @@ -579,5 +579,11 @@ int main(int argc, char **argv) { } } r_num_free (num); + num = NULL; return 0; } + + +int main(int argc, char **argv) { + return r_core_main_rax2 (argc, argv); +} diff --git a/libr/Makefile b/libr/Makefile index 91b0ccd337a62..5ec2a4dfabb9d 100644 --- a/libr/Makefile +++ b/libr/Makefile @@ -172,8 +172,10 @@ install-includes: done) ${INSTALL_DIR} "${DESTDIR}${INCLUDEDIR}/libr/r_util" (cd include/r_util && for FILE in * ; do \ - ${INSTALL_DATA} $$FILE "${DESTDIR}${INCLUDEDIR}/libr/r_util/$$FILE" ; \ - done) + ${INSTALL_DATA} $$FILE "${DESTDIR}${INCLUDEDIR}/libr/r_util/$$FILE" ; done) + ${INSTALL_DIR} "${DESTDIR}${INCLUDEDIR}/libr/r_crypto" + (cd include/r_crypto && for FILE in * ; do \ + ${INSTALL_DATA} $$FILE "${DESTDIR}${INCLUDEDIR}/libr/r_crypto/$$FILE" ; done) symstall install-symlink: @cd .. && \ diff --git a/libr/anal/Makefile b/libr/anal/Makefile index 424649ba7517f..d4beca74a0aaa 100644 --- a/libr/anal/Makefile +++ b/libr/anal/Makefile @@ -4,7 +4,7 @@ EXTRA_TARGETS+=do EXTRA_CLEAN=doclean NAME=r_anal -DEPS=r_util r_reg r_syscall r_search r_cons r_flag r_hash +DEPS=r_util r_reg r_syscall r_search r_cons r_flag r_hash r_crypto CFLAGS+=-DCORELIB -Iarch -I$(TOP)/shlr CFLAGS+=-I$(LTOP)/asm/arch/include diff --git a/libr/anal/meson.build b/libr/anal/meson.build index 23dd573234749..32a80fdd98d71 100644 --- a/libr/anal/meson.build +++ b/libr/anal/meson.build @@ -127,6 +127,7 @@ r_anal = library('r_anal', files, r_util_dep, r_reg_dep, r_asm_dep, + r_crypto_dep, r_search_dep, r_cons_dep, r_syscall_dep, @@ -154,6 +155,7 @@ pkgconfig_mod.generate( 'r_util', 'r_reg', 'r_asm', + 'r_crypto', 'r_syscall', 'r_search', 'r_cons', diff --git a/libr/anal/p/Makefile b/libr/anal/p/Makefile index 7f2a73e704b71..153ad3f7d4a1d 100644 --- a/libr/anal/p/Makefile +++ b/libr/anal/p/Makefile @@ -2,7 +2,7 @@ include ../../config.mk include ../../../mk/platform.mk CFLAGS+=-I../../include -I../arch -Wall -shared $(PIC_CFLAGS) ${LDFLAGS_LIB} ${LDFLAGS_LINKPATH}.. -CFLAGS+=-L../../util -lr_util -L../../anal -lr_anal -L../../reg -lr_reg +CFLAGS+=-L../../util -lr_util -L../../anal -lr_anal -L../../reg -lr_reg -L../../crypto -lr_crypto LDFLAGS+=${LINK} CURDIR= diff --git a/libr/anal/p/anal_avr.c b/libr/anal/p/anal_avr.c index 8ec8ed6b76570..668075836364a 100644 --- a/libr/anal/p/anal_avr.c +++ b/libr/anal/p/anal_avr.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/libr/bin/format/mz/mz.c b/libr/bin/format/mz/mz.c index 744bd5039b335..afca2b1404053 100644 --- a/libr/bin/format/mz/mz.c +++ b/libr/bin/format/mz/mz.c @@ -43,7 +43,7 @@ static void trv_segs (const void *seg, const void *segs) { const ut8 * const mseg = (const ut8 * const)seg; ut16 ** const msegs = (ut16 **)segs; if (mseg && msegs && *msegs) { - r_write_le16(*msegs, r_read_le16(mseg)); + r_write_le16 (*msegs, r_read_le16 (mseg)); *msegs = *msegs + 1; } } diff --git a/libr/bin/pdb/dbi.c b/libr/bin/pdb/dbi.c index 7291d957c1ca4..62be3a706ae6e 100644 --- a/libr/bin/pdb/dbi.c +++ b/libr/bin/pdb/dbi.c @@ -3,7 +3,7 @@ #include "stream_file.h" #include "tpi.h" -#define _ALIGN 4 +#define PDB_ALIGN 4 /////////////////////////////////////////////////////////////////////////////// static void free_dbi_stream(void *stream) { @@ -145,8 +145,8 @@ void parse_dbi_stream(void *parsed_pdb_stream, R_STREAM_FILE *stream_file) { } // TODO: rewrite for signature where can to do chech CAN_READ true? sz = parse_dbi_ex_header (p_tmp, size, dbi_ex_header); - if ((sz % _ALIGN)) { - sz = sz + (_ALIGN - (sz % _ALIGN)); + if ((sz % PDB_ALIGN)) { + sz = sz + (PDB_ALIGN - (sz % PDB_ALIGN)); } i += sz; p_tmp += sz; diff --git a/libr/core/cmd_debug.c b/libr/core/cmd_debug.c index 31afcf3a55c62..3aca2ffe70614 100644 --- a/libr/core/cmd_debug.c +++ b/libr/core/cmd_debug.c @@ -3401,7 +3401,7 @@ static RTreeNode *add_trace_tree_child (Sdb *db, RTree *t, RTreeNode *cur, ut64 snprintf (dbkey, TN_KEY_LEN, TN_KEY_FMT, addr); t_node = (struct trace_node *)(size_t)sdb_num_get (db, dbkey, NULL); if (!t_node) { - t_node = (struct trace_node *)malloc (sizeof (*t_node)); + t_node = R_NEW0 (struct trace_node); t_node->addr = addr; t_node->refs = 1; sdb_num_set (db, dbkey, (ut64)(size_t)t_node, 0); @@ -3475,7 +3475,8 @@ static void do_debug_trace_calls(RCore *core, ut64 from, ut64 to, ut64 final_add } if (debug_to != UT64_MAX && !r_debug_continue_until (dbg, debug_to)) { break; - } else if (!r_debug_step (dbg, 1)) { + } + if (!r_debug_step (dbg, 1)) { break; } debug_to = UT64_MAX; diff --git a/libr/core/p/Makefile b/libr/core/p/Makefile index b1bd10bf2db34..cc866d80e5cff 100644 --- a/libr/core/p/Makefile +++ b/libr/core/p/Makefile @@ -2,24 +2,24 @@ include ../../config.mk include ../../../mk/platform.mk include ../../../shlr/zip/deps.mk -CFLAGS+=-I../../include -Wall -shared ${PIC_CFLAGS} ${LDFLAGS_LIB} ${LDFLAGS_LINKPATH}.. +CFLAGS+=-I../../include -Wall -shared +CFLAGS+=${PIC_CFLAGS} ${LDFLAGS_LIB} ${LDFLAGS_LINKPATH}.. CFLAGS+=-L../../util -lr_util -L../../reg -lr_reg -L.. -lr_core -#CFLAGS+=-L../../db -lr_db CFLAGS+=-L../../cons -lr_cons -L../../bin -lr_bin CFLAGS+=-L../../parse -lr_parse -L../../io -lr_io -L../../fs -lr_fs -CFLAGS+=-L../../magic -lr_magic -L../../hash -lr_hash -L../../config -lr_config +CFLAGS+=-L../../magic -lr_magic -L../../hash -lr_hash +CFLAGS+=-L../../config -lr_config CFLAGS+=-L../../anal -lr_anal -L../../egg -lr_egg -L../../flag -lr_flag CFLAGS+=-L../../syscall -lr_syscall -L../../socket -lr_socket -L../../search -lr_search CFLAGS+= -L../../lang -lr_lang -L../../debug -lr_debug CFLAGS+=-L../../bp -lr_bp -L../../reg -lr_reg -L../../asm -lr_asm -#CFLAGS+=../../../shlr/sdb/src/libsdb.a - LDFLAGS+=$(STOP)/sdb/src/libsdb.a + include $(STOP)/java/deps.mk include $(STOP)/gdb/deps.mk include $(STOP)/windbg/deps.mk -#CFLAGS+=-L../../anal -lr_anal -L../../core -lr_core + LDFLAGS+=${LINK} ifeq ($(WITHPIC),1) diff --git a/libr/crypto/Makefile b/libr/crypto/Makefile index 11caf87400f0f..871c1786bb7e4 100644 --- a/libr/crypto/Makefile +++ b/libr/crypto/Makefile @@ -9,7 +9,8 @@ foo: include ${STATIC_CRYPTO_PLUGINS} STATIC_OBJS=$(subst ..,p/..,$(subst crypto_,p/crypto_,$(STATIC_OBJ))) -OBJS=${STATIC_OBJS} crypto.o + +OBJS=${STATIC_OBJS} crypto.o des.o pre: @if [ ! -e ${LIBSO} ]; then rm -f ${STATIC_OBJS} ; fi diff --git a/libr/util/des.c b/libr/crypto/des.c similarity index 99% rename from libr/util/des.c rename to libr/crypto/des.c index aab1767163886..f1e5f6b782c30 100644 --- a/libr/util/des.c +++ b/libr/crypto/des.c @@ -1,5 +1,6 @@ #include #include + #define ROTL28(rs, sh) ((((rs) << (sh)) | ((rs) >> (28 - (sh)))) & 0x0FFFFFFF) // left 28 #define ROTL(rs, sh) (((rs) << (sh)) | ((rs) >> (32 - (sh)))) // left 32 #define ROTR(rs, sh) (((rs) >> (sh)) | ((rs) << (32 - (sh)))) // right 32 diff --git a/libr/crypto/meson.build b/libr/crypto/meson.build index ff352946fa569..5b14b2e0b9b34 100644 --- a/libr/crypto/meson.build +++ b/libr/crypto/meson.build @@ -1,4 +1,5 @@ files = [ + 'des.c', 'crypto.c', 'p/crypto_aes.c', 'p/crypto_aes_algo.c', diff --git a/libr/crypto/p/crypto_des.c b/libr/crypto/p/crypto_des.c index 3e2fd91f9d6f1..3634affaa8753 100644 --- a/libr/crypto/p/crypto_des.c +++ b/libr/crypto/p/crypto_des.c @@ -114,9 +114,9 @@ static bool update (RCrypto *cry, const ut8 *buf, int len) { } // Pad to the block size, do not append dummy block - const int diff = (BLOCK_SIZE - (len % BLOCK_SIZE)) % BLOCK_SIZE; + const int diff = (DES_BLOCK_SIZE - (len % DES_BLOCK_SIZE)) % DES_BLOCK_SIZE; const int size = len + diff; - const int blocks = size / BLOCK_SIZE; + const int blocks = size / DES_BLOCK_SIZE; ut8 *const obuf = calloc (1, size); if (!obuf) { @@ -140,12 +140,12 @@ static bool update (RCrypto *cry, const ut8 *buf, int len) { int i; if (cry->dir) { for (i = 0; i < blocks; i++) { - ut32 next = (BLOCK_SIZE * i); + ut32 next = (DES_BLOCK_SIZE * i); des_decrypt (&st, ibuf + next, obuf + next); } } else { for (i = 0; i < blocks; i++) { - ut32 next = (BLOCK_SIZE * i); + ut32 next = (DES_BLOCK_SIZE * i); des_encrypt (&st, ibuf + next, obuf + next); } } diff --git a/libr/include/r_crypto.h b/libr/include/r_crypto.h index 41d119e990ad2..ec34fd15b034c 100644 --- a/libr/include/r_crypto.h +++ b/libr/include/r_crypto.h @@ -3,6 +3,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { diff --git a/libr/include/r_util/r_des.h b/libr/include/r_crypto/r_des.h similarity index 81% rename from libr/include/r_util/r_des.h rename to libr/include/r_crypto/r_des.h index d510b9831325b..5194afe18b778 100644 --- a/libr/include/r_util/r_des.h +++ b/libr/include/r_crypto/r_des.h @@ -2,16 +2,16 @@ #define R_DES_H #define DES_KEY_SIZE 8 -#define BLOCK_SIZE 8 +#define DES_BLOCK_SIZE 8 #ifdef __cplusplus extern "C" { #endif typedef struct des_context_t { - ut32 round_key_lo[16]; // round key low - ut32 round_key_hi[16]; // round key hi - int round; + ut32 round_key_lo[16]; // round key low + ut32 round_key_hi[16]; // round key hi + int round; } RDESContext; R_API void r_des_permute_key (ut32 *keylo, ut32 *keyhi); diff --git a/libr/include/r_slist.h b/libr/include/r_slist.h deleted file mode 100644 index 80b9dcab6c566..0000000000000 --- a/libr/include/r_slist.h +++ /dev/null @@ -1,45 +0,0 @@ -/* radare - LGPL - Copyright 2013-2017 - pancake */ - -/* sliced list implementation */ - -#ifndef R2_SLIST_H -#define R2_SLIST_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct r_slist_item_t { - ut64 from; - ut64 to; - void *data; -} RSListItem; - -typedef struct r_slist_t { - RList *list; - ut64 min; - ut64 max; - int mod; - int *last; - int lastslot; - int nitems; - RSListItem ***items; - void **alloc; -} RSList; - -R_API RSList *r_slist_new (void); -R_API void r_slist_free (RSList *s); -R_API int r_slist_get_slot(RSList *s, ut64 addr); -R_API RSList *r_slist_add (RSList *s, void *data, ut64 from, ut64 to); -R_API RSListItem **r_slist_get (RSList *s, ut64 addr); -R_API void r_slist_del (RSList *s, RSListItem *p); -R_API void *r_slist_get_at (RSList *list, ut64 addr); -R_API void r_slist_optimize (RSList *s); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libr/include/r_types.h b/libr/include/r_types.h index c7c3ca983bb44..06422d0d4e119 100644 --- a/libr/include/r_types.h +++ b/libr/include/r_types.h @@ -361,8 +361,15 @@ static inline void *r_new_copy(int size, void *data) { #define typeof(arg) __typeof__(arg) #endif -#undef r_offsetof +#if 1 #define r_offsetof(type, member) offsetof(type, member) +#else +#if __SDB_WINDOWS__ && !__CYGWIN__ +#define r_offsetof(type, member) ((unsigned long) (ut64)&((type*)0)->member) +#else +#define r_offsetof(type, member) ((unsigned long) &((type*)0)->member) +#endif +#endif #define R_BETWEEN(x,y,z) (((y)>=(x)) && ((y)<=(z))) #define R_ROUND(x,y) ((x)%(y))?(x)+((y)-((x)%(y))):(x) diff --git a/libr/include/r_util.h b/libr/include/r_util.h index 1d2f6033157f3..37f3f614226c2 100644 --- a/libr/include/r_util.h +++ b/libr/include/r_util.h @@ -39,12 +39,10 @@ int gettimeofday (struct timeval* p, void* tz); #include "r_util/r_debruijn.h" #include "r_util/r_cache.h" #include "r_util/r_ctypes.h" -#include "r_util/r_des.h" #include "r_util/r_file.h" #include "r_util/r_hex.h" #include "r_util/r_log.h" #include "r_util/r_mem.h" -#include "r_util/r_mixed.h" #include "r_util/r_name.h" #include "r_util/r_num.h" #include "r_util/r_graph.h" diff --git a/libr/include/r_util/r_mixed.h b/libr/include/r_util/r_mixed.h deleted file mode 100644 index a15e3cd931056..0000000000000 --- a/libr/include/r_util/r_mixed.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef R_MIXED_H -#define R_MIXED_H -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define RMIXED_MAXKEYS 256 -typedef struct r_mixed_data_t { - int size; - union { - SdbHt *ht; - SdbHt *ht64; - } hash; -} RMixedData; - -typedef struct r_mixed_t { - RList *list; - RMixedData *keys[RMIXED_MAXKEYS]; - ut64 state[RMIXED_MAXKEYS]; // used by change_(begin|end) -} RMixed; - -#ifdef __cplusplus -} -#endif - -#endif // R_MIXED_H diff --git a/libr/include/r_util/r_trie.h b/libr/include/r_util/r_trie.h deleted file mode 100644 index c7d61108fb04a..0000000000000 --- a/libr/include/r_util/r_trie.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef R_TRIE_H -#define R_TRIE_H -#include "r_types.h" - -#define ALPHABET_SIZE 63 // A-Z, a-z, 0-9 and _ - -typedef struct r_trie_node { - struct r_trie_node * child[ALPHABET_SIZE]; - int is_leaf; - void * data; -} RTrieNode; - -typedef struct r_trie { - RTrieNode *root; -} RTrie; - -R_API RTrie *r_trie_new(void); -R_API bool r_trie_insert(RTrie * t, char * name, void * f); -R_API bool r_trie_update(RTrie * t, char * name, void * f); -R_API bool r_trie_delete(RTrie * t, char * name); -R_API bool r_trie_erase(RTrie ** t, char * name); -R_API void *r_trie_find(RTrie * t, char * name); -R_API void r_trie_free(RTrie ** t); -#endif diff --git a/libr/include/sdb/sdb.h b/libr/include/sdb/sdb.h index e8333d0a3837f..8a86b775e4e36 100644 --- a/libr/include/sdb/sdb.h +++ b/libr/include/sdb/sdb.h @@ -2,6 +2,7 @@ #define SDB_H #if !defined(O_BINARY) && !defined(_MSC_VER) +#undef O_BINARY #define O_BINARY 0 #endif @@ -17,9 +18,6 @@ extern "C" { #include "cdb_make.h" #include "sdb_version.h" -#undef r_offsetof -#define r_offsetof(type, member) ((unsigned long) &((type*)0)->member) - /* Key value sizes */ #define SDB_MIN_VALUE 1 #define SDB_MAX_VALUE 0xffffff @@ -46,8 +44,7 @@ extern char *strdup (const char *); #include // for _aligned_malloc #define ftruncate _chsize #endif -#undef r_offsetof -#define r_offsetof(type, member) ((unsigned long) (ut64)&((type*)0)->member) + //#define SDB_MODE 0 #define SDB_MODE _S_IWRITE | _S_IREAD #else diff --git a/libr/include/sdb/sdb_version.h b/libr/include/sdb/sdb_version.h index 565c3ea49004f..0c214755a33dc 100644 --- a/libr/include/sdb/sdb_version.h +++ b/libr/include/sdb/sdb_version.h @@ -1 +1 @@ -#define SDB_VERSION "1.2.0" +#define SDB_VERSION "1.3.0" diff --git a/libr/meson.build b/libr/meson.build index 70eb46e46873b..653ea51740032 100644 --- a/libr/meson.build +++ b/libr/meson.build @@ -315,6 +315,9 @@ install_headers(include_files, subdir: 'libr') r_util_files = run_command(glob_cmd + ['include/r_util/*.h']).stdout().strip().split(';') install_headers(r_util_files, subdir: 'libr/r_util') +r_crypto_files = run_command(glob_cmd + ['include/r_crypto/*.h']).stdout().strip().split(';') +install_headers(r_crypto_files, subdir: 'libr/r_crypto') + sdb_files = run_command(glob_cmd + ['include/sdb/*.h']).stdout().strip().split(';') install_headers(sdb_files, subdir: 'libr/sdb') diff --git a/libr/util/Makefile b/libr/util/Makefile index 57d661829ff58..e626bf2dc5eea 100644 --- a/libr/util/Makefile +++ b/libr/util/Makefile @@ -13,15 +13,15 @@ endif OBJS=binheap.o mem.o unum.o str.o hex.o file.o range.o tinyrange.o OBJS+=prof.o cache.o sys.o buf.o w32-sys.o ubase64.o base85.o base91.o -OBJS+=list.o flist.o mixed.o btree.o chmod.o graph.o event.o +OBJS+=list.o flist.o btree.o chmod.o graph.o event.o OBJS+=regex/regcomp.o regex/regerror.o regex/regexec.o uleb128.o OBJS+=sandbox.o calc.o thread.o thread_sem.o thread_lock.o thread_cond.o OBJS+=strpool.o bitmap.o date.o format.o pie.o print.o ctype.o -OBJS+=seven.o slist.o randomart.o zip.o debruijn.o log.o +OBJS+=seven.o randomart.o zip.o debruijn.o log.o OBJS+=utf8.o utf16.o utf32.o strbuf.o lib.o name.o spaces.o signal.o syscmd.o -OBJS+=diff.o bdiff.o stack.o queue.o tree.o des.o idpool.o assert.o +OBJS+=diff.o bdiff.o stack.o queue.o tree.o idpool.o assert.o OBJS+=punycode.o pkcs7.o x509.o asn1.o astr.o json_indent.o skiplist.o -OBJS+=r_json.o rbtree.o qrcode.o trie.o vector.o str_trim.o ascii_table.o +OBJS+=r_json.o rbtree.o qrcode.o vector.o str_trim.o ascii_table.o # DO NOT BUILD r_big api (not yet used and its buggy) ifeq (1,0) diff --git a/libr/util/binheap.c b/libr/util/binheap.c index d70e221d21c92..f0f2bf81620cc 100644 --- a/libr/util/binheap.c +++ b/libr/util/binheap.c @@ -1,3 +1,5 @@ +/* radare2 - LGPL - Copyright 2017-2018 - maskray */ + #include "r_binheap.h" static inline void _heap_down(RBinHeap *h, size_t i, void *x) { @@ -23,7 +25,7 @@ static inline void _heap_up(RBinHeap *h, size_t i, void *x) { } R_API void r_binheap_clear(RBinHeap *h) { - r_pvector_clear (&h->a); + r_pvector_clear (&h->a); } R_API void r_binheap_init(RBinHeap *h, RPVectorComparator cmp) { diff --git a/libr/util/btree.c b/libr/util/btree.c index 6a0366f971ba3..7cb7cd77f8049 100644 --- a/libr/util/btree.c +++ b/libr/util/btree.c @@ -19,7 +19,7 @@ R_API struct btree_node *btree_remove(struct btree_node *p, BTREE_DEL(del)) { f = rp; rp = rp->left; } - if (f!=p) { + if (f != p) { f->left = rp->right; rp->right = p->right; rp->left = p->left; @@ -36,7 +36,7 @@ R_API struct btree_node *btree_remove(struct btree_node *p, BTREE_DEL(del)) { del (p->data); } free (p); - return(rp); + return (rp); } R_API void *btree_search(struct btree_node *root, void *x, BTREE_CMP(cmp), int parent) { @@ -57,7 +57,8 @@ R_API void *btree_search(struct btree_node *root, void *x, BTREE_CMP(cmp), int p return root; } return p; - } return NULL; + } + return NULL; } R_API void btree_traverse(struct btree_node *root, int reverse, void *context, BTREE_TRV(trv)) { @@ -77,7 +78,7 @@ R_API void btree_traverse(struct btree_node *root, int reverse, void *context, B R_API bool btree_del(struct btree_node *proot, void *x, BTREE_CMP(cmp), BTREE_DEL(del)) { struct btree_node *p = btree_search (proot, x, cmp, 1); if (p) { - // p->right = + // p->right = btree_remove (p->left, del); p->left = NULL; return true; @@ -107,13 +108,13 @@ R_API void btree_cleartree(struct btree_node *proot, BTREE_DEL(del)) { R_API void btree_insert(struct btree_node **T, struct btree_node *p, BTREE_CMP(cmp)) { int ret = cmp (p->data, (*T)->data); - if (ret<0) { + if (ret < 0) { if ((*T)->left) { btree_insert (&(*T)->left, p, cmp); } else { (*T)->left = p; } - } else if (ret>0) { + } else if (ret > 0) { if ((*T)->right) { btree_insert (&(*T)->right, p, cmp); } else { @@ -123,7 +124,7 @@ R_API void btree_insert(struct btree_node **T, struct btree_node *p, BTREE_CMP(c } R_API void btree_add(struct btree_node **T, void *e, BTREE_CMP(cmp)) { - struct btree_node *p = (struct btree_node*) malloc (sizeof (struct btree_node)); + struct btree_node *p = (struct btree_node *)malloc (sizeof (struct btree_node)); p->data = e; p->hits = 0; p->left = p->right = NULL; @@ -136,14 +137,14 @@ R_API void btree_add(struct btree_node **T, void *e, BTREE_CMP(cmp)) { /* unused */ R_API int btree_empty(struct btree_node **T) { - return !( (T && (*T) && ((*T)->right || (*T)->left)) ); + return !((T && (*T) && ((*T)->right || (*T)->left))); } R_API struct btree_node *btree_hittest(struct btree_node *root, struct btree_node *hn) { struct btree_node *p = root; if (root) { - struct btree_node *ml = btree_hittest(root->left, root); - struct btree_node *mr = btree_hittest(root->right, root); + struct btree_node *ml = btree_hittest (root->left, root); + struct btree_node *mr = btree_hittest (root->right, root); if (ml && ml->hits > p->hits) { p = ml; } @@ -173,63 +174,66 @@ struct mydata { char *str; }; -int shownode(char *str, struct mydata *m) { - if (!m) +static int shownode(char *str, struct mydata *m) { + if (m) { + printf ("==> %s: %s, %" PFMT64d "\n", str, m->str, m->addr); + } else { printf ("==> not found\n"); - else printf ("==> %s: %s, %"PFMT64d"\n", str, m->str, m->addr); + } return 0; } -int mycmp(const void *a, const void *b) { +static int mycmp(const void *a, const void *b) { struct mydata *ma = (struct mydata *)a; struct mydata *mb = (struct mydata *)b; - if (!a || !b) return 0; - return (int)(ma->addr-mb->addr); + if (!a || !b) + return 0; + return (int)(ma->addr - mb->addr); } -int main() { +int main () { struct btree_node *n, *bt = NULL; //btree_init(&bt); struct mydata foo = { 10, "hello" }; struct mydata bar = { 20, "world" }; - printf("EMPTY TREE: %d\n", btree_empty(&bt)); - btree_add(&bt, &foo, mycmp); - btree_add(&bt, &bar, mycmp); - printf ("EMPTY TREE: %d\n", btree_empty(&bt)); + printf ("EMPTY TREE: %d\n", btree_empty (&bt)); + btree_add (&bt, &foo, mycmp); + btree_add (&bt, &bar, mycmp); + printf ("EMPTY TREE: %d\n", btree_empty (&bt)); -printf("==== go search ====\n"); + printf ("==== go search ====\n"); /* find existent data */ struct mydata *p = btree_get (bt, &bar, mycmp); - shownode("result for 20: ", p); + shownode ("result for 20: ", p); -printf("==== go search ====\n"); + printf ("==== go search ====\n"); /* find unexistent data */ struct mydata nop = { 15, NULL }; - p = btree_get(bt, &nop, mycmp); - shownode("result for 15: ", p); + p = btree_get (bt, &nop, mycmp); + shownode ("result for 15: ", p); -printf("==== go get hittest ====\n"); - n = btree_hittest(bt, NULL); - shownode("hitest is: ", p); + printf ("==== go get hittest ====\n"); + n = btree_hittest (bt, NULL); + shownode ("hitest is: ", p); -printf("==== go remove 20 ====\n"); - if (btree_del(bt, &bar, mycmp, NULL)) - printf("node found and removed\n"); - else printf("oops\n"); + printf ("==== go remove 20 ====\n"); + if (btree_del (bt, &bar, mycmp, NULL)) + printf ("node found and removed\n"); + else printf ("oops\n"); -printf("==== go search ====\n"); + printf ("==== go search ====\n"); /* find existent data */ - p = btree_get(bt, &bar, mycmp); - shownode("result for 20: ", p); + p = btree_get (bt, &bar, mycmp); + shownode ("result for 20: ", p); -printf("==== go search ====\n"); + printf ("==== go search ====\n"); /* find existent data */ - p = btree_get(bt, &foo, mycmp); - shownode("result for 10: ", p); + p = btree_get (bt, &foo, mycmp); + shownode ("result for 10: ", p); - btree_cleartree(bt, NULL); + btree_cleartree (bt, NULL); return 0; } #endif diff --git a/libr/util/iconv.c b/libr/util/iconv.c deleted file mode 100644 index 8c9b777594104..0000000000000 --- a/libr/util/iconv.c +++ /dev/null @@ -1,35 +0,0 @@ -/* radare - LGPL - Copyright 2013 - pancake */ - -#include -#include -#include - -char *r_str_iconv (const char *str, int *len) { - iconv_t cd; - char *inbuf = (char*)str; // XXX dangerous cast - size_t inbytesleft = strlen (str); - char data[1024]; - char *outbuf = (char*)&data; - size_t rest, outbytesleft = 1024; - rest = outbytesleft; - //cd = iconv_open ("ISO8859-15", "UTF-8"); - cd = iconv_open ("UTF-8", "UTF-8"); - if (cd == (iconv_t)-1) { - perror ("iconv_open"); - return NULL; - } - size_t s = iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); - iconv (cd, NULL, NULL, &outbuf, &outbytesleft); - rest -= outbytesleft; - data[rest] = 0; - printf ("S = %d (%s)\n", (int)rest, data); - iconv_close (cd); - if (len) *len = rest; - return strdup (data); -} - -int main() { - char *str = r_str_iconv ("hellç", NULL); - printf ("(((%s)))\n", str); - free (str); -} diff --git a/libr/util/meson.build b/libr/util/meson.build index 1f5090fc080fc..f12947bd98805 100644 --- a/libr/util/meson.build +++ b/libr/util/meson.build @@ -15,7 +15,6 @@ files = [ 'chmod.c', 'constr.c', 'debruijn.c', - 'des.c', 'diff.c', 'event.c', 'file.c', @@ -50,7 +49,6 @@ files = [ 'sandbox.c', 'signal.c', 'skiplist.c', - 'slist.c', 'spaces.c', 'stack.c', 'str.c', @@ -66,7 +64,6 @@ files = [ 'thread_pipe.c', 'tinyrange.c', 'tree.c', - 'trie.c', 'r_json.c', 'ubase64.c', 'uleb128.c', diff --git a/libr/util/mixed.c b/libr/util/mixed.c deleted file mode 100644 index 1e3113b4bbba4..0000000000000 --- a/libr/util/mixed.c +++ /dev/null @@ -1,301 +0,0 @@ -/* radare - LGPL - Copyright 2011 pancake */ - -#include - -#define STR64OFF(x) sdb_fmt ("%"PFMT64x, x) -#define STR32OFF(x) sdb_fmt ("%"PFMT32x, x) - -R_API RMixed *r_mixed_new () { - RMixed *m = R_NEW (RMixed); - if (!m) { - return NULL; - } - memset (m->keys, 0, sizeof (m->keys)); - m->list = r_list_new (); - return m; -} - -R_API void r_mixed_free (RMixed *m) { - int i; - for (i = 0; i < RMIXED_MAXKEYS; i++) { - if (m->keys[i]) { - switch (m->keys[i]->size) { - case 1: case 2: case 4: - ht_free (m->keys[i]->hash.ht); - break; - case 8: - ht_free (m->keys[i]->hash.ht64); - break; - } - free (m->keys[i]); - m->keys[i] = NULL; - } - } - r_list_purge (m->list); - free (m); -} - -R_API int r_mixed_key_check(RMixed *m, int key, int sz) { - if (key >= 0 && key < RMIXED_MAXKEYS) { - if (sz == 1 || sz == 2 || sz == 4 || sz == 8) - return true; - } - return false; -} - -static void _mixed_free_kv(HtKv *kv) { - free (kv->key); - r_list_free (kv->value); -} - -#define R_MIXED_KEY(m,x,y,z) r_mixed_key(m, r_offsetof(x,z), sizeof(y->z)) -R_API int r_mixed_key(RMixed *m, int key, int size) { - if (size > 0 && r_mixed_key_check (m, key, size)) { - if (m->keys[key]) { - m->keys[key]->size = size; - } else { - m->keys[key] = R_NEW (RMixedData); - if (!m->keys[key]) { - return false; - } - m->keys[key]->size = size; - switch (size) { - case 1: case 2: case 4: - m->keys[key]->hash.ht = ht_new (NULL, _mixed_free_kv, NULL); - return true; - case 8: m->keys[key]->hash.ht64 = ht_new (NULL, _mixed_free_kv, NULL); - return true; - } - } - } - return false; -} - -// static? -R_API ut64 r_mixed_get_value(int key, int sz, const void *p) { - switch (sz) { - case 1: return (ut64) *((ut8*)((ut8*)p + key)); - case 2: return (ut64) *((ut16*)((ut8*)p + key)); - case 4: return (ut64) *((ut32*)((ut8*)p + key)); - case 8: return (ut64) *((ut32*)((ut8*)p + key)); - } - return 0LL; -} - -R_API RList *r_mixed_get (RMixed *m, int key, ut64 value) { - if (key >= 0 && key < RMIXED_MAXKEYS) { - if (m->keys[key]) { - switch (m->keys[key]->size) { - case 1: - case 2: - case 4: - return ht_find (m->keys[key]->hash.ht, STR32OFF (value), NULL); - case 8: - return ht_find (m->keys[key]->hash.ht64, STR64OFF (value), NULL); - } - } - } - return NULL; -} - -R_API void *r_mixed_get0 (RMixed *m, int key, ut64 value) { - RList *list = r_mixed_get (m, key, value); - if (list && !r_list_empty (list)) { - RListIter *head = r_list_head (list); - if (head) { - return head->data; - } - } - return NULL; -} - - -R_API int r_mixed_add(RMixed *m, void *p) { - SdbHt *ht; - SdbHt *ht64; - RList *list = NULL; - ut64 value; - int i, size, ret = false;; - r_list_append (m->list, p); - for (i = 0; i < RMIXED_MAXKEYS; i++) { - if (!m->keys[i]) { - continue; - } - size = m->keys[i]->size; - value = r_mixed_get_value (i, size, p); - switch (size) { - case 1: case 2: case 4: - ht = m->keys[i]->hash.ht; - list = ht_find (ht, STR32OFF (value), NULL); - if (!list) { - list = r_list_new (); - ht_insert (ht, STR32OFF (value), list); - } - r_list_append (list, p); - ret = true; - break; - case 8: - ht64 = m->keys[i]->hash.ht64; - list = ht_find (ht64, STR64OFF (value), NULL); - if (!list) { - list = r_list_new (); - ht_insert (ht64, STR64OFF (value), list); - } - r_list_append (list, p); - ret = true; - break; - } - } - return ret; -} - -R_API int r_mixed_del (RMixed *m, void *p) { - int i; - r_list_delete_data (m->list, p); - for (i = 0; i < RMIXED_MAXKEYS; i++) { - ut64 value = r_mixed_get_value (i, m->keys[i]->size, p); - if (!m->keys[i]) continue; - switch (m->keys[i]->size) { - case 1: case 2: case 4: - ht_delete (m->keys[i]->hash.ht, STR32OFF (value)); - break; - case 8: - ht_delete (m->keys[i]->hash.ht64, STR64OFF (value)); - break; - } - } - return false; -} - -R_API void r_mixed_change_begin(RMixed *m, void *p) { - int i; - for (i = 0; i < RMIXED_MAXKEYS; i++) - if (m->keys[i]) { - m->state[i] = r_mixed_get_value (i, m->keys[i]->size, p); - eprintf ("store state %d (0x%08"PFMT64x")\n", i, m->state[i]); - } -} - -R_API bool r_mixed_change_end(RMixed *m, void *p) { - int i; - void *q; - for (i = 0; i < RMIXED_MAXKEYS; i++) { - if (m->keys[i]) { - SdbHt *ht = m->keys[i]->hash.ht; - SdbHt *ht64 = m->keys[i]->hash.ht64; - ut64 newstate = r_mixed_get_value (i, m->keys[i]->size, p); - if (newstate != m->state[i]) { - // rehash this pointer - RListIter *iter; - RList *list = r_mixed_get (m, i, m->state[i]); - if (!list) { - eprintf ("RMixed internal corruption?\n"); - return false; - } - /* No _safe loop necessary because we return immediately after the delete. */ - r_list_foreach (list, iter, q) { - if (q == p) { - r_list_delete (list, iter); - break; - } - } - if (r_list_empty (list)) { - // delete hash entry - r_list_free (list); - switch (m->keys[i]->size) { - case 1: case 2: case 4: - ht_delete (ht, STR32OFF (m->state[i])); - break; - case 8: - ht_delete (ht64, STR64OFF (m->state[i])); - break; - } - } - switch (m->keys[i]->size) { - case 1: case 2: case 4: - list = ht_find (ht, STR32OFF (newstate), NULL); - if (!list) { - list = r_list_new (); - ht_insert (ht, STR32OFF (newstate), list); - } - r_list_append (list, p); - break; - case 8: - list = ht_find (ht64, STR64OFF (newstate), NULL); - if (!list) { - list = r_list_new (); - ht_insert (ht64, STR64OFF (newstate), list); - } - r_list_append (list, p); - break; - } - } - } - } - return true; -} - -#if TEST -typedef struct { - char *name; - ut32 hashname; - int length; - ut64 offset; -} TestStruct; - -TestStruct *test_struct_new(const char *name, int length, ut64 offset) { - TestStruct *ts = R_NEW (TestStruct); - ts->name = strdup (name); - ts->hashname = r_str_hash (name); - ts->length = length; - ts->offset = offset; - return ts; -} - -void test_struct_free(TestStruct *ts) { - free (ts->name); - free (ts); -} - -int main () { - RList *list; - RListIter *iter; - TestStruct *ts, *ts2; - RMixed *mx = r_mixed_new (); - R_MIXED_KEY (mx, TestStruct, ts, hashname); - R_MIXED_KEY (mx, TestStruct, ts, length); - R_MIXED_KEY (mx, TestStruct, ts, offset); - - ts2 = test_struct_new ("FOOD", 444, 0x123456789); - r_mixed_add (mx, ts2); - - r_mixed_add (mx, test_struct_new ("food", 12, 0x839481222000)); - r_mixed_add (mx, test_struct_new ("food", 12, 0x839481222000)); - r_mixed_add (mx, test_struct_new ("baar", 12, 0x441242910)); - r_mixed_add (mx, test_struct_new ("cocktel", 12, 0x224944)); - r_mixed_add (mx, test_struct_new ("cocktel2", 16, 0x224944)); - r_mixed_add (mx, test_struct_new ("cocktel3", 17, 0x224944)); - - ts = r_mixed_get0 (mx, r_offsetof (TestStruct, hashname), (ut64)r_str_hash ("food")); - if (ts) { - printf ("NAM: %s\n", ts->name); - printf ("LEN: %d\n", ts->length); - printf ("OFF: %llx\n", ts->offset); - } else eprintf ("oops. cannot find 'food'\n"); - - eprintf ("--\n"); - list = r_mixed_get (mx, r_offsetof (TestStruct, offset), 0x224944); - r_list_foreach (list, iter, ts) { - printf ("NAM: %s\n", ts->name); - printf ("LEN: %d\n", ts->length); - printf ("OFF: %llx\n", ts->offset); - } - - r_mixed_change_begin (mx, ts2); - ts2->length = 666; - if (!r_mixed_change_end (mx, ts2)) { - eprintf ("MixedChange failed\n"); - } - r_mixed_free (mx); -} -#endif diff --git a/libr/util/pie.c b/libr/util/pie.c index 75c41b1c2db57..c37ae06db0152 100644 --- a/libr/util/pie.c +++ b/libr/util/pie.c @@ -12,12 +12,12 @@ static void drawSectorLine(char *out, int size, int percent) { int i, x, y; - double A = (percent) * PI / 50; - double foo = 0.1; - for (i = (size-1) / 2; i < (size-3) ; i++) { - x = y = (size - 1)/ 2; + double A = (percent)*PI / 50; + double foo = 0.1; + for (i = (size - 1) / 2; i < (size - 3); i++) { + x = y = (size - 1) / 2; x += cos (A) * foo + 1; - y += sin (A) *foo + 1 ; + y += sin (A) * foo + 1; foo += 1.1; O = ':'; } @@ -29,14 +29,14 @@ R_API int r_print_pie(RPrint *p, ut64 *values, int nvalues, int size) { int i, x, y; if (nv && out) { ut64 total = 0; - for (i = 0; iradius-0.5 && distance radius - 0.5 && distance < radius + 0.5) ? '.' : ' '; } } #endif int amount = 0; - for (i = 0; i< nvalues; i++) { + for (i = 0; i < nvalues; i++) { drawSectorLine (out, size, nv[i] + amount); amount += nv[i]; } @@ -76,7 +76,7 @@ R_API int r_print_pie(RPrint *p, ut64 *values, int nvalues, int size) { for (y = 0; y < size; y++) { p->cb_printf ("%c%c", O, O); } - p->cb_printf("\n"); + p->cb_printf ("\n"); } } } diff --git a/libr/util/slist.c b/libr/util/slist.c deleted file mode 100644 index 362a404f899ec..0000000000000 --- a/libr/util/slist.c +++ /dev/null @@ -1,197 +0,0 @@ -/* radare - LGPL - Copyright 2013-2017 - pancake */ -// -- work in progress -- // - -#include "r_slist.h" - -R_API RSList *r_slist_new() { - RSList *s = R_NEW0 (RSList); - if (!s) { - return NULL; - } - s->list = r_list_new (); - if (!s->list) { - r_slist_free (s); - return NULL; - } - return s; -} - -R_API void r_slist_free(RSList *s) { - free (s->items); - free (s->alloc); - r_list_free (s->list); - free (s); -} - -R_API int r_slist_get_slot(RSList *s, ut64 addr) { - if (s->min == 0 && s->min == s->max) { - return -1; - } - if (addr < s->min || addr > s->max) { - return -1; - } - return (addr - s->min) / s->mod; -} - -static RSListItem *get_new_item() { - // TODO: use slices here! - return malloc (sizeof (RSListItem)); -} - -R_API RSList *r_slist_add(RSList *s, void *data, ut64 from, ut64 to) { - ut64 at = from; - int slot, lastslot; - RSListItem *item = get_new_item (); - if (!item) { - return NULL; - } - //RSListItem **items; - // append to list - item->from = from; - item->to = to; - item->data = data; - r_list_append (s->list, item); // item must be alloacted by slices - // find slot - slot = r_slist_get_slot (s, from); - if (slot < 0) { - //r_slist_optimize (); - return NULL; - } - while (at < to && slot < s->nitems) { - lastslot = s->last[slot]; - if (lastslot == s->lastslot) { - // must optimize and exit - //r_slist_optimize(); - return NULL; - } - s->items[slot][lastslot] = item; - s->last[slot]++; - at += s->mod; - slot++; - } - // append to slot - //RSlistItem *item = additem (data, from, to); - //r_list_append (item); - s->items++; - return NULL; -} - -R_API RSListItem **r_slist_get(RSList *s, ut64 addr) { - int idx; - ut64 base; - if (s->min == 0 && s->min == s->max) { - return NULL; - } - if (addr < s->min || addr > s->max) { - return NULL; - } - base = addr - s->min; - idx = base / s->mod; - return s->items[idx]; -} - -// r_slist_get_iter() -// r_slist_iter_has_next() - -R_API void r_slist_del(RSList *s, RSListItem *p) { - // delete from s->list - // remove lists -} - -R_API void *r_slist_get_at(RSList *list, ut64 addr) { - return NULL; -} - -// called on add and del -R_API void r_slist_optimize(RSList *s) { - RSListItem *ptr; - RListIter *iter; - ut64 min, max; - int begin = 1; - - s->nitems = 0; - min = max = 0; - r_list_foreach (s->list, iter, ptr) { - s->nitems++; - if (begin) { - min = ptr->from; - max = ptr->to; - begin = 0; - } else { - if (ptr->from < min) { - min = ptr->from; - } - if (ptr->to > max) { - max = ptr->to; - } - } - } - - //eprintf ("MIN %d\nMAX %d\n", (int)min, (int)max); - - s->min = min; - s->max = max; - s->mod = ((max - min)); - if (s->nitems * sizeof (void *) < s->nitems) { - s->items = NULL; - } else { - s->items = malloc (1 + (sizeof (void *) * s->nitems)); - } -//eprintf ("MOD %d (block size)\n", s->mod); -// store integers as indexes inside the allocated heap - -/* - RArray *items = r_array_new (10, sizeof (RSListItem)); - RSListItem *idx = r_array_add (items); - idx->from = from; - idx->to = to; - idx->data = data; - items->length; - items->capacity; - int lidx = r_array_last_index (items); - r_array_add (idx); - -[ ptr ] [ -1 ] [ int ] -| -1 | '--' | -1 | - - items = malloc (sizeof (RSListItem), ); - items_capacity - RSListItem *itm = getitem (s->items[0]); - RSListItem item; - item.data = ptr; // RAnalFunction; - RSListItem *items; -INPUT - number of items - min offset - max offset -OUTPUT -*/ - // find better distribution - r_list_foreach (s->list, iter, ptr) { - //... - } -} - -/* -typedef struct { - -} SListStore; -typedef struct { - IntArray news; - ItemArray heap; - IntArray deleted; -} SList; --+- Store # We need N stores to avoid too sparsing - |- min |_ - |- max |_ - `- data |_ --+- QueueList # new additions are here - `- idxlist |_ ---- RangeCmp # user provided comparator function ---- IndexList # ---- Storage # Heap Array storing all elements - | We always use ---- StoreList # Heap Array of integers pointing to storage - | we can probably just store a list of removed - | items and the length -*/ diff --git a/libr/util/trie.c b/libr/util/trie.c deleted file mode 100644 index f4b15de2959b1..0000000000000 --- a/libr/util/trie.c +++ /dev/null @@ -1,191 +0,0 @@ -#include -#include "r_util/r_trie.h" - -static int c2_idx(char c) { - if (c <= 'Z' && c >= 'A') { - return c - 'A'; - } - if (c <= 'z' && c >= 'a') { - return c - 'a' + 26; - } - if (c <= '9' && c >= '0') { - return c - '0' + 26 * 2; - } - return 26*2 + 10; -} - -static RTrieNode *r_trie_new_node() { - RTrieNode *n = R_NEW0 (RTrieNode); - if (!n) { - return NULL; - } - int i; - for (i = 0; i < ALPHABET_SIZE; i++){ - n->child[i] = NULL; - } - n->is_leaf = 0; - return n; -} - -static RTrieNode *r_trie_node_insert(RTrieNode *n, char *name, void *f) { - if (!n) { - n = r_trie_new_node (); - } - if (!*name) { - n->data = f; - n->is_leaf = 1; - return n; - } - const int idx = c2_idx (*name); - n->child[idx] = r_trie_node_insert (n->child[idx], ++name, f); - return n; -} - -static void *r_trie_node_find(RTrieNode *n, char *name) { - if (!n) { - return NULL; - } - if (!name) { - return NULL; - } - if (!*name) { - if (n->is_leaf) { - return n->data; - } else { - return NULL; - } - } - const int idx = c2_idx (*name); - return r_trie_node_find (n->child[idx], ++name); -} - -static void r_trie_node_free(RTrieNode **n) { - if (!n || *n) { - return; - } - int i; - for (i = 0; i < ALPHABET_SIZE; i++){ - r_trie_node_free (&(*n)->child[i]); - } - R_FREE (*n); -} - -static bool r_trie_node_delete(RTrieNode **n, char *name) { - if (!n) { - return false; - } - if (!*n) { - return false; - } - if (!name) { - return false; - } - if (!*name) { - if ((*n)->is_leaf) { - (*n)->is_leaf = 0; - int i; - for (i = 0; i < ALPHABET_SIZE; i++) { - if ((*n)->child[i]) { - return true; - } - } - r_trie_node_free (n); - return true; - } else { - return false; - } - } - const int idx = c2_idx (*name); - const int result = r_trie_node_delete (&(*n)->child[idx], ++name); - if (!result) { - return false; - } - int i; - for (i = 0; i < ALPHABET_SIZE; i++) { - if ((*n)->child[i]) { - return true; - } - } - r_trie_node_free (n); - return true; -} - -R_API RTrie *r_trie_new() { - RTrie * n = R_NEW0 (RTrie); - if (!n) { - return NULL; - } - n->root = r_trie_new_node (); - if (!n->root) { - R_FREE (n); - return NULL; - } - return n; -} - -R_API bool r_trie_insert(RTrie * t, char * name, void * f) { - if (!t) { - return false; - } - RTrieNode *tmp = r_trie_node_insert (t->root, name, f); - if (!tmp) { - return false; - } - t->root = tmp; - return true; -} - -R_API bool r_trie_update(RTrie * t, char * name, void * f) { - return r_trie_insert (t, name, f); -} - -R_API void *r_trie_find(RTrie * t, char * name) { - if (!t) { - return NULL; - } - return r_trie_node_find (t->root, name); -} - -R_API void r_trie_free(RTrie ** t) { - if (!t) { - return; - } - if (!*t) { - return; - } - if ((*t)->root) { - r_trie_node_free (&(*t)->root); - } - R_FREE (*t); -} - -R_API bool r_trie_delete(RTrie * t, char * name) { - if (!t) { - return false; - } - if (!t->root) { - return false; - } - bool result = r_trie_node_delete (&t->root, name); - return result; -} - -/* Deletes 'name' and if the trie is empty frees and nulls it, - so it need to be reallocated next time we want to use it */ -R_API bool r_trie_erase(RTrie ** t, char * name) { - if (!t) { - return false; - } - if (!*t) { - return false; - } - if (!(*t)->root) { - return false; - } - bool result = r_trie_node_delete (&(*t)->root, name); - if (!(*t)->root) { - r_trie_free (t); - } - return result; -} - diff --git a/pkgcfg/r_anal.pc.acr b/pkgcfg/r_anal.pc.acr index 344bda75259c1..433373099a27d 100644 --- a/pkgcfg/r_anal.pc.acr +++ b/pkgcfg/r_anal.pc.acr @@ -6,6 +6,6 @@ includedir=${prefix}/include Name: r_anal Description: radare foundation libraries Version: @VERSION@ -Requires: r_util r_reg r_syscall r_search r_cons r_flag +Requires: r_util r_reg r_syscall r_search r_cons r_flag r_crypto Libs: -L${libdir} -lr_anal Cflags: -I${includedir}/libr diff --git a/shlr/sdb/config.mk b/shlr/sdb/config.mk index 264a5a2d0073e..d6e6ab9904b98 100644 --- a/shlr/sdb/config.mk +++ b/shlr/sdb/config.mk @@ -6,7 +6,7 @@ INCDIR=${PREFIX}/include VAPIDIR=${DATADIR}/vala/vapi/ MANDIR=${DATADIR}/man/man1 -SDBVER=1.2.0 +SDBVER=1.3.0 BUILD_MEMCACHE=0 diff --git a/shlr/sdb/src/array.c b/shlr/sdb/src/array.c index 16cdbbd028d28..d93eea684caec 100644 --- a/shlr/sdb/src/array.c +++ b/shlr/sdb/src/array.c @@ -212,6 +212,12 @@ SDB_API int sdb_array_set_num(Sdb *s, const char *key, int idx, ut64 val, SDB_API int sdb_array_add_num(Sdb *s, const char *key, ut64 val, ut32 cas) { char buf[SDB_NUM_BUFSZ]; char *v = sdb_itoa (val, buf, SDB_NUM_BASE); + if (!sdb_array_contains (s, key, v, NULL)) { + if (val < 256) { + char *v = sdb_itoa (val, buf, 10); + return sdb_array_add (s, key, v, cas); + } + } return sdb_array_add (s, key, v, cas); } diff --git a/shlr/sdb/src/dict.c b/shlr/sdb/src/dict.c index aeb92ca48132d..d9d38fd1f7f15 100644 --- a/shlr/sdb/src/dict.c +++ b/shlr/sdb/src/dict.c @@ -5,7 +5,7 @@ #include #include "sdb.h" -SDB_API dict *dict_new(ut32 size, dict_freecb f) { +SDB_API dict *dict_new (ut32 size, dict_freecb f) { dict *m = calloc (1, sizeof (dict)); if (!dict_init (m, R_MAX (size, 1), f)) { free (m); @@ -22,14 +22,14 @@ static ut32 dict_bucket(dict *m, dicti k) { return 0; } -SDB_API bool dict_init(dict *m, ut32 size, dict_freecb f) { +SDB_API bool dict_init (dict *m, ut32 size, dict_freecb f) { if (m) { memset (m, 0, sizeof (dict)); if (size > 0) { m->table = calloc (size, sizeof (dictkv)); if (!m->table) { return false; - } + } m->size = size; } m->f = f; @@ -37,7 +37,7 @@ SDB_API bool dict_init(dict *m, ut32 size, dict_freecb f) { return true; } -SDB_API void dict_fini(dict *m) { +SDB_API void dict_fini (dict *m) { ut32 i; if (m) { if (m->f) { @@ -45,7 +45,7 @@ SDB_API void dict_fini(dict *m) { dictkv *kv = m->table[i]; if (kv) { while (kv->k != MHTNO) { - m->f(kv->u); + m->f (kv->u); kv++; } } @@ -57,21 +57,21 @@ SDB_API void dict_fini(dict *m) { } } free (m->table); - dict_init(m, 0, NULL); + dict_init (m, 0, NULL); } } -SDB_API void dict_free(dict *m) { - dict_fini(m); +SDB_API void dict_free (dict *m) { + dict_fini (m); free (m); } // collisions are not handled in a dict. use a hashtable if you want to use strings as keys. -SDB_API dicti dict_hash(const char *s) { - return (dicti)sdb_hash(s); +SDB_API dicti dict_hash (const char *s) { + return (dicti)sdb_hash (s); } -SDB_API bool dict_set(dict *m, dicti k, dicti v, void *u) { +SDB_API bool dict_set (dict *m, dicti k, dicti v, void *u) { if (!m || !m->size || k == MHTNO) { return false; } @@ -114,7 +114,7 @@ SDB_API bool dict_set(dict *m, dicti k, dicti v, void *u) { return false; } -SDB_API void dict_stats(dict *m) { +SDB_API void dict_stats (dict *m) { ut32 i, j; for (i = 0; i < m->size; i++) { printf ("%d: ", i); @@ -130,7 +130,7 @@ SDB_API void dict_stats(dict *m) { } } -SDB_API dictkv *dict_getr(dict *m, dicti k) { +SDB_API dictkv *dict_getr (dict *m, dicti k) { if (!m->size) { return NULL; } @@ -147,23 +147,23 @@ SDB_API dictkv *dict_getr(dict *m, dicti k) { return NULL; } -SDB_API dicti dict_get(dict *m, dicti k) { +SDB_API dicti dict_get (dict *m, dicti k) { dictkv *kv = dict_getr (m, k); - return kv? kv->v: MHTNO; + return kv ? kv->v : MHTNO; } -SDB_API void *dict_getu(dict *m, dicti k) { +SDB_API void *dict_getu (dict *m, dicti k) { dictkv *kv = dict_getr (m, k); - return kv? kv->u: NULL; + return kv ? kv->u : NULL; } -SDB_API bool dict_add(dict *m, dicti k, dicti v, void *u) { - return dict_getr(m, k) - ? dict_set(m, k, v, u) +SDB_API bool dict_add (dict *m, dicti k, dicti v, void *u) { + return dict_getr (m, k) + ? dict_set (m, k, v, u) : false; } -SDB_API bool dict_del(dict *m, dicti k) { +SDB_API bool dict_del (dict *m, dicti k) { int bucket = dict_bucket (m, k); if (k == MHTNO) { return false; @@ -193,7 +193,7 @@ SDB_API bool dict_del(dict *m, dicti k) { // cb : function that accept a dictkv. When it returns a value != 0, the // iteration stops // u : additional information to pass to cb together with the dictkv -SDB_API void dict_foreach(dict *m, dictkv_cb cb, void *u) { +SDB_API void dict_foreach (dict *m, dictkv_cb cb, void *u) { bool iterate = true; ut32 i; diff --git a/shlr/sdb/src/disk.c b/shlr/sdb/src/disk.c index e98c018678f61..366c5b82a6161 100644 --- a/shlr/sdb/src/disk.c +++ b/shlr/sdb/src/disk.c @@ -1,4 +1,4 @@ -/* sdb - MIT - Copyright 2013-2016 - pancake */ +/* sdb - MIT - Copyright 2013-2018 - pancake */ #include #include @@ -13,7 +13,6 @@ #if UNICODE - static wchar_t *r_utf8_to_utf16_l (const char *cstring, int len) { if (!cstring || !len || len < -1) { return NULL; diff --git a/shlr/sdb/src/ht.c b/shlr/sdb/src/ht.c index 7cce84190a709..c1dcb4351216d 100644 --- a/shlr/sdb/src/ht.c +++ b/shlr/sdb/src/ht.c @@ -75,10 +75,6 @@ static inline HtKv *next_kv(SdbHt *ht, HtKv *kv) { return (HtKv *)((char *)kv + ht->elem_size); } -static inline HtKv *prev_kv(SdbHt *ht, HtKv *kv) { - return (HtKv *)((char *)kv - ht->elem_size); -} - #define BUCKET_FOREACH(ht, bt, j, kv) \ if ((bt)->arr) \ for ((j) = 0, (kv) = (bt)->arr; (j) < (bt)->count; (j)++, (kv) = next_kv (ht, kv)) diff --git a/shlr/sdb/src/sdb.c b/shlr/sdb/src/sdb.c index 34ab66f917f6d..f91a1d0cd0634 100644 --- a/shlr/sdb/src/sdb.c +++ b/shlr/sdb/src/sdb.c @@ -8,17 +8,19 @@ #include #include "sdb.h" +#if 0 static inline SdbKv *kv_at(SdbHt *ht, HtBucket *bt, ut32 i) { return (SdbKv *)((char *)bt->arr + i * ht->elem_size); } -static inline SdbKv *next_kv(SdbHt *ht, SdbKv *kv) { - return (SdbKv *)((char *)kv + ht->elem_size); -} - static inline SdbKv *prev_kv(SdbHt *ht, SdbKv *kv) { return (SdbKv *)((char *)kv - ht->elem_size); } +#endif + +static inline SdbKv *next_kv(SdbHt *ht, SdbKv *kv) { + return (SdbKv *)((char *)kv + ht->elem_size); +} #define BUCKET_FOREACH(ht, bt, j, kv) \ for ((j) = 0, (kv) = (SdbKv *)(bt)->arr; j < (bt)->count; (j)++, (kv) = next_kv (ht, kv)) diff --git a/shlr/sdb/src/sdb.h b/shlr/sdb/src/sdb.h index e8333d0a3837f..8a86b775e4e36 100644 --- a/shlr/sdb/src/sdb.h +++ b/shlr/sdb/src/sdb.h @@ -2,6 +2,7 @@ #define SDB_H #if !defined(O_BINARY) && !defined(_MSC_VER) +#undef O_BINARY #define O_BINARY 0 #endif @@ -17,9 +18,6 @@ extern "C" { #include "cdb_make.h" #include "sdb_version.h" -#undef r_offsetof -#define r_offsetof(type, member) ((unsigned long) &((type*)0)->member) - /* Key value sizes */ #define SDB_MIN_VALUE 1 #define SDB_MAX_VALUE 0xffffff @@ -46,8 +44,7 @@ extern char *strdup (const char *); #include // for _aligned_malloc #define ftruncate _chsize #endif -#undef r_offsetof -#define r_offsetof(type, member) ((unsigned long) (ut64)&((type*)0)->member) + //#define SDB_MODE 0 #define SDB_MODE _S_IWRITE | _S_IREAD #else