Skip to content

Commit 5375a9d

Browse files
committed
重写 iterate_menu()
1 parent 1f81fa4 commit 5375a9d

File tree

1 file changed

+44
-39
lines changed

1 file changed

+44
-39
lines changed

src/chsrc-main.c

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,13 @@ cli_print_available_mirrors ()
122122

123123

124124
/**
125-
* 遍历以 / 为分隔符的别名字符串,对每个别名调用回调函数
125+
* @brief 遍历以 / 为分隔符的别名字符串,对每个别名调用回调函数
126126
*
127-
* @param aliases 空格分隔的 alias 字符串
128-
* @param callback 对每个 alias 调用的回调函数
129-
* @param user_data 传递给回调函数的用户数据
130-
* @return 如果回调函数返回true则停止遍历并返回true,否则返回false
127+
* @param aliases 空格分隔的 alias 字符串
128+
* @param callback 对每个 alias 调用的回调函数
129+
* @param user_data 传递给回调函数的用户数据
130+
*
131+
* @return 如果回调函数返回true则停止遍历并返回true,否则返回false
131132
*/
132133
bool
133134
iterate_aliases (const char *aliases, bool (*callback)(const char *alias, void *user_data), void *user_data)
@@ -166,7 +167,7 @@ iterate_aliases (const char *aliases, bool (*callback)(const char *alias, void *
166167
* 用于 cli_print_supported_targets_ 的回调函数,打印每个别名
167168
*/
168169
bool
169-
print_alias_callback (const char *alias, void *user_data)
170+
callback_print_alias (const char *alias, void *user_data)
170171
{
171172
printf ("%s ", alias);
172173
return false; // 继续遍历,不停止
@@ -180,7 +181,7 @@ cli_print_supported_targets_ (TargetRegisterInfo_t menu[], size_t size)
180181
TargetRegisterInfo_t *entry = &menu[i];
181182

182183
// 使用通用的别名遍历函数打印所有别名
183-
iterate_aliases (entry->target->aliases, print_alias_callback, NULL);
184+
iterate_aliases (entry->target->aliases, callback_print_alias, NULL);
184185

185186
br(); // 每个target换行
186187
}
@@ -450,53 +451,56 @@ cli_print_issues ()
450451

451452

452453
/**
453-
* 用于 iterate_menu_ 的回调函数,检查别名是否匹配用户输入
454+
* @brief 用于 callback_find_target() 的回调函数,检查别名是否匹配用户输入
454455
*/
455456
bool
456-
match_alias_callback (const char *alias, void *user_data)
457+
callback_match_alias (const char *alias, void *user_data)
457458
{
458459
const char *input = (const char *)user_data;
459460
return xy_streql_ic (input, alias);
460461
}
461462

463+
/**
464+
* @brief 用于 iterate_menu() 的回调函数
465+
*/
466+
bool
467+
callback_find_target (void *data)
468+
{
469+
target = (Target_t *) data;
470+
if (iterate_aliases (target->aliases, callback_match_alias, (void *)input))
471+
{
472+
target->prelude();
473+
474+
return true;
475+
}
476+
}
462477

463478
/**
464479
* 查询用户输入 `input` 是否与该 `menu` 中的某个 target 匹配
465480
* 若匹配将直接调用 prelude
466481
*
467-
* @param[in] menu menu
468-
* @param[in] size menu 大小
469-
* @param[in] input 用户输入的目标名
470-
* @param[out] target 返回匹配到的 Target_t 指针
482+
* @param[in] menu menu
483+
* @param[in] input 用户输入的目标名
484+
* @param[out] target 返回匹配到的 Target_t 指针
471485
*
472486
* @return 匹配到则返回true,未匹配到则返回false
473487
*/
474-
#define iterate_menu(ary, input, target) iterate_menu_(ary, xy_arylen(ary), input, target)
475488
bool
476-
iterate_menu_ (TargetRegisterInfo_t menu[], size_t size, const char *input, Target_t **target)
489+
iterate_menu (XySeq_t *menu, const char *input, Target_t **target)
477490
{
478-
for (int i = 0; i < size; i++)
479-
{
480-
TargetRegisterInfo_t *entry = &menu[i];
491+
Target_t *t = xy_seq_find (menu, callback_find_target);
481492

482-
if (iterate_aliases (entry->target->aliases, match_alias_callback, (void *)input))
483-
{
484-
if (entry->prelude)
485-
{
486-
entry->prelude();
487-
}
488-
else
489-
{
490-
chsrc_error ("该target未定义 prelude()");
491-
}
492-
493-
*target = entry->target;
494-
return true;
495-
}
493+
if (t)
494+
{
495+
*target = t;
496+
t->preludefn();
497+
return true;
498+
}
499+
else
500+
{
501+
*target = NULL;
502+
return false;
496503
}
497-
498-
*target = NULL;
499-
return false;
500504
}
501505

502506

@@ -536,9 +540,9 @@ get_target (const char *input, TargetOp code, char *option)
536540

537541
Target_t *target = NULL;
538542

539-
bool matched = iterate_menu (chsrc_pl_menu, input, &target);
540-
if (!matched) matched = iterate_menu (chsrc_os_menu, input, &target);
541-
if (!matched) matched = iterate_menu (chsrc_wr_menu, input, &target);
543+
bool matched = iterate_menu (ProgStore.pl, input, &target);
544+
if (!matched) matched = iterate_menu (ProgStore.os, input, &target);
545+
if (!matched) matched = iterate_menu (ProgStore.wr, input, &target);
542546

543547
if (!matched) return false;
544548

@@ -623,7 +627,8 @@ get_target (const char *input, TargetOp code, char *option)
623627
int
624628
main (int argc, char const *argv[])
625629
{
626-
chsrc_framework_init ();
630+
chsrc_init_framework ();
631+
chsrc_init_menu ();
627632

628633
argc -= 1;
629634

0 commit comments

Comments
 (0)