Skip to content

Commit

Permalink
Added RM_CreateStringVaprintf() and tests
Browse files Browse the repository at this point in the history
Added Redis Module API:
RedisModule_CreateStringVaprintf(RedisModuleCtx *ctx, const char *fmt, va_list ap);
  • Loading branch information
rafie committed Nov 28, 2019
1 parent ef5186d commit 3076b13
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 1 deletion.
13 changes: 13 additions & 0 deletions src/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -1006,6 +1006,18 @@ RedisModuleString *RM_CreateStringPrintf(RedisModuleCtx *ctx, const char *fmt, .
}


/* Like RM_CreateStringPrintf, but with va_list. */
RedisModuleString *RM_CreateStringVaprintf(RedisModuleCtx *ctx, const char *fmt, va_list ap) {
sds s = sdsempty();
s = sdscatvprintf(s, fmt, ap);

RedisModuleString *o = createObject(OBJ_STRING, s);
if (ctx != NULL) autoMemoryAdd(ctx,REDISMODULE_AM_STRING,o);

return o;
}


/* Like RedisModule_CreatString(), but creates a string starting from a long long
* integer instead of taking a buffer and its length.
*
Expand Down Expand Up @@ -7358,6 +7370,7 @@ void moduleRegisterCoreAPI(void) {
REGISTER_API(CreateStringFromLongDouble);
REGISTER_API(CreateStringFromString);
REGISTER_API(CreateStringPrintf);
REGISTER_API(CreateStringVaprintf);
REGISTER_API(FreeString);
REGISTER_API(StringPtrLen);
REGISTER_API(AutoMemory);
Expand Down
30 changes: 30 additions & 0 deletions src/modules/testmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,32 @@ int TestStringPrintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
return REDISMODULE_OK;
}

/* TEST.STRING.VAPRINTF -- Test string formatting. */
static RedisModuleString *_TestStringVaprintf(RedisModuleCtx *ctx, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
RedisModuleString *s = RedisModule_CreateStringPrintf(ctx, fmt, ap);
va_end(ap);
return s;
}

int TestStringVaprintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModule_AutoMemory(ctx);
if (argc < 3) {
return RedisModule_WrongArity(ctx);
}
RedisModuleString *s = _TestStringVaprintf(ctx,
"Got %d args. argv[1]: %s, argv[2]: %s",
argc,
RedisModule_StringPtrLen(argv[1], NULL),
RedisModule_StringPtrLen(argv[2], NULL)
);

RedisModule_ReplyWithString(ctx,s);

return REDISMODULE_OK;
}

int failTest(RedisModuleCtx *ctx, const char *msg) {
RedisModule_ReplyWithError(ctx, msg);
return REDISMODULE_ERR;
Expand Down Expand Up @@ -434,6 +460,10 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
TestStringPrintf,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.string.vaprintf",
TestStringVaprintf,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.ctxflags",
TestCtxFlags,"readonly",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
Expand Down
3 changes: 3 additions & 0 deletions src/redismodule.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>

/* ---------------- Defines common between core and modules --------------- */

Expand Down Expand Up @@ -466,6 +467,7 @@ RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(Re
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongDouble)(RedisModuleCtx *ctx, long double ld, int humanfriendly);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringVaprintf)(RedisModuleCtx *ctx, const char *fmt, va_list ap);
void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str);
const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err);
Expand Down Expand Up @@ -719,6 +721,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
REDISMODULE_GET_API(CreateStringFromLongDouble);
REDISMODULE_GET_API(CreateStringFromString);
REDISMODULE_GET_API(CreateStringPrintf);
REDISMODULE_GET_API(CreateStringVaprintf);
REDISMODULE_GET_API(FreeString);
REDISMODULE_GET_API(StringPtrLen);
REDISMODULE_GET_API(AutoMemory);
Expand Down
29 changes: 28 additions & 1 deletion tests/modules/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <assert.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

#define UNUSED(x) (void)(x)

Expand Down Expand Up @@ -42,6 +43,30 @@ int test_call_info(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
return REDISMODULE_OK;
}

static RedisModuleString *_test_varpintf(RedisModuleCtx *ctx, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
RedisModuleString *s = RedisModule_CreateStringVaprintf(ctx, fmt, ap);
va_end(ap);
return s;
}

int test_call_vaprintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModule_AutoMemory(ctx);
if (argc < 3) {
return RedisModule_WrongArity(ctx);
}
RedisModuleString *s = _test_varpintf(ctx,
"Got %d args. argv[1]: %s, argv[2]: %d",
argc - 1,
RedisModule_StringPtrLen(argv[1], NULL),
atoi(RedisModule_StringPtrLen(argv[2], NULL))
);

RedisModule_ReplyWithString(ctx, s);
return REDISMODULE_OK;
}

int test_ld_conv(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
UNUSED(argv);
UNUSED(argc);
Expand Down Expand Up @@ -185,13 +210,15 @@ int test_setlfu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argv);
REDISMODULE_NOT_USED(argc);
if (RedisModule_Init(ctx,"misc",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)
if (RedisModule_Init(ctx, "misc", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.call_generic", test_call_generic,"",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.call_info", test_call_info,"",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.call_vaprintf", test_call_vaprintf, "",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.ld_conversion", test_ld_conv, "",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.flushall", test_flushall,"",0,0,0) == REDISMODULE_ERR)
Expand Down
5 changes: 5 additions & 0 deletions tests/unit/moduleapi/misc.tcl
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ start_server {tags {"modules"}} {
assert { [string match "*cmdstat_module*" $info] }
}

test {test RM_CreateStringVaprintf} {
set str [r test.call_vaprintf text 42]
assert { $str eq {Got 2 args. argv[1]: text, argv[2]: 42} }
}

test {test long double conversions} {
set ld [r test.ld_conversion]
assert {[string match $ld "0.00000000000000001"]}
Expand Down

0 comments on commit 3076b13

Please sign in to comment.