| 267 | } |
| 268 | |
| 269 | static int processLineItem(redisReader *r) { |
| 270 | redisReadTask *cur = r->task[r->ridx]; |
| 271 | void *obj; |
| 272 | char *p; |
| 273 | int len; |
| 274 | |
| 275 | if ((p = readLine(r,&len)) != NULL) { |
| 276 | if (cur->type == REDIS_REPLY_INTEGER) { |
| 277 | if (r->fn && r->fn->createInteger) { |
| 278 | long long v; |
| 279 | if (string2ll(p, len, &v) == REDIS_ERR) { |
| 280 | __redisReaderSetError(r,REDIS_ERR_PROTOCOL, |
| 281 | "Bad integer value"); |
| 282 | return REDIS_ERR; |
| 283 | } |
| 284 | obj = r->fn->createInteger(cur,v); |
| 285 | } else { |
| 286 | obj = (void*)REDIS_REPLY_INTEGER; |
| 287 | } |
| 288 | } else if (cur->type == REDIS_REPLY_DOUBLE) { |
| 289 | if (r->fn && r->fn->createDouble) { |
| 290 | char buf[326], *eptr; |
| 291 | double d; |
| 292 | |
| 293 | if ((size_t)len >= sizeof(buf)) { |
| 294 | __redisReaderSetError(r,REDIS_ERR_PROTOCOL, |
| 295 | "Double value is too large"); |
| 296 | return REDIS_ERR; |
| 297 | } |
| 298 | |
| 299 | memcpy(buf,p,len); |
| 300 | buf[len] = '\0'; |
| 301 | |
| 302 | if (strcasecmp(buf,",inf") == 0) { |
| 303 | d = INFINITY; /* Positive infinite. */ |
| 304 | } else if (strcasecmp(buf,",-inf") == 0) { |
| 305 | d = -INFINITY; /* Negative infinite. */ |
| 306 | } else { |
| 307 | d = strtod((char*)buf,&eptr); |
| 308 | if (buf[0] == '\0' || eptr[0] != '\0' || isnan(d)) { |
| 309 | __redisReaderSetError(r,REDIS_ERR_PROTOCOL, |
| 310 | "Bad double value"); |
| 311 | return REDIS_ERR; |
| 312 | } |
| 313 | } |
| 314 | obj = r->fn->createDouble(cur,d,buf,len); |
| 315 | } else { |
| 316 | obj = (void*)REDIS_REPLY_DOUBLE; |
| 317 | } |
| 318 | } else if (cur->type == REDIS_REPLY_NIL) { |
| 319 | if (r->fn && r->fn->createNil) |
| 320 | obj = r->fn->createNil(cur); |
| 321 | else |
| 322 | obj = (void*)REDIS_REPLY_NIL; |
| 323 | } else if (cur->type == REDIS_REPLY_BOOL) { |
| 324 | int bval = p[0] == 't' || p[0] == 'T'; |
| 325 | if (r->fn && r->fn->createBool) |
| 326 | obj = r->fn->createBool(cur,bval); |
no test coverage detected