]> git.saurik.com Git - redis.git/blobdiff - sds.c
Merge http://github.com/ngmoco/redis
[redis.git] / sds.c
diff --git a/sds.c b/sds.c
index ca77a079c31900790dce1e1c650a3cfde7ee569a..feb1a6212e657661dbe0a1de5a9b028b1e79e7af 100644 (file)
--- a/sds.c
+++ b/sds.c
@@ -1,6 +1,6 @@
 /* SDSLib, A C dynamic strings library
  *
- * Copyright (c) 2006-2009, Salvatore Sanfilippo <antirez at gmail dot com>
+ * Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,6 +28,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define SDS_ABORT_ON_OOM
+
 #include "sds.h"
 #include <stdio.h>
 #include <stdlib.h>
@@ -138,7 +140,7 @@ sds sdscpylen(sds s, char *t, size_t len) {
     size_t totlen = sh->free+sh->len;
 
     if (totlen < len) {
-        s = sdsMakeRoomFor(s,len-totlen);
+        s = sdsMakeRoomFor(s,len-sh->len);
         if (s == NULL) return NULL;
         sh = (void*) (s-(sizeof(struct sdshdr)));
         totlen = sh->free+sh->len;
@@ -157,7 +159,7 @@ sds sdscpy(sds s, char *t) {
 sds sdscatprintf(sds s, const char *fmt, ...) {
     va_list ap;
     char *buf, *t;
-    size_t buflen = 32;
+    size_t buflen = 16;
 
     while(1) {
         buf = zmalloc(buflen);
@@ -275,11 +277,17 @@ sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count) {
     if (tokens == NULL) sdsOomAbort();
 #endif
     if (seplen < 1 || len < 0 || tokens == NULL) return NULL;
+    if (len == 0) {
+        *count = 0;
+        return tokens;
+    }
     for (j = 0; j < (len-(seplen-1)); j++) {
         /* make sure there is room for the next element and the final one */
         if (slots < elements+2) {
+            sds *newtokens;
+
             slots *= 2;
-            sds *newtokens = zrealloc(tokens,sizeof(sds)*slots);
+            newtokens = zrealloc(tokens,sizeof(sds)*slots);
             if (newtokens == NULL) {
 #ifdef SDS_ABORT_ON_OOM
                 sdsOomAbort();
@@ -327,3 +335,25 @@ cleanup:
     }
 #endif
 }
+
+void sdsfreesplitres(sds *tokens, int count) {
+    if (!tokens) return;
+    while(count--)
+        sdsfree(tokens[count]);
+    zfree(tokens);
+}
+
+sds sdsfromlonglong(long long value) {
+    char buf[32], *p;
+    unsigned long long v;
+
+    v = (value < 0) ? -value : value;
+    p = buf+31; /* point to the last character */
+    do {
+        *p-- = '0'+(v%10);
+        v /= 10;
+    } while(v);
+    if (value < 0) *p-- = '-';
+    p++;
+    return sdsnewlen(p,32-(p-buf));
+}