Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a88a2af6
Commit
a88a2af6
authored
Apr 26, 2010
by
antirez
Browse files
Initial support for quoted strings in redis-cli
parent
526d00a5
Changes
1
Hide whitespace changes
Inline
Side-by-side
redis-cli.c
View file @
a88a2af6
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <unistd.h>
#include <ctype.h>
#include "anet.h"
#include "anet.h"
#include "sds.h"
#include "sds.h"
...
@@ -460,32 +461,95 @@ static char **convertToSds(int count, char** args) {
...
@@ -460,32 +461,95 @@ 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
static
void
repl
()
{
static
void
repl
()
{
int
size
=
4096
,
max
=
size
>>
1
,
argc
;
int
argc
,
j
;
char
*
line
;
char
*
line
,
**
argv
;
char
**
ap
,
*
args
[
max
];
while
((
line
=
linenoise
(
"redis> "
))
!=
NULL
)
{
while
((
line
=
linenoise
(
"redis> "
))
!=
NULL
)
{
if
(
line
[
0
]
!=
'\0'
)
{
if
(
line
[
0
]
!=
'\0'
)
{
linenoiseHistoryAdd
(
line
);
argv
=
splitArguments
(
line
,
&
argc
);
argc
=
0
;
linenoiseHistoryAdd
(
line
);
if
(
argc
>
0
)
{
for
(
ap
=
args
;
(
*
ap
=
strsep
(
&
line
,
"
\t
"
))
!=
NULL
;)
{
if
(
strcasecmp
(
argv
[
0
],
"quit"
)
==
0
||
if
(
**
ap
!=
'\0'
)
{
strcasecmp
(
argv
[
0
],
"exit"
)
==
0
)
if
(
argc
>=
max
)
break
;
exit
(
0
);
if
(
strcasecmp
(
*
ap
,
"quit"
)
==
0
||
strcasecmp
(
*
ap
,
"exit"
)
==
0
)
else
exit
(
0
);
cliSendCommand
(
argc
,
argv
,
1
);
ap
++
;
}
argc
++
;
/* Free the argument vector */
}
for
(
j
=
0
;
j
<
argc
;
j
++
)
}
sdsfree
(
argv
[
j
]);
free
(
argv
);
cliSendCommand
(
argc
,
convertToSds
(
argc
,
args
),
1
);
}
}
/* linenoise() returns malloc-ed lines like readline() */
free
(
line
);
free
(
line
);
}
}
exit
(
0
);
exit
(
0
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment