Add ParseVarArgs

This allows a parsing of generic keyword <n> arg0..argN format for
arguments.
master
Mark Nunberg 7 years ago
parent af679ef8d6
commit fb9441d785

@ -243,4 +243,35 @@ int RedisModule_TryGetValue(RedisModuleKey *key, const RedisModuleType *type, vo
} else { } else {
return RMUTIL_VALUE_MISMATCH; return RMUTIL_VALUE_MISMATCH;
} }
} }
RedisModuleString **RMUtil_ParseVarArgs(RedisModuleString **argv, int argc, int offset,
const char *keyword, size_t *nargs) {
if (offset > argc) {
return NULL;
}
argv += offset;
argc -= offset;
int ix = RMUtil_ArgIndex(keyword, argv, argc);
if (ix < 0) {
return NULL;
} else if (ix >= argc - 1) {
*nargs = RMUTIL_VARARGS_BADARG;
return argv;
}
argv += (ix + 1);
argc -= (ix + 1);
long long n = 0;
RMUtil_ParseArgs(argv, argc, 0, "l", &n);
if (n > argc - 1 || n < 0) {
*nargs = RMUTIL_VARARGS_BADARG;
return argv;
}
*nargs = n;
return argv + 1;
}

@ -61,6 +61,17 @@ int RMUtil_ParseArgsAfter(const char *token, RedisModuleString **argv, int argc,
int rmutil_vparseArgs(RedisModuleString **argv, int argc, int offset, const char *fmt, va_list ap); int rmutil_vparseArgs(RedisModuleString **argv, int argc, int offset, const char *fmt, va_list ap);
#define RMUTIL_VARARGS_BADARG ((size_t)-1)
/**
* Parse arguments in the form of KEYWORD {len} {arg} .. {arg}_len.
* If keyword is present, returns the position within `argv` containing the arguments.
* Returns NULL if the keyword is not found.
* If a parse error has occurred, `nargs` is set to RMUTIL_VARARGS_BADARG, but
* the return value is not NULL.
*/
RedisModuleString **RMUtil_ParseVarArgs(RedisModuleString **argv, int argc, int offset,
const char *keyword, size_t *nargs);
// A single key/value entry in a redis info map // A single key/value entry in a redis info map
typedef struct { typedef struct {
const char *key; const char *key;

Loading…
Cancel
Save