improve the command line auto-complete feature.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2106 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
bernard.xiong@gmail.com 2012-04-29 12:19:29 +00:00
parent 04a79d24cf
commit 30a2731d43
1 changed files with 467 additions and 379 deletions

View File

@ -25,6 +25,7 @@
* list and sysvar list
* 2009-05-30 Bernard add list_device
* 2010-04-21 yi.qiu add list_module
* 2012-04-29 goprife improve the command line auto-complete feature.
*/
#include <rtthread.h>
@ -162,13 +163,14 @@ static long _list_event(struct rt_list_node *list)
e = (struct rt_event*)(rt_list_entry(node, struct rt_object, list));
if( !rt_list_isempty(&e->parent.suspend_thread) )
{
rt_kprintf("%-8s 0x%08x %03d:", e->parent.parent.name, e->set, rt_list_len(&e->parent.suspend_thread));
rt_kprintf("%-8.*s 0x%08x %03d:", RT_NAME_MAX, e->parent.parent.name,
e->set, rt_list_len(&e->parent.suspend_thread));
show_wait_queue(&(e->parent.suspend_thread));
rt_kprintf("\n");
}
else
{
rt_kprintf("%-8s 0x%08x 0\n", e->parent.parent.name, e->set);
rt_kprintf("%-8.*s 0x%08x 0\n", RT_NAME_MAX, e->parent.parent.name, e->set);
}
}
@ -220,13 +222,15 @@ static long _list_mailbox(struct rt_list_node *list)
m = (struct rt_mailbox*)(rt_list_entry(node, struct rt_object, list));
if( !rt_list_isempty(&m->parent.suspend_thread) )
{
rt_kprintf("%-8s %04d %04d %d:", m->parent.parent.name, m->entry, m->size, rt_list_len(&m->parent.suspend_thread));
rt_kprintf("%-8.*s %04d %04d %d:", RT_NAME_MAX, m->parent.parent.name,
m->entry, m->size, rt_list_len(&m->parent.suspend_thread));
show_wait_queue(&(m->parent.suspend_thread));
rt_kprintf("\n");
}
else
{
rt_kprintf("%-8s %04d %04d %d\n", m->parent.parent.name, m->entry, m->size, rt_list_len(&m->parent.suspend_thread));
rt_kprintf("%-8.*s %04d %04d %d\n", RT_NAME_MAX, m->parent.parent.name,
m->entry, m->size, rt_list_len(&m->parent.suspend_thread));
}
}
@ -253,13 +257,15 @@ static long _list_msgqueue(struct rt_list_node *list)
m = (struct rt_messagequeue*)(rt_list_entry(node, struct rt_object, list));
if( !rt_list_isempty(&m->parent.suspend_thread) )
{
rt_kprintf("%-8s %04d %d:", m->parent.parent.name, m->entry, rt_list_len(&m->parent.suspend_thread));
rt_kprintf("%-8.*s %04d %d:", RT_NAME_MAX, m->parent.parent.name,
m->entry, rt_list_len(&m->parent.suspend_thread));
show_wait_queue(&(m->parent.suspend_thread));
rt_kprintf("\n");
}
else
{
rt_kprintf("%-8s %04d %d\n", m->parent.parent.name, m->entry, rt_list_len(&m->parent.suspend_thread));
rt_kprintf("%-8.*s %04d %d\n", RT_NAME_MAX, m->parent.parent.name,
m->entry, rt_list_len(&m->parent.suspend_thread));
}
}
@ -286,7 +292,7 @@ static long _list_mempool(struct rt_list_node *list)
mp = (struct rt_mempool*)rt_list_entry(node, struct rt_object, list);
if (mp->suspend_thread_count > 0)
{
rt_kprintf("%-8s %04d %04d %04d %d:", mp->parent.name,
rt_kprintf("%-8.*s %04d %04d %04d %d:", RT_NAME_MAX, mp->parent.name,
mp->block_size, mp->block_total_count, mp->block_free_count,
mp->suspend_thread_count);
show_wait_queue(&(mp->suspend_thread));
@ -294,7 +300,7 @@ static long _list_mempool(struct rt_list_node *list)
}
else
{
rt_kprintf("%-8s %04d %04d %04d %d\n", mp->parent.name,
rt_kprintf("%-8.*s %04d %04d %04d %d\n", RT_NAME_MAX, mp->parent.name,
mp->block_size, mp->block_total_count, mp->block_free_count,
mp->suspend_thread_count);
}
@ -320,7 +326,7 @@ static long _list_timer(struct rt_list_node *list)
for (node = list->next; node != list; node = node->next)
{
timer = (struct rt_timer*)(rt_list_entry(node, struct rt_object, list));
rt_kprintf("%-8s 0x%08x 0x%08x ", timer->parent.name, timer->init_tick, timer->timeout_tick);
rt_kprintf("%-8.*s 0x%08x 0x%08x ", RT_NAME_MAX, timer->parent.name, timer->init_tick, timer->timeout_tick);
if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED) rt_kprintf("activated\n");
else rt_kprintf("deactivated\n");
}
@ -365,8 +371,9 @@ static long _list_device(struct rt_list_node *list)
for (node = list->next; node != list; node = node->next)
{
device = (struct rt_device*)(rt_list_entry(node, struct rt_object, list));
rt_kprintf("%-8s %-8s \n", device->parent.name,
(device->type <= RT_Device_Class_Unknown)?device_type_str[device->type]:device_type_str[RT_Device_Class_Unknown]);
rt_kprintf("%-8.*s %-8s \n", RT_NAME_MAX, device->parent.name,
(device->type <= RT_Device_Class_Unknown)?
device_type_str[device->type]:device_type_str[RT_Device_Class_Unknown]);
}
return 0;
@ -425,7 +432,7 @@ int list_mod_detail(const char* name)
rt_kprintf("main thread pri status sp stack size max used left tick error\n");
rt_kprintf("------------- ---- ------- ---------- ---------- ---------- ---------- ---\n");
thread = module->module_thread;
rt_kprintf("%-8s 0x%02x", thread->name, thread->current_priority);
rt_kprintf("%-8.*s 0x%02x", RT_NAME_MAX, thread->name, thread->current_priority);
if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready ");
else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
@ -562,17 +569,32 @@ static int str_is_prefix(const char* prefix, const char* str)
return -1;
}
static int str_common(const char * str1, const char * str2)
{
const char * str = str1;
while( *str !=0 && *str2 !=0 && (*str == *str2))
{
str ++;
str2 ++;
}
return (str - str1);
}
void list_prefix(char* prefix)
{
struct finsh_syscall_item* syscall_item;
struct finsh_sysvar_item* sysvar_item;
rt_uint16_t func_cnt, var_cnt;
int length, min_length;
const char* name_ptr;
func_cnt = 0;
var_cnt = 0;
name_ptr = RT_NULL;
/* checks in system function call */
{
struct finsh_syscall* index;
for (index = _syscall_table_begin; index < _syscall_table_end; index ++)
@ -580,12 +602,28 @@ void list_prefix(char* prefix)
if (str_is_prefix(prefix, index->name) == 0)
{
if (func_cnt == 0)
{
rt_kprintf("--function:\n");
func_cnt ++;
if (*prefix != 0)
{
/* set name_ptr */
name_ptr = index->name;
/* set initial length */
min_length = strlen(name_ptr);
}
}
func_cnt ++;
if (*prefix != 0)
{
length = str_common(name_ptr, index->name);
if (length < min_length)
min_length = length;
}
#ifdef FINSH_USING_DESCRIPTION
rt_kprintf("%-16s -- %s\n", index->name, index->desc);
#else
@ -595,23 +633,40 @@ void list_prefix(char* prefix)
}
}
/* list syscall list */
/* checks in dynamic system function call */
syscall_item = global_syscall_list;
while (syscall_item != NULL)
{
if (str_is_prefix(prefix, syscall_item->syscall.name) == 0)
{
if (func_cnt == 0)
{
rt_kprintf("--function:\n");
func_cnt ++;
if (*prefix != 0 && name_ptr == NULL)
{
/* set name_ptr */
name_ptr = syscall_item->syscall.name;
/* set initial length */
min_length = strlen(name_ptr);
}
}
func_cnt ++;
if (*prefix != 0)
{
length = str_common(name_ptr, syscall_item->syscall.name);
if (length < min_length)
min_length = length;
}
rt_kprintf("[l] %s\n", syscall_item->syscall.name);
}
syscall_item = syscall_item->next;
}
/* checks in system variable */
{
struct finsh_sysvar* index;
for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
@ -619,12 +674,29 @@ void list_prefix(char* prefix)
if (str_is_prefix(prefix, index->name) == 0)
{
if (var_cnt == 0)
{
rt_kprintf("--variable:\n");
var_cnt ++;
/* set name ptr */
if (*prefix != 0 && name_ptr == NULL)
{
/* set name_ptr */
name_ptr = index->name;
/* set initial length */
min_length = strlen(name_ptr);
}
}
var_cnt ++;
if (*prefix != 0)
{
length = str_common(name_ptr, index->name);
if (length < min_length)
min_length = length;
}
#ifdef FINSH_USING_DESCRIPTION
rt_kprintf("%-16s -- %s\n", index->name, index->desc);
#else
@ -634,27 +706,43 @@ void list_prefix(char* prefix)
}
}
/* checks in dynamic system variable */
sysvar_item = global_sysvar_list;
while (sysvar_item != NULL)
{
if (str_is_prefix(prefix, sysvar_item->sysvar.name) == 0)
{
if (var_cnt == 0)
{
rt_kprintf("--variable:\n");
var_cnt ++;
/* set name ptr */
if (*prefix != 0 && name_ptr == NULL)
{
/* set name_ptr */
name_ptr = sysvar_item->sysvar.name;
rt_kprintf("[l] %s\n", sysvar_item->sysvar.name);
/* set initial length */
min_length = strlen(name_ptr);
}
}
var_cnt ++;
if (*prefix != 0)
{
length = str_common(name_ptr, sysvar_item->sysvar.name);
if (length < min_length)
min_length = length;
}
rt_kprintf("[v] %s\n", sysvar_item->sysvar.name);
}
sysvar_item = sysvar_item->next;
}
/* only one matched */
if ((func_cnt + var_cnt) == 1)
if (name_ptr != NULL)
{
rt_strncpy(prefix, name_ptr, strlen(name_ptr));
rt_strncpy(prefix, name_ptr, min_length);
}
}