diff --git a/libr/include/sdb/cdb.h b/libr/include/sdb/cdb.h index 8b5cfac808..b60a9ce931 100644 --- a/libr/include/sdb/cdb.h +++ b/libr/include/sdb/cdb.h @@ -21,7 +21,7 @@ extern void cdb_alloc_free(void*); extern int cdb_alloc_re(void); /* TODO THIS MUST GTFO! */ -int getkvlen(int fd, ut32 *klen, ut32 *vlen); +int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen); #define CDB_HASHSTART 5381 struct cdb { diff --git a/libr/include/sdb/sdb.h b/libr/include/sdb/sdb.h index 873522dc18..bab029cb23 100644 --- a/libr/include/sdb/sdb.h +++ b/libr/include/sdb/sdb.h @@ -117,7 +117,7 @@ ut32 sdb_hash (const char *key, int klen); /* json api */ char *sdb_json_get (Sdb* s, const char *key, const char *p, ut32 *cas); -int sdb_json_geti (Sdb* s, const char *k, const char *p); +int sdb_json_geti (Sdb* s, const char *k, const char *p, ut32 *cas); int sdb_json_seti (Sdb* s, const char *k, const char *p, int v, ut32 cas); int sdb_json_set (Sdb* s, const char *k, const char *p, const char *v, ut32 cas); diff --git a/libr/include/sdb/types.h b/libr/include/sdb/types.h index 6fbc6dc8e1..11d333a96f 100644 --- a/libr/include/sdb/types.h +++ b/libr/include/sdb/types.h @@ -1,8 +1,7 @@ -#ifndef UINT32_H -#define UINT32_H +#ifndef _INCLUDE_TYPES_H_ +#define _INCLUDE_TYPES_H_ #include - #include #include #include @@ -22,7 +21,6 @@ #define DIRSEP '/' #endif - #ifndef UNUSED #ifdef __GNUC__ #define UNUSED __attribute__((__unused__)) @@ -50,18 +48,10 @@ #include "config.h" -#define SET 0 /* sigh */ -#define CUR 1 /* sigh */ -#define seek_cur(fd) (lseek((fd), 0, CUR)) -#define seek_begin(fd) (seek_set ((fd), (off_t) 0)) static inline int seek_set(int fd, off_t pos) { - return (fd==-1 || lseek (fd, (off_t) pos, SET) == -1)? 0:1; + return (fd==-1 || lseek (fd, (off_t) pos, SEEK_SET) == -1)? 0:1; } -#define byte_equal(s,n,t) (!byte_diff((s),(n),(t))) -#define byte_copy(d,l,s) memcpy(d,s,l) -#define byte_diff(d,l,s) memcmp(d,s,l) - static inline void ut32_pack(char s[4], ut32 u) { s[0] = u & 255; u >>= 8; diff --git a/libr/util/file.c b/libr/util/file.c index 3b5886506b..5239d8bbbe 100644 --- a/libr/util/file.c +++ b/libr/util/file.c @@ -25,7 +25,7 @@ R_API boolt r_file_is_regular(const char *str) { return R_FALSE; if (stat (str, &buf)==-1) return R_FALSE; - return ((S_IFREG & buf.st_mode))? R_TRUE: R_FALSE; + return ((S_IFREG & buf.st_mode)==S_IFREG)? R_TRUE: R_FALSE; } R_API boolt r_file_is_directory(const char *str) { diff --git a/shlr/sdb/src/buffer.c b/shlr/sdb/src/buffer.c index 1f0a54618f..9164f877fc 100644 --- a/shlr/sdb/src/buffer.c +++ b/shlr/sdb/src/buffer.c @@ -32,12 +32,12 @@ int buffer_flush(buffer *s) { int buffer_putalign(buffer *s, const char *buf, ut32 len) { ut32 n; while (len > (n = s->n - s->p)) { - byte_copy (s->x + s->p, n, buf); + memcpy (s->x + s->p, buf, n); s->p += n; buf += n; len -= n; if (!buffer_flush (s)) return 0; } /* now len <= s->n - s->p */ - byte_copy (s->x + s->p, len, buf); + memcpy (s->x + s->p, buf, len); s->p += len; return 1; } diff --git a/shlr/sdb/src/cdb.c b/shlr/sdb/src/cdb.c index 065494e196..6514c13c90 100644 --- a/shlr/sdb/src/cdb.c +++ b/shlr/sdb/src/cdb.c @@ -9,7 +9,7 @@ #endif /* XXX: this code must be rewritten . too slow */ -int getkvlen(int fd, ut32 *klen, ut32 *vlen) { +int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen) { ut8 buf[4]; if (fd == -1 || read (fd, buf, 4) != 4) return 0; @@ -56,7 +56,7 @@ int cdb_read(struct cdb *c, char *buf, ut32 len, ut32 pos) { if (c->map) { if ((pos > c->size) || (c->size - pos < len)) return 0; - byte_copy (buf, len, c->map + pos); + memcpy (buf, c->map + pos, len); return 1; } if (!seek_set (c->fd, pos)) @@ -77,7 +77,7 @@ static int match(struct cdb *c, const char *key, ut32 len, ut32 pos) { int n = (szb>len)? len: szb; if (!cdb_read (c, buf, n, pos)) return -1; - if (byte_diff (buf, n, key)) + if (memcmp (buf, key, n)) return 0; pos += n; key += n; @@ -95,9 +95,8 @@ int cdb_findnext(struct cdb *c, ut32 u, const char *key, unsigned int len) { if (!cdb_read (c, buf, 8, (u << 3) & 2047)) return -1; ut32_unpack (buf + 4, &c->hslots); - if (!c->hslots) { + if (!c->hslots) return 0; - } ut32_unpack (buf, &c->hpos); c->khash = u; u = ((u>>8)%c->hslots)<<3; @@ -117,7 +116,7 @@ int cdb_findnext(struct cdb *c, ut32 u, const char *key, unsigned int len) { if (u == c->khash) { if (!seek_set (c->fd, pos)) return -1; - if (!getkvlen (c->fd, &u, &c->dlen)) + if (!cdb_getkvlen (c->fd, &u, &c->dlen)) return -1; if (u == 0) return -1; diff --git a/shlr/sdb/src/cdb.h b/shlr/sdb/src/cdb.h index 8b5cfac808..b60a9ce931 100644 --- a/shlr/sdb/src/cdb.h +++ b/shlr/sdb/src/cdb.h @@ -21,7 +21,7 @@ extern void cdb_alloc_free(void*); extern int cdb_alloc_re(void); /* TODO THIS MUST GTFO! */ -int getkvlen(int fd, ut32 *klen, ut32 *vlen); +int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen); #define CDB_HASHSTART 5381 struct cdb { diff --git a/shlr/sdb/src/cdb_make.c b/shlr/sdb/src/cdb_make.c index f8af517d47..41e6dc741f 100644 --- a/shlr/sdb/src/cdb_make.c +++ b/shlr/sdb/src/cdb_make.c @@ -159,7 +159,7 @@ int cdb_make_finish(struct cdb_make *c) { } if (!buffer_flush (&c->b)) return 0; - if (!seek_begin (c->fd)) return 0; + if (!seek_set (c->fd, 0)) return 0; // free chills for (x = c->head; x;) { diff --git a/shlr/sdb/src/json.c b/shlr/sdb/src/json.c index d4deeeadf7..b48e3fbe19 100644 --- a/shlr/sdb/src/json.c +++ b/shlr/sdb/src/json.c @@ -1,8 +1,7 @@ -/* sdb - LGPLv3 - Copyright 2012-2013 - pancake */ +/* sdb - LGPLv3 - Copyright 2012-2014 - pancake */ #include #include "sdb.h" -//#include "json/json.h" #include "json/api.c" #include "json/js0n.c" #include "json/path.c" @@ -43,19 +42,25 @@ SDB_API char *sdb_json_get (Sdb *s, const char *k, const char *p, ut32 *cas) { } SDB_API int sdb_json_inc(Sdb *s, const char *k, const char *p, int n, ut32 cas) { - int cur = sdb_json_geti (s, k, p); + ut32 c; + int cur = sdb_json_geti (s, k, p, &c); + if (cas && c != cas) + return 0; sdb_json_seti (s, k, p, cur+n, cas); return cur+n; } SDB_API int sdb_json_dec(Sdb *s, const char *k, const char *p, int n, ut32 cas) { - int cur = sdb_json_geti (s, k, p); + ut32 c; + int cur = sdb_json_geti (s, k, p, &c); + if (cas && c != cas) + return 0; sdb_json_seti (s, k, p, cur-n, cas); return cur-n; } -SDB_API int sdb_json_geti (Sdb *s, const char *k, const char *p) { - char *v = sdb_get (s, k, 0); // XXX cas +SDB_API int sdb_json_geti (Sdb *s, const char *k, const char *p, ut32 *cas) { + char *v = sdb_get (s, k, cas); if (v) { Rangstr rs = json_get (v, p); return rangstr_int (&rs); @@ -174,18 +179,13 @@ SDB_API char *sdb_json_unindent(const char *s) { memset (O, 0, len); for (o=O; *s; s++) { if (instr) { - if (s[0] == '"') { - instr = 0; - } else { + if (s[0] != '"') { if (s[0] == '\\' && s[1] == '"') *o++ = *s; - } + } else instr = 0; *o++ = *s; continue; - } else { - if (s[0] == '"') - instr = 1; - } + } else if (s[0] == '"') instr = 1; if (*s == '\n'|| *s == '\r' || *s == '\t' || *s == ' ') continue; *o++ = *s; @@ -195,11 +195,11 @@ SDB_API char *sdb_json_unindent(const char *s) { } SDB_API const char *sdb_json_format(SdbJsonString* s, const char *fmt, ...) { - va_list ap; char *arg_s, *x, tmp[128]; - float arg_f; unsigned long long arg_l; int i, arg_i; + float arg_f; + va_list ap; #define JSONSTR_ALLOCATE(y) \ if (s->len+y>s->blen) {\ diff --git a/shlr/sdb/src/ls.c b/shlr/sdb/src/ls.c index 56f245741f..515bab1adc 100644 --- a/shlr/sdb/src/ls.c +++ b/shlr/sdb/src/ls.c @@ -1,10 +1,12 @@ -/* sdb - LGPLv3 - Copyright 2007-2013 - pancake */ +/* sdb - LGPLv3 - Copyright 2007-2014 - pancake */ #include #include "ls.h" SDB_API SdbList *ls_new() { SdbList *list = R_NEW (SdbList); + if (!list) + return NULL; list->head = NULL; list->tail = NULL; list->free = free; // HACK @@ -14,7 +16,7 @@ SDB_API SdbList *ls_new() { SDB_API void ls_delete (SdbList *list, SdbListIter *iter) { if (iter==NULL) { - printf ("ls_delete: null iter?\n"); + fprintf (stderr, "ls_delete: null iter?\n"); return; } ls_split_iter (list, iter); @@ -41,12 +43,10 @@ SDB_API void ls_destroy (SdbList *list) { SdbListIter *next = it->n; ls_delete (list, it); it = next; - // free (it); } list->head = list->tail = NULL; list->length = 0; } - //free (list); } SDB_API void ls_free (SdbList *list) { @@ -56,9 +56,13 @@ SDB_API void ls_free (SdbList *list) { free (list); } -// XXX: Too slow? SDB_API SdbListIter *ls_append(SdbList *list, void *data) { - SdbListIter *it = R_NEW (SdbListIter); + SdbListIter *it; + if (!list) + return NULL; + it = R_NEW (SdbListIter); + if (!it) + return NULL; if (list->tail) list->tail->n = it; it->data = data; @@ -72,15 +76,16 @@ SDB_API SdbListIter *ls_append(SdbList *list, void *data) { } SDB_API SdbListIter *ls_prepend(SdbList *list, void *data) { - SdbListIter *new = R_NEW (SdbListIter); + SdbListIter *it = R_NEW (SdbListIter); + if (!it) return NULL; if (list->head) - list->head->p = new; - new->data = data; - new->n = list->head; - new->p = NULL; - list->head = new; + list->head->p = it; + it->data = data; + it->n = list->head; + it->p = NULL; + list->head = it; if (list->tail == NULL) - list->tail = new; + list->tail = it; list->length++; - return new; + return it; } diff --git a/shlr/sdb/src/main.c b/shlr/sdb/src/main.c index 4a8f78317e..a69b76e82d 100644 --- a/shlr/sdb/src/main.c +++ b/shlr/sdb/src/main.c @@ -12,7 +12,8 @@ static Sdb *s = NULL; static void terminate(int sig UNUSED) { if (!s) return; - if (save) sdb_sync (s); + if (save && !sdb_sync (s)) + exit (1); sdb_free (s); exit (0); } @@ -57,12 +58,12 @@ static int sdb_dump (const char *db, int qf) { return 0; } -static void createdb(const char *f) { +static int createdb(const char *f) { char *line, *eq; s = sdb_new (NULL, f, 0); - if (!sdb_create (s)) { - printf ("Cannot create database\n"); - exit (1); + if (!s || !sdb_create (s)) { + fprintf (stderr, "Cannot create database\n"); + return 1; } for (;(line = stdin_gets ());) { if ((eq = strchr (line, '='))) { @@ -72,6 +73,7 @@ static void createdb(const char *f) { free (line); } sdb_finish (s); + return 0; } static void showusage(int o) { @@ -107,7 +109,7 @@ int main(int argc, const char **argv) { if (!strcmp (argv[2], "[]")) { return sdb_dump (argv[1], 1); } if (!strcmp (argv[2], "=")) - createdb (argv[1]); + return createdb (argv[1]); else if (!strcmp (argv[2], "-")) { if ((s = sdb_new (NULL, argv[1], 0))) { for (;(line = stdin_gets ());) { @@ -115,7 +117,9 @@ int main(int argc, const char **argv) { free (line); } } - } else if ((s = sdb_new (NULL, argv[1], 0))) { + } else { + s = sdb_new (NULL, argv[1], 0); + if (!s) return 1; for (i=2; i -#include -#include -#include #include #include -#include +#include +#include #include +#include #include "sdb.h" // XXX: deprecate, or use the one inside Sdb* @@ -29,20 +28,22 @@ SDB_API void sdb_global_hook(SdbHook hook, void *user) { // TODO: use mmap instead of read.. much faster! SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) { - Sdb* s; - s = malloc (sizeof (Sdb)); + struct stat st = {0}; + Sdb* s = R_NEW (Sdb); if (name && *name) { if (path && *path) { - s->dir = malloc (strlen (path) + strlen (name)+2); - strcpy (s->dir, path); - strcat (s->dir, "/"); - strcat (s->dir, name); + int plen = strlen (path); + int nlen = strlen (name); + s->dir = malloc (plen+nlen+2); + memcpy (s->dir, path, plen); + s->dir[plen] = '/'; + memcpy (s->dir+plen+1, name, nlen+1); } else s->dir = strdup (name); - if (lock && !sdb_lock (sdb_lockfile (s->dir))) { - free (s->dir); - free (s); - return NULL; - } + if (lock && !sdb_lock (sdb_lockfile (s->dir))) + goto fail; + if (stat (s->dir, &st)!=-1) + if ((S_IFREG & st.st_mode)!=S_IFREG) + goto fail; s->fd = open (s->dir, O_RDONLY|O_BINARY); // if (s->fd == -1) // must fail if we cant open for write in sync s->name = strdup (name); @@ -56,6 +57,7 @@ SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) { s->fdump = -1; s->ndump = NULL; s->ns = ls_new (); // TODO: should be NULL + if (!s->ns) goto fail; s->hooks = NULL; s->ht = ht_new ((SdbListFree)sdb_kv_free); s->lock = lock; @@ -68,6 +70,10 @@ SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) { cdb_init (&s->db, s->fd); cdb_findstart (&s->db); return s; +fail: + free (s->dir); + free (s); + return NULL; } // XXX: this is wrong. stuff not stored in memory is lost @@ -184,8 +190,7 @@ SDB_API char *sdb_get (Sdb* s, const char *key, ut32 *cas) { if (!cdb_findnext (&s->db, hash, key, keylen)) return NULL; - len = cdb_datalen (&s->db); - if (len == 0) + if (!(len = cdb_datalen (&s->db))) return NULL; if (!(buf = malloc (len+1))) // XXX too many mallocs return NULL; @@ -248,7 +253,7 @@ SDB_API void sdb_reset (Sdb* s) { } // TODO: too many allocs here. use slices -SdbKv* sdb_kv_new (const char *k, const char *v) { +SDB_API SdbKv* sdb_kv_new (const char *k, const char *v) { int vl = strlen (v)+1; SdbKv *kv = R_NEW (SdbKv); strncpy (kv->key, k, sizeof (kv->key)-1); @@ -268,8 +273,9 @@ SDB_API int sdb_set (Sdb* s, const char *key, const char *val, ut32 cas) { SdbHashEntry *e; SdbKv *kv; ut32 hash, klen; - if (!s || !key || !val) + if (!s || !key) return 0; + if (!val) val = ""; klen = strlen (key)+1; hash = sdb_hash (key, klen); cdb_findstart (&s->db); @@ -288,6 +294,8 @@ SDB_API int sdb_set (Sdb* s, const char *key, const char *val, ut32 cas) { sdb_hook_call (s, key, val); return cas; } + if (!*val) + return 0; kv = sdb_kv_new (key, val); kv->cas = nextcas (); ht_insert (s->ht, hash, kv, NULL); @@ -310,17 +318,16 @@ SDB_API void sdb_foreach (Sdb* s, SdbForeachCallback cb, void *user) { cb (user, o, p); free (o); free (p); - } else { - cb (user, kv->key, kv->value); - } + } else cb (user, kv->key, kv->value); } } // TODO: reuse sdb_foreach SDB_API void sdb_list (Sdb* s) { - SdbKv *kv; SdbListIter *iter; - if (s && s->ht) + SdbKv *kv; + if (!s || !s->ht) + return; ls_foreach (s->ht->list, iter, kv) { if (!kv->value || !*kv->value) continue; @@ -329,9 +336,7 @@ SDB_API void sdb_list (Sdb* s) { for (o=p; *o; o++) if (*o==SDB_RS) *o = ','; printf ("()%s=%s\n", kv->key, p); free (p); - } else { - printf ("%s=%s\n", kv->key, kv->value); - } + } else printf ("%s=%s\n", kv->key, kv->value); } } @@ -374,6 +379,7 @@ SDB_API int sdb_sync (Sdb* s) { return 0; } +// TODO: optimize: do not use syscalls here static int getbytes(int fd, char *b, int len) { if (read (fd, b, len) != len) return -1; @@ -382,10 +388,9 @@ static int getbytes(int fd, char *b, int len) { } SDB_API void sdb_dump_begin (Sdb* s) { - if (s->fd != -1) { - seek_set (s->fd, 0); + if (s->fd != -1) seek_set (s->fd, (pos=2048)); - } else pos = 0; + else pos = 0; } SDB_API SdbKv *sdb_dump_next (Sdb* s) { @@ -402,7 +407,9 @@ SDB_API SdbKv *sdb_dump_next (Sdb* s) { SDB_API int sdb_dump_dupnext (Sdb* s, char **key, char **value) { ut32 vlen, klen; - if (s->fd==-1 || !getkvlen (s->fd, &klen, &vlen)) + if (s->fd==-1) + return 0; + if (!cdb_getkvlen (s->fd, &klen, &vlen)) return 0; if (klen<1 || vlen<1) return 0; @@ -438,22 +445,6 @@ SDB_API int sdb_dump_dupnext (Sdb* s, char **key, char **value) { return 1; } -SDB_API ut64 sdb_now () { - struct timeval now; - gettimeofday (&now, NULL); - return now.tv_sec; -} - -SDB_API ut64 sdb_unow () { - ut64 x; - struct timeval now; - gettimeofday (&now, NULL); - x = now.tv_sec; - x <<= 32; - x += now.tv_usec; - return x; -} - static ut64 parse_expire (ut64 e) { const ut64 month = 30 * 24 * 60 * 60; if (e>0 && ehooks = ls_new (); - } + } else s->hooks = ls_new (); ls_append (s->hooks, cb); ls_append (s->hooks, user); return 1; diff --git a/shlr/sdb/src/sdb.h b/shlr/sdb/src/sdb.h index 873522dc18..bab029cb23 100644 --- a/shlr/sdb/src/sdb.h +++ b/shlr/sdb/src/sdb.h @@ -117,7 +117,7 @@ ut32 sdb_hash (const char *key, int klen); /* json api */ char *sdb_json_get (Sdb* s, const char *key, const char *p, ut32 *cas); -int sdb_json_geti (Sdb* s, const char *k, const char *p); +int sdb_json_geti (Sdb* s, const char *k, const char *p, ut32 *cas); int sdb_json_seti (Sdb* s, const char *k, const char *p, int v, ut32 cas); int sdb_json_set (Sdb* s, const char *k, const char *p, const char *v, ut32 cas); diff --git a/shlr/sdb/src/sdba.c b/shlr/sdb/src/sdba.c index 15aae0b1e4..8a523d7f1b 100644 --- a/shlr/sdb/src/sdba.c +++ b/shlr/sdb/src/sdba.c @@ -136,11 +136,6 @@ SDB_API int sdb_aaddn(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) { } SDB_API int sdb_aadd(Sdb *s, const char *key, int idx, const char *val, ut32 cas) { -/* - if (sdb_exists (s, key)) - return 0; -*/ -// TODO: use agetv here ? if (sdb_aexists (s, key, val)) return 0; return sdb_aset (s, key, idx, val, cas); @@ -298,20 +293,6 @@ SDB_API int sdb_aexists(Sdb *s, const char *key, const char *val) { return found; } -// TODO: make static inline? -SDB_API int sdb_alen(const char *str) { - int len = 1; - const char *n, *p = str; - if (!p|| !*p) return 0; - for (len=0; ; len++) { - n = strchr (p, SDB_RS); - if (!n) break; - p = n+1; - } - if (*p) len++; - return len; -} - SDB_API int sdb_alength(Sdb *s, const char *key) { const char *str = sdb_getc (s, key, 0); return sdb_alen (str); diff --git a/shlr/sdb/src/types.h b/shlr/sdb/src/types.h index 6fbc6dc8e1..11d333a96f 100644 --- a/shlr/sdb/src/types.h +++ b/shlr/sdb/src/types.h @@ -1,8 +1,7 @@ -#ifndef UINT32_H -#define UINT32_H +#ifndef _INCLUDE_TYPES_H_ +#define _INCLUDE_TYPES_H_ #include - #include #include #include @@ -22,7 +21,6 @@ #define DIRSEP '/' #endif - #ifndef UNUSED #ifdef __GNUC__ #define UNUSED __attribute__((__unused__)) @@ -50,18 +48,10 @@ #include "config.h" -#define SET 0 /* sigh */ -#define CUR 1 /* sigh */ -#define seek_cur(fd) (lseek((fd), 0, CUR)) -#define seek_begin(fd) (seek_set ((fd), (off_t) 0)) static inline int seek_set(int fd, off_t pos) { - return (fd==-1 || lseek (fd, (off_t) pos, SET) == -1)? 0:1; + return (fd==-1 || lseek (fd, (off_t) pos, SEEK_SET) == -1)? 0:1; } -#define byte_equal(s,n,t) (!byte_diff((s),(n),(t))) -#define byte_copy(d,l,s) memcpy(d,s,l) -#define byte_diff(d,l,s) memcmp(d,s,l) - static inline void ut32_pack(char s[4], ut32 u) { s[0] = u & 255; u >>= 8; diff --git a/shlr/sdb/src/util.c b/shlr/sdb/src/util.c index b0a1a11d6e..f0b71e05ae 100644 --- a/shlr/sdb/src/util.c +++ b/shlr/sdb/src/util.c @@ -1,6 +1,7 @@ /* sdb - LGPLv3 - Copyright 2011-2014 - pancake */ #include "sdb.h" +#include // assert sdb_hash("hi", 2) == sdb_hash("hi", 0) SDB_API ut32 sdb_hash(const char *s, int len) { @@ -46,3 +47,33 @@ SDB_API ut64 sdb_atoi(const char *s) { return strtoull (s+2, &p, 16); return strtoull (s, &p, 10); } + +// TODO: find better name for it +SDB_API int sdb_alen(const char *str) { + int len = 1; + const char *n, *p = str; + if (!p|| !*p) return 0; + for (len=0; ; len++) { + n = strchr (p, SDB_RS); + if (!n) break; + p = n+1; + } + if (*p) len++; + return len; +} + +SDB_API ut64 sdb_now () { + struct timeval now; + gettimeofday (&now, NULL); + return now.tv_sec; +} + +SDB_API ut64 sdb_unow () { + ut64 x; + struct timeval now; + gettimeofday (&now, NULL); + x = now.tv_sec; + x <<= 32; + x += now.tv_usec; + return x; +} diff --git a/shlr/tcc/test.cparse b/shlr/tcc/test.cparse index 8cf5dbde7c..bd98839839 100644 --- a/shlr/tcc/test.cparse +++ b/shlr/tcc/test.cparse @@ -17,9 +17,11 @@ struct Foo { struct Cow c; int d; }; +/* +int main(int argc, char **argv); struct Foo foot = {0}; int boo = 3; - int main(int argc, char **argv) { puts ("Hello World\n"); } +*/