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