diff --git a/hiredis.c b/hiredis.c index 3feba45..3e662ef 100644 --- a/hiredis.c +++ b/hiredis.c @@ -48,6 +48,7 @@ typedef struct redisReader { redisReadTask rstack[3]; /* stack of read tasks */ int ridx; /* index of stack */ + void *privdata; /* user-settable arbitrary field */ } redisReader; static redisReply *createReplyObject(int type); @@ -307,6 +308,7 @@ static int processMultiBulkItem(redisReader *r) { r->rstack[r->ridx].elements = -1; r->rstack[r->ridx].parent = obj; r->rstack[r->ridx].idx = 0; + r->rstack[r->ridx].privdata = r->privdata; } else { moveToNextTask(r); } @@ -393,6 +395,17 @@ int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFuncti return REDIS_ERR; } +/* Set the private data field that is used in the read tasks. This argument can + * be used to curry arbitrary data to the custom reply object functions. */ +int redisReplyReaderSetPrivdata(void *reader, void *privdata) { + redisReader *r = reader; + if (r->reply == NULL) { + r->privdata = privdata; + return REDIS_OK; + } + return REDIS_ERR; +} + /* External libraries wrapping hiredis might need access to the temporary * variable while the reply is built up. When the reader contains an * object in between receiving some bytes to parse, this object might @@ -426,6 +439,7 @@ static void redisSetReplyReaderError(redisReader *r, sds err) { r->ridx = -1; r->error = err; } +int redisReplyReaderSetPrivdata(void *reader, void *privdata); char *redisReplyReaderGetError(void *reader) { redisReader *r = reader; @@ -454,6 +468,7 @@ int redisReplyReaderGetReply(void *reader, void **reply) { r->rstack[0].elements = -1; r->rstack[0].parent = NULL; r->rstack[0].idx = -1; + r->rstack[0].privdata = r->privdata; r->ridx = 0; } diff --git a/hiredis.h b/hiredis.h index 21098cc..5065043 100644 --- a/hiredis.h +++ b/hiredis.h @@ -88,6 +88,7 @@ typedef struct redisReadTask { int elements; /* number of elements in multibulk container */ void *parent; /* optional pointer to parent object */ int idx; /* index in parent (array) object */ + void *privdata; /* user-settable arbitrary field */ } redisReadTask; typedef struct redisReplyObjectFunctions { @@ -116,6 +117,7 @@ typedef struct redisContext { void freeReplyObject(void *reply); void *redisReplyReaderCreate(); int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFunctions *fn); +int redisReplyReaderSetPrivdata(void *reader, void *privdata); void *redisReplyReaderGetObject(void *reader); char *redisReplyReaderGetError(void *reader); void redisReplyReaderFree(void *ptr);