CTL_CH 转换为控制字符
1 |
- 控制字符通常用于表示特定的控制操作,例如回车、换行、退格等。在 ASCII 码表中,控制字符的值通常在 1 到 31 之间。
cli.c
cli_init
- u_boot_hush_start();
1 | int u_boot_hush_start(void) |
cli_process_fdt 从FDT中获取命令行参数
- 获取
bootcmd
和bootsecure
参数 - configs/stm32h750-art-pi_defconfig
1
CONFIG_BOOTCOMMAND="bootm 90080000"
- include/env_default.h
1
2
3
"bootcmd=" CONFIG_BOOTCOMMAND "\0" - cli_process_fdt
1
2
3
4
5
6
7
8
9
10
11
12
13bool cli_process_fdt(const char **cmdp)
{
/* Allow the fdt to override the boot command */
const char *env = ofnode_conf_read_str("bootcmd");
if (env)
*cmdp = env;
/*
* If the bootsecure option was chosen, use secure_boot_cmd().
* Always use 'env' in this case, since bootsecure requres that the
* bootcmd was specified in the FDT too.
*/
return ofnode_conf_read_int("bootsecure", 0);
}
run_command_list
- 以cli_simple_run_command_list进行分析
cli_loop 命令行循环
- 选择使用的命令行解释器
- GD_FLG_HUSH_MODERN_PARSER: 选择使用 Hush 解释器
- GD_FLG_HUSH_OLD_PARSER: 选择使用 Hush 解释器(旧版本)
- CONFIG_CMDLINE: 选择使用 U-Boot 命令行解释器
- cli_simple_loop
run_command_repeatable 执行命令并返回是否可重复执行
- 选择使用的命令行解释器
cli_simple.c
cli_simple_loop
1 | void cli_simple_loop(void) |
cli_simple_run_command_list
- include/env_default.h
1
2
"bootcmd=" CONFIG_BOOTCOMMAND "\0" - cli_simple_run_command_list
1 | int cli_simple_run_command_list(char *cmd, int flag) |
cli_simple_run_command
1 | int cli_simple_run_command(const char *cmd, int flag) |
cli_simple_process_macros
- 函数初始化了一些变量,包括当前字符 c、前一个字符 prev、变量名的起始位置 varname_start、输入字符串的长度 inputcnt 和输出缓冲区的剩余大小 outputcnt。state 变量用于跟踪当前的解析状态,初始值为 0,表示等待 $ 符号。
- 函数通过一个 while 循环遍历输入字符串中的每个字符。在循环中,根据当前的 state 值执行不同的操作:
- state 为 0 时,函数等待未转义的 $ 符号。如果遇到单引号 ‘,则进入状态 3,表示在单引号内。如果遇到 $ 符号,则进入状态 1,表示等待
(
或{
符号。否则,将当前字符复制到输出缓冲区。 - state 为 1 时,函数等待
(
或{
符号。如果遇到这些符号,则进入状态 2,并记录变量名的起始位置。如果未遇到这些符号,则恢复到状态 0,并将$
符号和当前字符复制到输出缓冲区。 - state 为 2 时,函数等待
)
或}
符号。如果遇到这些符号,函数将处理变量名并进行替换。
例如:
- 示例 1: 简单变量替换
- 输入字符串为 “Hello $USER!”, 并且环境变量 USER 的值为 “world”, 则输出字符串为 “Hello world!”
- 带有转义字符
- 输入字符串为 “Price is $100”, 输出字符串为 “Price is $100”
- 嵌套变量替换
- 输入字符串为 “Path: $HOME/$USER/bin”,并且环境变量 HOME 的值为 “/home/user”,USER 的值为 “john”
- 输出”Path: /home/user/john/bin”
- 单引号内的变量不替换
- 输入字符串为 “This is ‘$USER’”,并且环境变量 USER 的值为 “john”
- 输出字符串为 “This is ‘$USER’”
- 环境变量值的查找
- 通过 env_get() 函数获取环境变量的值。如果找到了环境变量,则将其值复制到输出缓冲区,并更新输出缓冲区的剩余大小 outputcnt。
- 如果未找到环境变量,则将变量名复制到输出缓冲区,并更新输出缓冲区的剩余大小 outputcnt。
cli_simple_parse_line
- 定义了一个名为 cli_simple_parse_line 的函数,用于解析命令行输入字符串,并将其分割成独立的参数。函数接收两个参数:line 是输入字符串,argv 是一个字符指针数组,用于存储解析后的参数。
1 | int cli_simple_parse_line(char *line, char *argv[]) |
cli_readline.c
cli_readline
cli_readline_into_buffer 命令行读取
- 根据配置选择是否具有历史记录功能
1 | // prompt: 提示符,输出显示到终端;例如"U-Boot>" |
cread_line_simple 简单的命令行读取,没有历史记录功能
cread_line 命令行读取
- 带有历史记录功能
- 命令行补全
- 具备编辑功能
1 | static int cread_line(const char *const prompt, char *buf, unsigned int *len, |
cli_cread_init 初始化命令行
1 | void cli_cread_init(struct cli_line_state *cls, char *buf, uint buf_size) |
cread_line_process_ch 控制字符处理
1 | int cread_line_process_ch(struct cli_line_state *cls, char ichar) |
cread_add_str
cread_add_char 添加字符
- 可以是插入模式,也可以是追加模式
1 | //num:当前光标位置,eol_num:缓冲区中的字符数 |
历史记录功能
hist_init
- hist_list:历史记录列表 保存命令数组的地址
cread_add_to_hist
- 将命令添加到历史记录中
- 将当前添加索引加1,如果索引大于最大索引,则将索引置为0;覆盖掉最旧的命令
1 | static void cread_add_to_hist(char *line) |
hist_next hist_prev
- 通过hist_cur索引hist_list中的命令
cread_print_hist_list
- 打印历史记录列表,使用
history
命令
cmd/history.c
- 调用
cread_print_hist_list
打印历史记录
cli_getch.c
cli_ch_process 转义处理程序
1 | int cli_ch_process(struct cli_ch_state *cch, int ichar) |
cli_ch_esc 处理转义字符
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
评论