mirror of
https://github.com/fluencelabs/redis
synced 2025-04-02 15:51:05 +00:00
redis cli argument splitting is general and is now moved into the sds.c lib
This commit is contained in:
parent
1fb4e8def7
commit
cbce517145
@ -366,79 +366,15 @@ static char **convertToSds(int count, char** args) {
|
|||||||
return sds;
|
return sds;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char **splitArguments(char *line, int *argc) {
|
|
||||||
char *p = line;
|
|
||||||
char *current = NULL;
|
|
||||||
char **vector = NULL;
|
|
||||||
|
|
||||||
*argc = 0;
|
|
||||||
while(1) {
|
|
||||||
/* skip blanks */
|
|
||||||
while(*p && isspace(*p)) p++;
|
|
||||||
if (*p) {
|
|
||||||
/* get a token */
|
|
||||||
int inq=0; /* set to 1 if we are in "quotes" */
|
|
||||||
int done = 0;
|
|
||||||
|
|
||||||
if (current == NULL) current = sdsempty();
|
|
||||||
while(!done) {
|
|
||||||
if (inq) {
|
|
||||||
if (*p == '\\' && *(p+1)) {
|
|
||||||
char c;
|
|
||||||
|
|
||||||
p++;
|
|
||||||
switch(*p) {
|
|
||||||
case 'n': c = '\n'; break;
|
|
||||||
case 'r': c = '\r'; break;
|
|
||||||
case 't': c = '\t'; break;
|
|
||||||
case 'b': c = '\b'; break;
|
|
||||||
case 'a': c = '\a'; break;
|
|
||||||
default: c = *p; break;
|
|
||||||
}
|
|
||||||
current = sdscatlen(current,&c,1);
|
|
||||||
} else if (*p == '"') {
|
|
||||||
done = 1;
|
|
||||||
} else {
|
|
||||||
current = sdscatlen(current,p,1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch(*p) {
|
|
||||||
case ' ':
|
|
||||||
case '\n':
|
|
||||||
case '\r':
|
|
||||||
case '\t':
|
|
||||||
case '\0':
|
|
||||||
done=1;
|
|
||||||
break;
|
|
||||||
case '"':
|
|
||||||
inq=1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
current = sdscatlen(current,p,1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (*p) p++;
|
|
||||||
}
|
|
||||||
/* add the token to the vector */
|
|
||||||
vector = zrealloc(vector,((*argc)+1)*sizeof(char*));
|
|
||||||
vector[*argc] = current;
|
|
||||||
(*argc)++;
|
|
||||||
current = NULL;
|
|
||||||
} else {
|
|
||||||
return vector;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LINE_BUFLEN 4096
|
#define LINE_BUFLEN 4096
|
||||||
static void repl() {
|
static void repl() {
|
||||||
int argc, j;
|
int argc, j;
|
||||||
char *line, **argv;
|
char *line;
|
||||||
|
sds *argv;
|
||||||
|
|
||||||
while((line = linenoise("redis> ")) != NULL) {
|
while((line = linenoise("redis> ")) != NULL) {
|
||||||
if (line[0] != '\0') {
|
if (line[0] != '\0') {
|
||||||
argv = splitArguments(line,&argc);
|
argv = sdssplitargs(line,&argc);
|
||||||
linenoiseHistoryAdd(line);
|
linenoiseHistoryAdd(line);
|
||||||
if (config.historyfile) linenoiseHistorySave(config.historyfile);
|
if (config.historyfile) linenoiseHistorySave(config.historyfile);
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
|
77
src/sds.c
77
src/sds.c
@ -382,3 +382,80 @@ sds sdscatrepr(sds s, char *p, size_t len) {
|
|||||||
}
|
}
|
||||||
return sdscatlen(s,"\"",1);
|
return sdscatlen(s,"\"",1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Split a line into arguments, where every argument can be in the
|
||||||
|
* following programming-language REPL-alike form:
|
||||||
|
*
|
||||||
|
* foo bar "newline are supported\n" and "\xff\x00otherstuff"
|
||||||
|
*
|
||||||
|
* The number of arguments is stored into *argc, and an array
|
||||||
|
* of sds is returned. The caller should sdsfree() all the returned
|
||||||
|
* strings and finally zfree() the array itself.
|
||||||
|
*
|
||||||
|
* Note that sdscatrepr() is able to convert back a string into
|
||||||
|
* a quoted string in the same format sdssplitargs() is able to parse.
|
||||||
|
*/
|
||||||
|
sds *sdssplitargs(char *line, int *argc) {
|
||||||
|
char *p = line;
|
||||||
|
char *current = NULL;
|
||||||
|
char **vector = NULL;
|
||||||
|
|
||||||
|
*argc = 0;
|
||||||
|
while(1) {
|
||||||
|
/* skip blanks */
|
||||||
|
while(*p && isspace(*p)) p++;
|
||||||
|
if (*p) {
|
||||||
|
/* get a token */
|
||||||
|
int inq=0; /* set to 1 if we are in "quotes" */
|
||||||
|
int done = 0;
|
||||||
|
|
||||||
|
if (current == NULL) current = sdsempty();
|
||||||
|
while(!done) {
|
||||||
|
if (inq) {
|
||||||
|
if (*p == '\\' && *(p+1)) {
|
||||||
|
char c;
|
||||||
|
|
||||||
|
p++;
|
||||||
|
switch(*p) {
|
||||||
|
case 'n': c = '\n'; break;
|
||||||
|
case 'r': c = '\r'; break;
|
||||||
|
case 't': c = '\t'; break;
|
||||||
|
case 'b': c = '\b'; break;
|
||||||
|
case 'a': c = '\a'; break;
|
||||||
|
default: c = *p; break;
|
||||||
|
}
|
||||||
|
current = sdscatlen(current,&c,1);
|
||||||
|
} else if (*p == '"') {
|
||||||
|
done = 1;
|
||||||
|
} else {
|
||||||
|
current = sdscatlen(current,p,1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(*p) {
|
||||||
|
case ' ':
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
case '\t':
|
||||||
|
case '\0':
|
||||||
|
done=1;
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
inq=1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
current = sdscatlen(current,p,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*p) p++;
|
||||||
|
}
|
||||||
|
/* add the token to the vector */
|
||||||
|
vector = zrealloc(vector,((*argc)+1)*sizeof(char*));
|
||||||
|
vector[*argc] = current;
|
||||||
|
(*argc)++;
|
||||||
|
current = NULL;
|
||||||
|
} else {
|
||||||
|
return vector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -70,5 +70,6 @@ void sdstolower(sds s);
|
|||||||
void sdstoupper(sds s);
|
void sdstoupper(sds s);
|
||||||
sds sdsfromlonglong(long long value);
|
sds sdsfromlonglong(long long value);
|
||||||
sds sdscatrepr(sds s, char *p, size_t len);
|
sds sdscatrepr(sds s, char *p, size_t len);
|
||||||
|
sds *sdssplitargs(char *line, int *argc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user