diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h index c93986de6ef7d56567492ebd037bba593e42b773..a8fd761f0ffa92539c804f10c9a07eca26953f67 100644 --- a/components/finsh/finsh.h +++ b/components/finsh/finsh.h @@ -178,202 +178,179 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name); #ifdef FINSH_USING_SYMTAB #ifdef __TI_COMPILER_VERSION__ -#define _EMIT_PRAGMA(x) _Pragma(#x) -#define __TI_FINSH_EXPORT_FUNCTION(f) _EMIT_PRAGMA(DATA_SECTION(f,"FSymTab")) -#define __TI_FINSH_EXPORT_VAR(v) _EMIT_PRAGMA(DATA_SECTION(v,"VSymTab")) +#define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) +#define __TI_FINSH_EXPORT_VAR(v) PRAGMA(DATA_SECTION(v,"VSymTab")) #endif - #ifdef FINSH_USING_DESCRIPTION - /** - * @ingroup finsh - * - * This macro exports a system function to finsh shell. - * - * @param name the name of function. - * @param desc the description of function, which will show in help. - */ + #ifdef FINSH_USING_DESCRIPTION #ifdef _MSC_VER - #define FINSH_FUNCTION_EXPORT(name, desc) \ - const char __fsym_##name##_name[] = #name; \ - const char __fsym_##name##_desc[] = #desc; \ - __declspec(allocate("FSymTab$f")) const struct finsh_syscall __fsym_##name = \ - { \ - __fsym_##name##_name, \ - __fsym_##name##_desc, \ - (syscall_func)&name \ - }; + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + const char __fsym_##cmd##_desc[] = #desc; \ + __declspec(allocate("FSymTab$f")) \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; #pragma comment(linker, "/merge:FSymTab=mytext") + + #define FINSH_VAR_EXPORT(name, type, desc) \ + const char __vsym_##name##_name[] = #name; \ + const char __vsym_##name##_desc[] = #desc; \ + __declspec(allocate("VSymTab")) \ + const struct finsh_sysvar __vsym_##name = \ + { \ + __vsym_##name##_name, \ + __vsym_##name##_desc, \ + type, \ + (void*)&name \ + }; + #elif defined(__TI_COMPILER_VERSION__) - #define FINSH_FUNCTION_EXPORT(name, desc) \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##name); \ - const char __fsym_##name##_name[] = #name; \ - const char __fsym_##name##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##name = \ - { \ - __fsym_##name##_name, \ - __fsym_##name##_desc, \ - (syscall_func)&name \ - }; - #else - #define FINSH_FUNCTION_EXPORT(name, desc) \ - const char __fsym_##name##_name[] = #name; \ - const char __fsym_##name##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##name SECTION("FSymTab")= \ - { \ - __fsym_##name##_name, \ - __fsym_##name##_desc, \ - (syscall_func)&name \ - }; - #endif /* FINSH_FUNCTION_EXPORT defines */ - - /** - * @ingroup finsh - * - * This macro exports a system function with an alias name to finsh shell. - * - * @param name the name of function. - * @param alias the alias name of function. - * @param desc the description of function, which will show in help. - */ - #ifdef _MSC_VER - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - const char __fsym_##alias##_name[] = #alias; \ - const char __fsym_##alias##_desc[] = #desc; \ - __declspec(allocate("FSymTab$f")) \ - const struct finsh_syscall __fsym_##alias = \ - { \ - __fsym_##alias##_name, \ - __fsym_##alias##_desc, \ - (syscall_func)&name \ - }; - #elif defined(__TI_COMPILER_VERSION__) - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##alias); \ - const char __fsym_##alias##_name[] = #alias; \ - const char __fsym_##alias##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##alias = \ - { \ - __fsym_##alias##_name, \ - __fsym_##alias##_desc, \ - (syscall_func)&name \ - }; + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ + const char __fsym_##cmd##_name[] = #cmd; \ + const char __fsym_##cmd##_desc[] = #desc; \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; + + #define FINSH_VAR_EXPORT(name, type, desc) \ + __TI_FINSH_EXPORT_VAR(__vsym_##name); \ + const char __vsym_##name##_name[] = #name; \ + const char __vsym_##name##_desc[] = #desc; \ + const struct finsh_sysvar __vsym_##name = \ + { \ + __vsym_##name##_name, \ + __vsym_##name##_desc, \ + type, \ + (void*)&name \ + }; + #else - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - const char __fsym_##alias##_name[] = #alias; \ - const char __fsym_##alias##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##alias SECTION("FSymTab")= \ - { \ - __fsym_##alias##_name, \ - __fsym_##alias##_desc, \ - (syscall_func)&name \ - }; - #endif /* FINSH_FUNCTION_EXPORT_ALIAS defines */ - /** - * @ingroup finsh - * - * This macro exports a variable to finsh shell. - * - * @param name the name of function. - * @param type the type of variable. - * @param desc the description of function, which will show in help. - */ + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + const char __fsym_##cmd##_desc[] = #desc; \ + const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; + + #define FINSH_VAR_EXPORT(name, type, desc) \ + const char __vsym_##name##_name[] = #name; \ + const char __vsym_##name##_desc[] = #desc; \ + const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ + { \ + __vsym_##name##_name, \ + __vsym_##name##_desc, \ + type, \ + (void*)&name \ + }; + + #endif + #else #ifdef _MSC_VER - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - const char __vsym_##name##_desc[] = #desc; \ - __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + __declspec(allocate("FSymTab$f")) \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; + #pragma comment(linker, "/merge:FSymTab=mytext") + + #define FINSH_VAR_EXPORT(name, type, desc) \ + const char __vsym_##name##_name[] = #name; \ + __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \ + { \ + __vsym_##name##_name, \ + type, \ + (void*)&name \ + }; + #elif defined(__TI_COMPILER_VERSION__) - #define FINSH_VAR_EXPORT(name, type, desc) \ - __TI_FINSH_EXPORT_VAR(__vsym_##name); \ - const char __vsym_##name##_name[] = #name; \ - const char __vsym_##name##_desc[] = #desc; \ - const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ + const char __fsym_##cmd##_name[] = #cmd; \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; + + #define FINSH_VAR_EXPORT(name, type, desc) \ + __TI_FINSH_EXPORT_VAR(__vsym_##name); \ + const char __vsym_##name##_name[] = #name; \ + const struct finsh_sysvar __vsym_##name = \ + { \ + __vsym_##name##_name, \ + type, \ + (void*)&name \ + }; + #else - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - const char __vsym_##name##_desc[] = #desc; \ - const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; - #endif /* FINSH_VAR_EXPORT defines */ - #else /* FINSH_USING_DESCRIPTION */ - #if defined(__TI_COMPILER_VERSION__) - #define FINSH_FUNCTION_EXPORT(name, desc) \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##name); \ - const char __fsym_##name##_name[] = #name; \ - const char __fsym_##name##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##name = \ - { \ - __fsym_##name##_name, \ - __fsym_##name##_desc, \ - (syscall_func)&name \ - }; - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - const char __fsym_##alias##_name[] = #alias; \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##alias); \ - const struct finsh_syscall __fsym_##alias = \ - { \ - __fsym_##alias##_name, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - __TI_FINSH_EXPORT_VAR(__vsym_##name); \ - const char __vsym_##name##_name[] = #name; \ - const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - type, \ - (void*)&name \ - }; - #else - #define FINSH_FUNCTION_EXPORT(name, desc) \ - const char __fsym_##name##_name[] = #name; \ - const struct finsh_syscall __fsym_##name SECTION("FSymTab")= \ - { \ - __fsym_##name##_name, \ - (syscall_func)&name \ - }; - - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - const char __fsym_##alias##_name[] = #alias; \ - const struct finsh_syscall __fsym_##alias SECTION("FSymTab")= \ - { \ - __fsym_##alias##_name, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ - { \ - __vsym_##name##_name, \ - type, \ - (void*)&name \ - }; - #endif /* __TI_COMPILER_VERSION__ */ - #endif /* FINSH_USING_DESCRIPTION */ -#else - #define FINSH_FUNCTION_EXPORT(name, desc) - #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) - #define FINSH_VAR_EXPORT(name, type, desc) -#endif + #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; + + #define FINSH_VAR_EXPORT(name, type, desc) \ + const char __vsym_##name##_name[] = #name; \ + const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ + { \ + __vsym_##name##_name, \ + type, \ + (void*)&name \ + }; + + #endif + #endif /* end of FINSH_USING_DESCRIPTION */ +#endif /* end of FINSH_USING_SYMTAB */ + +/** + * @ingroup finsh + * + * This macro exports a system function to finsh shell. + * + * @param name the name of function. + * @param desc the description of function, which will show in help. + */ +#define FINSH_FUNCTION_EXPORT(name, desc) \ + FINSH_FUNCTION_EXPORT_CMD(name, name, desc) + +/** + * @ingroup finsh + * + * This macro exports a system function with an alias name to finsh shell. + * + * @param name the name of function. + * @param alias the alias name of function. + * @param desc the description of function, which will show in help. + */ +#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ + FINSH_FUNCTION_EXPORT_CMD(name, alias, desc) + +/** + * @ingroup finsh + * + * This macro exports a command to module shell. + * + * @param command the name of command. + * @param desc the description of command, which will show in help. + */ +#define MSH_CMD_EXPORT(command, desc) \ + FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc) struct finsh_token { diff --git a/components/finsh/msh.c b/components/finsh/msh.c index f8d1a4fabc9eb8609bf668897b247b59de58219d..a100b3d60d2b0870cf942fa82dec6221ec3ed210 100644 --- a/components/finsh/msh.c +++ b/components/finsh/msh.c @@ -73,15 +73,18 @@ int msh_help(int argc, char** argv) FINSH_NEXT_SYSCALL(index)) { if (strncmp(index->name, "__cmd_", 6) != 0) continue; - +#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB) + rt_kprintf("%-16s - %s\n", &index->name[6], index->desc); +#else rt_kprintf("%s ", &index->name[6]); +#endif } } rt_kprintf("\n"); return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(msh_help, __cmd_help, "RT-Thread shell help."); +FINSH_FUNCTION_EXPORT_ALIAS(msh_help, __cmd_help, RT-Thread shell help.); static int msh_split(char* cmd, rt_size_t length, char* argv[RT_FINSH_ARG_MAX]) { @@ -197,14 +200,130 @@ static int str_common(const char *str1, const char *str2) return (str - str1); } +#ifdef RT_USING_DFS +#include +void msh_auto_complete_path(char *path) +{ + DIR* dir; + struct dirent *dirent; + char *full_path, *ptr, *index; + + full_path = (char*)rt_malloc(256); + if (full_path == RT_NULL) return; /* out of memory */ + + ptr = full_path; + if (*path != '/') + { + getcwd(full_path, 256); + if (full_path[rt_strlen(full_path) - 1] != '/') + strcat(full_path, "/"); + } + else *full_path = '\0'; + + index = RT_NULL; ptr = path; + for (;;) + { + if (*ptr == '/') index = ptr + 1; if (!*ptr) break; ptr ++; + } + if (index == RT_NULL) index = path; + + if (index != RT_NULL) + { + char *dest = index; + + /* fill the parent path */ + ptr = full_path; + while (*ptr) ptr ++; + + for (index = path; index != dest;) + *ptr++ = *index++; + *ptr = '\0'; + + dir = opendir(full_path); + if (dir == RT_NULL) /* open directory failed! */ + { + rt_free(full_path); + return; + } + + /* restore the index position */ + index = dest; + } + + /* auto complete the file or directory name */ + if (*index == '\0') /* display all of files and directories */ + { + for (;;) + { + dirent = readdir(dir); + if (dirent == RT_NULL) break; + + rt_kprintf("%s\n", dirent->d_name); + } + } + else + { + int length, min_length; + + min_length = 0; + for (;;) + { + dirent = readdir(dir); + if (dirent == RT_NULL) break; + + /* matched the prefix string */ + if (strncmp(index, dirent->d_name, rt_strlen(index)) == 0) + { + if (min_length == 0) + { + min_length = rt_strlen(dirent->d_name); + /* save dirent name */ + strcpy(full_path, dirent->d_name); + } + + length = str_common(dirent->d_name, full_path); + + if (length < min_length) + { + min_length = length; + } + } + } + + if (min_length) + { + if (min_length < rt_strlen(full_path)) + { + /* list the candidate */ + rewinddir(dir); + + for (;;) + { + dirent = readdir(dir); + if (dirent == RT_NULL) break; + + if (strncmp(index, dirent->d_name, rt_strlen(index)) == 0) + rt_kprintf("%s\n", dirent->d_name); + } + } + + length = index - path; + memcpy(index, full_path, min_length); + path[length + min_length] = '\0'; + } + } + + closedir(dir); + rt_free(full_path); +} +#endif + void msh_auto_complete(char *prefix) { - rt_uint16_t func_cnt; int length, min_length; const char *name_ptr, *cmd_name; struct finsh_syscall *index; - func_cnt = 0; min_length = 0; name_ptr = RT_NULL; @@ -214,6 +333,25 @@ void msh_auto_complete(char *prefix) return; } +#ifdef RT_USING_DFS + /* check whether a spare in the command */ + { + char *ptr; + + ptr = prefix + rt_strlen(prefix); + while (ptr != prefix) + { + if (*ptr == ' ') + { + msh_auto_complete_path(ptr + 1); + break; + } + + ptr --; + } + } +#endif + /* checks in internal command */ { for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) @@ -224,17 +362,14 @@ void msh_auto_complete(char *prefix) cmd_name = (const char*) &index->name[6]; if (strncmp(prefix, cmd_name, strlen(prefix)) == 0) { - if (func_cnt == 0) + if (min_length == 0) { /* set name_ptr */ name_ptr = cmd_name; - /* set initial length */ min_length = strlen(name_ptr); } - func_cnt ++; - length = str_common(name_ptr, cmd_name); if (length < min_length) min_length = length; @@ -253,3 +388,4 @@ void msh_auto_complete(char *prefix) return ; } #endif + diff --git a/components/finsh/msh_cmd.c b/components/finsh/msh_cmd.c index cffb374c2e3f9680277bb823645e931f08e62ac7..cc0f6e140173e700969550f0b10843a3bb9d3c10 100644 --- a/components/finsh/msh_cmd.c +++ b/components/finsh/msh_cmd.c @@ -59,7 +59,7 @@ int cmd_ls(int argc, char** argv) return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_ls, __cmd_ls, "List information about the FILEs."); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_ls, __cmd_ls, List information about the FILEs.); int cmd_cp(int argc, char** argv) { @@ -77,7 +77,7 @@ int cmd_cp(int argc, char** argv) return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_cp, __cmd_cp, "Copy SOURCE to DEST."); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_cp, __cmd_cp, Copy SOURCE to DEST.); int cmd_mv(int argc, char** argv) { @@ -89,11 +89,12 @@ int cmd_mv(int argc, char** argv) else { rt_kprintf("%s => %s\n", argv[1], argv[2]); + rename(argv[1], argv[2]); } return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_mv, __cmd_mv, "Rename SOURCE to DEST."); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_mv, __cmd_mv, Rename SOURCE to DEST.); int cmd_cat(int argc, char** argv) { @@ -114,7 +115,7 @@ int cmd_cat(int argc, char** argv) return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_cat, __cmd_cat, "Concatenate FILE(s)"); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_cat, __cmd_cat, Concatenate FILE(s)); int cmd_rm(int argc, char** argv) { @@ -134,7 +135,7 @@ int cmd_rm(int argc, char** argv) return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_rm, __cmd_rm, "Remove (unlink) the FILE(s)."); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_rm, __cmd_rm, Remove (unlink) the FILE(s).); #ifdef DFS_USING_WORKDIR int cmd_cd(int argc, char** argv) @@ -185,19 +186,14 @@ int cmd_ps(int argc, char** argv) list_thread(); return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_ps, "list threads in the system"); - -int cmd_i(int argc, char** argv) -{ - return cmd_ps(argc, argv); -} -FINSH_FUNCTION_EXPORT_ALIAS(cmd_i, __cmd_i, "list threads in the system"); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_ps, List threads in the system.); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_i, List threads in the system.); int cmd_time(int argc, char** argv) { return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_time, __cmd_time, "exec command with time"); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_time, __cmd_time, Execute command with time.); int cmd_free(int argc, char** argv) { @@ -206,6 +202,7 @@ int cmd_free(int argc, char** argv) list_mem(); return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_free, __cmd_free, "show the memory usage in the system"); +FINSH_FUNCTION_EXPORT_ALIAS(cmd_free, __cmd_free, Show the memory usage in the system.); #endif + diff --git a/components/finsh/shell.c b/components/finsh/shell.c index fcb34878aac6301ded33349e2624a920549d9835..b64370262037f673598b5d98e51f291fcaf60df0 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -181,7 +181,7 @@ rt_uint32_t finsh_get_echo() return shell->echo_mode; } -void finsh_auto_complete(char* prefix) +static void shell_auto_complete(char* prefix) { extern void list_prefix(char* prefix); @@ -244,7 +244,7 @@ void finsh_run_line(struct finsh_parser* parser, const char *line) } #ifdef FINSH_USING_HISTORY -rt_bool_t finsh_handle_history(struct finsh_shell* shell) +static rt_bool_t shell_handle_history(struct finsh_shell* shell) { #if defined(_WIN32) int i; @@ -261,7 +261,7 @@ rt_bool_t finsh_handle_history(struct finsh_shell* shell) return RT_FALSE; } -void finsh_push_history(struct finsh_shell* shell) +static void shell_push_history(struct finsh_shell* shell) { if (shell->line_position != 0) { @@ -370,7 +370,7 @@ void finsh_thread_entry(void* parameter) memcpy(shell->line, &shell->cmd_history[shell->current_history][0], FINSH_CMD_SIZE); shell->line_curpos = shell->line_position = strlen(shell->line); - finsh_handle_history(shell); + shell_handle_history(shell); #endif continue; } @@ -392,7 +392,7 @@ void finsh_thread_entry(void* parameter) memcpy(shell->line, &shell->cmd_history[shell->current_history][0], FINSH_CMD_SIZE); shell->line_curpos = shell->line_position = strlen(shell->line); - finsh_handle_history(shell); + shell_handle_history(shell); #endif continue; } @@ -437,7 +437,7 @@ void finsh_thread_entry(void* parameter) rt_kprintf("\b"); /* auto complete */ - finsh_auto_complete(&shell->line[0]); + shell_auto_complete(&shell->line[0]); /* re-calculate position */ shell->line_curpos = shell->line_position = strlen(shell->line); @@ -484,10 +484,10 @@ void finsh_thread_entry(void* parameter) if (msh_is_used() == RT_TRUE && shell->line_position != 0) { rt_kprintf("\n"); - msh_exec(shell->line, shell->line_position); #ifdef FINSH_USING_HISTORY - finsh_push_history(shell); + shell_push_history(shell); #endif + msh_exec(shell->line, shell->line_position); } else #endif @@ -496,7 +496,7 @@ void finsh_thread_entry(void* parameter) shell->line[shell->line_position] = ';'; #ifdef FINSH_USING_HISTORY - finsh_push_history(shell); + shell_push_history(shell); #endif if (shell->line_position != 0) finsh_run_line(&shell->parser, shell->line); diff --git a/include/rtdef.h b/include/rtdef.h index 0c522e8dce1f5d21ab90be8b4b59cfeb08413d19..7c13c43d844d926220648a1be303df18f3857391 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -117,25 +117,12 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #ifdef RT_USING_NEWLIB #include #else - #if __GNUC__ < 4 - typedef void *__sys_va_list; - typedef __sys_va_list va_list; - #define __va_rounded_size(type) \ - (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - #define va_start(ap, lastarg) \ - (ap = ((char *) &(lastarg) + __va_rounded_size(lastarg))) - #define va_end(ap) ((void)0) - /* little endian */ - #define va_arg(ap, type) \ - (ap = (__sys_va_list) ((char *)(ap) + __va_rounded_size(type)), \ - *((type *) (void *) ((char *)(ap) - __va_rounded_size(type)))) - #else - typedef __builtin_va_list __gnuc_va_list; - typedef __gnuc_va_list va_list; - #define va_start(v,l) __builtin_va_start(v,l) - #define va_end(v) __builtin_va_end(v) - #define va_arg(v,l) __builtin_va_arg(v,l) - #endif + /* the version of GNU GCC must be greater than 4.x */ + typedef __builtin_va_list __gnuc_va_list; + typedef __gnuc_va_list va_list; + #define va_start(v,l) __builtin_va_start(v,l) + #define va_end(v) __builtin_va_end(v) + #define va_arg(v,l) __builtin_va_arg(v,l) #endif #define SECTION(x) __attribute__((section(x))) @@ -168,6 +155,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define SECTION(x) #define UNUSED #define USED + #define PRAGMA(x) _Pragma(#x) #define ALIGN(n) #define rt_inline static inline #define RTT_API @@ -214,6 +202,12 @@ typedef int (*init_fn_t)(void); /* appliation initialization (rtgui application etc ...) */ #define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6") +#if !defined(RT_USING_FINSH) +/* define these to empty, even if not include finsh.h file */ +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) +#define FINSH_VAR_EXPORT(name, type, desc) +#endif + /* event length */ #define RT_EVENT_LENGTH 32