Annotation of win32/redis/include/hiredis/read.h, revision 1.1
1.1 ! moko 1: /*
! 2: * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
! 3: * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
! 4: *
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions are met:
! 9: *
! 10: * * Redistributions of source code must retain the above copyright notice,
! 11: * this list of conditions and the following disclaimer.
! 12: * * Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: * * Neither the name of Redis nor the names of its contributors may be used
! 16: * to endorse or promote products derived from this software without
! 17: * specific prior written permission.
! 18: *
! 19: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
! 20: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 22: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
! 23: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 24: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 25: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 26: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 27: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 28: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 29: * POSSIBILITY OF SUCH DAMAGE.
! 30: */
! 31:
! 32:
! 33: #ifndef __HIREDIS_READ_H
! 34: #define __HIREDIS_READ_H
! 35: #include <stdio.h> /* for size_t */
! 36:
! 37: #define REDIS_ERR -1
! 38: #define REDIS_OK 0
! 39:
! 40: /* When an error occurs, the err flag in a context is set to hold the type of
! 41: * error that occurred. REDIS_ERR_IO means there was an I/O error and you
! 42: * should use the "errno" variable to find out what is wrong.
! 43: * For other values, the "errstr" field will hold a description. */
! 44: #define REDIS_ERR_IO 1 /* Error in read or write */
! 45: #define REDIS_ERR_EOF 3 /* End of file */
! 46: #define REDIS_ERR_PROTOCOL 4 /* Protocol error */
! 47: #define REDIS_ERR_OOM 5 /* Out of memory */
! 48: #define REDIS_ERR_TIMEOUT 6 /* Timed out */
! 49: #define REDIS_ERR_OTHER 2 /* Everything else... */
! 50:
! 51: #define REDIS_REPLY_STRING 1
! 52: #define REDIS_REPLY_ARRAY 2
! 53: #define REDIS_REPLY_INTEGER 3
! 54: #define REDIS_REPLY_NIL 4
! 55: #define REDIS_REPLY_STATUS 5
! 56: #define REDIS_REPLY_ERROR 6
! 57: #define REDIS_REPLY_DOUBLE 7
! 58: #define REDIS_REPLY_BOOL 8
! 59: #define REDIS_REPLY_MAP 9
! 60: #define REDIS_REPLY_SET 10
! 61: #define REDIS_REPLY_ATTR 11
! 62: #define REDIS_REPLY_PUSH 12
! 63: #define REDIS_REPLY_BIGNUM 13
! 64: #define REDIS_REPLY_VERB 14
! 65:
! 66: /* Default max unused reader buffer. */
! 67: #define REDIS_READER_MAX_BUF (1024*16)
! 68:
! 69: /* Default multi-bulk element limit */
! 70: #define REDIS_READER_MAX_ARRAY_ELEMENTS ((1LL<<32) - 1)
! 71:
! 72: #ifdef __cplusplus
! 73: extern "C" {
! 74: #endif
! 75:
! 76: typedef struct redisReadTask {
! 77: int type;
! 78: long long elements; /* number of elements in multibulk container */
! 79: int idx; /* index in parent (array) object */
! 80: void *obj; /* holds user-generated value for a read task */
! 81: struct redisReadTask *parent; /* parent task */
! 82: void *privdata; /* user-settable arbitrary field */
! 83: } redisReadTask;
! 84:
! 85: typedef struct redisReplyObjectFunctions {
! 86: void *(*createString)(const redisReadTask*, char*, size_t);
! 87: void *(*createArray)(const redisReadTask*, size_t);
! 88: void *(*createInteger)(const redisReadTask*, long long);
! 89: void *(*createDouble)(const redisReadTask*, double, char*, size_t);
! 90: void *(*createNil)(const redisReadTask*);
! 91: void *(*createBool)(const redisReadTask*, int);
! 92: void (*freeObject)(void*);
! 93: } redisReplyObjectFunctions;
! 94:
! 95: typedef struct redisReader {
! 96: int err; /* Error flags, 0 when there is no error */
! 97: char errstr[128]; /* String representation of error when applicable */
! 98:
! 99: char *buf; /* Read buffer */
! 100: size_t pos; /* Buffer cursor */
! 101: size_t len; /* Buffer length */
! 102: size_t maxbuf; /* Max length of unused buffer */
! 103: long long maxelements; /* Max multi-bulk elements */
! 104:
! 105: redisReadTask **task;
! 106: int tasks;
! 107:
! 108: int ridx; /* Index of current read task */
! 109: void *reply; /* Temporary reply pointer */
! 110:
! 111: redisReplyObjectFunctions *fn;
! 112: void *privdata;
! 113: } redisReader;
! 114:
! 115: /* Public API for the protocol parser. */
! 116: redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn);
! 117: void redisReaderFree(redisReader *r);
! 118: int redisReaderFeed(redisReader *r, const char *buf, size_t len);
! 119: int redisReaderGetReply(redisReader *r, void **reply);
! 120:
! 121: #define redisReaderSetPrivdata(_r, _p) (int)(((redisReader*)(_r))->privdata = (_p))
! 122: #define redisReaderGetObject(_r) (((redisReader*)(_r))->reply)
! 123: #define redisReaderGetError(_r) (((redisReader*)(_r))->errstr)
! 124:
! 125: #ifdef __cplusplus
! 126: }
! 127: #endif
! 128:
! 129: #endif
E-mail: