1 /* sdb - MIT - Copyright 2011-2016 - pancake */
2 
3 #include "sdb.h"
4 #include "types.h"
5 
6 // check if key exists and if it's a number.. rename?
sdb_num_exists(Sdb * s,const char * key)7 SDB_API bool sdb_num_exists (Sdb *s, const char *key) {
8 	const char *o = sdb_const_get (s, key, NULL);
9 	return o ? (*o >= '0' && *o <= '9'): false;
10 }
11 
sdb_num_get(Sdb * s,const char * key,ut32 * cas)12 SDB_API ut64 sdb_num_get(Sdb *s, const char *key, ut32 *cas) {
13 	const char *v = sdb_const_get (s, key, cas);
14 	return (!v || *v == '-') ? 0LL : sdb_atoi (v);
15 }
16 
sdb_num_add(Sdb * s,const char * key,ut64 v,ut32 cas)17 SDB_API int sdb_num_add(Sdb *s, const char *key, ut64 v, ut32 cas) {
18 	char *val, b[SDB_NUM_BUFSZ];
19 	int numbase = sdb_num_base (sdb_const_get (s, key, NULL));
20 	val = sdb_itoa (v, b, numbase);
21 	return sdb_add (s, key, val, cas);
22 }
23 
sdb_num_set(Sdb * s,const char * key,ut64 v,ut32 cas)24 SDB_API int sdb_num_set(Sdb *s, const char *key, ut64 v, ut32 cas) {
25 	char *val, b[SDB_NUM_BUFSZ];
26 	int numbase = sdb_num_base (sdb_const_get (s, key, NULL));
27 	val = sdb_itoa (v, b, numbase);
28 	return sdb_set (s, key, val, cas);
29 }
30 
sdb_num_inc(Sdb * s,const char * key,ut64 n2,ut32 cas)31 SDB_API ut64 sdb_num_inc(Sdb *s, const char *key, ut64 n2, ut32 cas) {
32 	ut32 c;
33 	ut64 n = sdb_num_get (s, key, &c);
34 	ut64 res = n + n2;
35 	if ((cas && c != cas) || res < n) {
36 		return 0LL;
37 	}
38 	sdb_num_set (s, key, res, cas);
39 	return res;
40 }
41 
sdb_num_dec(Sdb * s,const char * key,ut64 n2,ut32 cas)42 SDB_API ut64 sdb_num_dec(Sdb *s, const char *key, ut64 n2, ut32 cas) {
43 	ut32 c;
44 	ut64 n = sdb_num_get (s, key, &c);
45 	if (cas && c != cas) {
46 		return 0LL;
47 	}
48 	if (n2 > n) {
49 		sdb_set (s, key, "0", cas);
50 		return 0LL; // XXX must be -1LL?
51 	}
52 	n -= n2;
53 	sdb_num_set (s, key, n, cas);
54 	return n;
55 }
56 
sdb_num_min(Sdb * db,const char * k,ut64 n,ut32 cas)57 SDB_API int sdb_num_min(Sdb *db, const char*k, ut64 n, ut32 cas) {
58 	const char* a = sdb_const_get (db, k, NULL);
59 	return (!a || n < sdb_atoi (a))
60 		? sdb_num_set (db, k, n, cas): 0;
61 }
62 
sdb_num_max(Sdb * db,const char * k,ut64 n,ut32 cas)63 SDB_API int sdb_num_max(Sdb *db, const char*k, ut64 n, ut32 cas) {
64 	const char* a = sdb_const_get (db, k, NULL);
65 	return (!a || n > sdb_atoi (a))
66 		? sdb_num_set (db, k, n, cas): 0;
67 }
68 
sdb_bool_set(Sdb * db,const char * str,bool v,ut32 cas)69 SDB_API int sdb_bool_set(Sdb *db, const char *str, bool v, ut32 cas) {
70 	return sdb_set (db, str, v? "true": "false", cas);
71 }
72 
sdb_bool_get(Sdb * db,const char * str,ut32 * cas)73 SDB_API bool sdb_bool_get(Sdb *db, const char *str, ut32 *cas) {
74 	const char *b = sdb_const_get (db, str, cas);
75 	return b && (!strcmp (b, "1") || !strcmp (b, "true"));
76 }
77 
78 /* pointers */
79 
sdb_ptr_set(Sdb * db,const char * key,void * p,ut32 cas)80 SDB_API int sdb_ptr_set(Sdb *db, const char *key, void *p, ut32 cas) {
81 	return sdb_num_set (db, key, (ut64)(size_t)p, cas);
82 }
83 
sdb_ptr_get(Sdb * db,const char * key,ut32 * cas)84 SDB_API void* sdb_ptr_get(Sdb *db, const char *key, ut32 *cas) {
85 	return (void*)(size_t)sdb_num_get (db, key, cas);
86 }
87