Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hanoi2005
redis
提交
b2cc45bf
R
redis
项目概览
hanoi2005
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b2cc45bf
编写于
11月 29, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor and support help for command names with spaces
上级
41945ba6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
69 addition
and
55 deletion
+69
-55
src/redis-cli.c
src/redis-cli.c
+69
-55
未找到文件。
src/redis-cli.c
浏览文件 @
b2cc45bf
...
...
@@ -89,6 +89,50 @@ static long long mstime(void) {
* Help functions
*--------------------------------------------------------------------------- */
#define CLI_HELP_COMMAND 1
#define CLI_HELP_GROUP 2
typedef
struct
{
int
type
;
int
argc
;
sds
*
argv
;
sds
full
;
/* Only used for help on commands */
struct
commandHelp
*
org
;
}
helpEntry
;
static
helpEntry
*
helpEntries
;
static
int
helpEntriesLen
;
static
void
cliInitHelp
()
{
int
commandslen
=
sizeof
(
commandHelp
)
/
sizeof
(
struct
commandHelp
);
int
groupslen
=
sizeof
(
commandGroups
)
/
sizeof
(
char
*
);
int
i
,
len
,
pos
=
0
;
helpEntry
tmp
;
helpEntriesLen
=
len
=
commandslen
+
groupslen
;
helpEntries
=
malloc
(
sizeof
(
helpEntry
)
*
len
);
for
(
i
=
0
;
i
<
groupslen
;
i
++
)
{
tmp
.
argc
=
1
;
tmp
.
argv
=
malloc
(
sizeof
(
sds
));
tmp
.
argv
[
0
]
=
sdscatprintf
(
sdsempty
(),
"@%s"
,
commandGroups
[
i
]);
tmp
.
full
=
tmp
.
argv
[
0
];
tmp
.
type
=
CLI_HELP_GROUP
;
tmp
.
org
=
NULL
;
helpEntries
[
pos
++
]
=
tmp
;
}
for
(
i
=
0
;
i
<
commandslen
;
i
++
)
{
tmp
.
argv
=
sdssplitargs
(
commandHelp
[
i
].
name
,
&
tmp
.
argc
);
tmp
.
full
=
sdsnew
(
commandHelp
[
i
].
name
);
tmp
.
type
=
CLI_HELP_COMMAND
;
tmp
.
org
=
&
commandHelp
[
i
];
helpEntries
[
pos
++
]
=
tmp
;
}
}
/* Output command help to stdout. */
static
void
cliOutputCommandHelp
(
struct
commandHelp
*
help
,
int
group
)
{
printf
(
"
\r\n
\x1b
[1m%s
\x1b
[0m
\x1b
[90m%s
\x1b
[0m
\r\n
"
,
help
->
name
,
help
->
params
);
...
...
@@ -113,9 +157,10 @@ static void cliOutputGenericHelp() {
/* Output all command help, filtering by group or command name. */
static
void
cliOutputHelp
(
int
argc
,
char
**
argv
)
{
int
i
,
len
;
struct
commandHelp
*
help
;
int
i
,
j
,
len
;
int
group
=
-
1
;
helpEntry
*
entry
;
struct
commandHelp
*
help
;
if
(
argc
==
0
)
{
cliOutputGenericHelp
();
...
...
@@ -130,13 +175,21 @@ static void cliOutputHelp(int argc, char **argv) {
}
}
len
=
sizeof
(
commandHelp
)
/
sizeof
(
struct
commandHelp
);
assert
(
argc
>
0
);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
help
=
&
commandHelp
[
i
];
for
(
i
=
0
;
i
<
helpEntriesLen
;
i
++
)
{
entry
=
&
helpEntries
[
i
];
if
(
entry
->
type
!=
CLI_HELP_COMMAND
)
continue
;
help
=
entry
->
org
;
if
(
group
==
-
1
)
{
if
(
strcasecmp
(
help
->
name
,
argv
[
0
])
==
0
)
{
cliOutputCommandHelp
(
help
,
1
);
/* Compare all arguments */
if
(
argc
==
entry
->
argc
)
{
for
(
j
=
0
;
j
<
argc
;
j
++
)
{
if
(
strcasecmp
(
argv
[
j
],
entry
->
argv
[
j
])
!=
0
)
break
;
}
if
(
j
==
argc
)
{
cliOutputCommandHelp
(
help
,
1
);
}
}
}
else
{
if
(
group
==
help
->
group
)
{
...
...
@@ -147,69 +200,30 @@ static void cliOutputHelp(int argc, char **argv) {
printf
(
"
\r\n
"
);
}
#define CLI_COMPLETE_COMMAND 1
#define CLI_COMPLETE_GROUP 2
typedef
struct
{
char
*
name
;
int
type
;
}
completionEntry
;
static
completionEntry
*
completionEntries
;
static
int
completionEntriesLen
;
/* Build 2 different arrays for completion. One for raw command completion and one
* for completion using HELP (including groups). */
static
void
cliInitHelp
()
{
int
commandslen
=
sizeof
(
commandHelp
)
/
sizeof
(
struct
commandHelp
);
int
groupslen
=
sizeof
(
commandGroups
)
/
sizeof
(
char
*
);
int
i
,
len
,
pos
=
0
;
completionEntry
tmp
;
completionEntriesLen
=
len
=
commandslen
+
groupslen
;
completionEntries
=
malloc
(
sizeof
(
completionEntry
)
*
len
);
for
(
i
=
0
;
i
<
groupslen
;
i
++
)
{
tmp
.
name
=
malloc
(
strlen
(
commandGroups
[
i
]
+
2
));
sprintf
(
tmp
.
name
,
"@%s"
,
commandGroups
[
i
]);
tmp
.
type
=
CLI_COMPLETE_GROUP
;
completionEntries
[
pos
++
]
=
tmp
;
}
for
(
i
=
0
;
i
<
commandslen
;
i
++
)
{
tmp
.
name
=
commandHelp
[
i
].
name
;
tmp
.
type
=
CLI_COMPLETE_COMMAND
;
completionEntries
[
pos
++
]
=
tmp
;
}
}
static
void
completionCallback
(
const
char
*
buf
,
linenoiseCompletions
*
lc
)
{
size_t
startpos
=
0
;
int
mask
;
int
i
;
size_t
matchlen
;
char
*
tmp
;
size_t
tmpsize
;
sds
tmp
;
if
(
strncasecmp
(
buf
,
"help "
,
5
)
==
0
)
{
startpos
=
5
;
while
(
isspace
(
buf
[
startpos
]))
startpos
++
;
mask
=
CLI_
COMPLETE_COMMAND
|
CLI_COMPLETE
_GROUP
;
mask
=
CLI_
HELP_COMMAND
|
CLI_HELP
_GROUP
;
}
else
{
mask
=
CLI_
COMPLETE
_COMMAND
;
mask
=
CLI_
HELP
_COMMAND
;
}
for
(
i
=
0
;
i
<
completion
EntriesLen
;
i
++
)
{
if
(
!
(
completion
Entries
[
i
].
type
&
mask
))
continue
;
for
(
i
=
0
;
i
<
help
EntriesLen
;
i
++
)
{
if
(
!
(
help
Entries
[
i
].
type
&
mask
))
continue
;
matchlen
=
strlen
(
buf
+
startpos
);
if
(
strncasecmp
(
buf
+
startpos
,
completionEntries
[
i
].
name
,
matchlen
)
==
0
)
{
tmpsize
=
startpos
+
strlen
(
completionEntries
[
i
].
name
)
+
1
;
tmp
=
malloc
(
tmpsize
);
memcpy
(
tmp
,
buf
,
startpos
);
memcpy
(
tmp
+
startpos
,
completionEntries
[
i
].
name
,
tmpsize
-
startpos
);
if
(
strncasecmp
(
buf
+
startpos
,
helpEntries
[
i
].
full
,
matchlen
)
==
0
)
{
tmp
=
sdsnewlen
(
buf
,
startpos
);
tmp
=
sdscat
(
tmp
,
helpEntries
[
i
].
full
);
linenoiseAddCompletion
(
lc
,
tmp
);
free
(
tmp
);
sds
free
(
tmp
);
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录