重写 iterate_menu()

This commit is contained in:
Aoran Zeng 2025-08-22 11:24:26 +08:00
parent 1f81fa4efc
commit 5375a9da19
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98

View File

@ -122,11 +122,12 @@ cli_print_available_mirrors ()
/** /**
* / * @brief /
* *
* @param aliases alias * @param aliases alias
* @param callback alias * @param callback alias
* @param user_data * @param user_data
*
* @return true则停止遍历并返回truefalse * @return true则停止遍历并返回truefalse
*/ */
bool bool
@ -166,7 +167,7 @@ iterate_aliases (const char *aliases, bool (*callback)(const char *alias, void *
* cli_print_supported_targets_ * cli_print_supported_targets_
*/ */
bool bool
print_alias_callback (const char *alias, void *user_data) callback_print_alias (const char *alias, void *user_data)
{ {
printf ("%s ", alias); printf ("%s ", alias);
return false; // 继续遍历,不停止 return false; // 继续遍历,不停止
@ -180,7 +181,7 @@ cli_print_supported_targets_ (TargetRegisterInfo_t menu[], size_t size)
TargetRegisterInfo_t *entry = &menu[i]; TargetRegisterInfo_t *entry = &menu[i];
// 使用通用的别名遍历函数打印所有别名 // 使用通用的别名遍历函数打印所有别名
iterate_aliases (entry->target->aliases, print_alias_callback, NULL); iterate_aliases (entry->target->aliases, callback_print_alias, NULL);
br(); // 每个target换行 br(); // 每个target换行
} }
@ -450,54 +451,57 @@ cli_print_issues ()
/** /**
* iterate_menu_ * @brief callback_find_target()
*/ */
bool bool
match_alias_callback (const char *alias, void *user_data) callback_match_alias (const char *alias, void *user_data)
{ {
const char *input = (const char *)user_data; const char *input = (const char *)user_data;
return xy_streql_ic (input, alias); return xy_streql_ic (input, alias);
} }
/**
* @brief iterate_menu()
*/
bool
callback_find_target (void *data)
{
target = (Target_t *) data;
if (iterate_aliases (target->aliases, callback_match_alias, (void *)input))
{
target->prelude();
return true;
}
}
/** /**
* `input` `menu` target * `input` `menu` target
* prelude * prelude
* *
* @param[in] menu menu * @param[in] menu menu
* @param[in] size menu
* @param[in] input * @param[in] input
* @param[out] target Target_t * @param[out] target Target_t
* *
* @return truefalse * @return truefalse
*/ */
#define iterate_menu(ary, input, target) iterate_menu_(ary, xy_arylen(ary), input, target)
bool bool
iterate_menu_ (TargetRegisterInfo_t menu[], size_t size, const char *input, Target_t **target) iterate_menu (XySeq_t *menu, const char *input, Target_t **target)
{ {
for (int i = 0; i < size; i++) Target_t *t = xy_seq_find (menu, callback_find_target);
{
TargetRegisterInfo_t *entry = &menu[i];
if (iterate_aliases (entry->target->aliases, match_alias_callback, (void *)input)) if (t)
{ {
if (entry->prelude) *target = t;
{ t->preludefn();
entry->prelude(); return true;
} }
else else
{ {
chsrc_error ("该target未定义 prelude()");
}
*target = entry->target;
return true;
}
}
*target = NULL; *target = NULL;
return false; return false;
} }
}
/** /**
@ -536,9 +540,9 @@ get_target (const char *input, TargetOp code, char *option)
Target_t *target = NULL; Target_t *target = NULL;
bool matched = iterate_menu (chsrc_pl_menu, input, &target); bool matched = iterate_menu (ProgStore.pl, input, &target);
if (!matched) matched = iterate_menu (chsrc_os_menu, input, &target); if (!matched) matched = iterate_menu (ProgStore.os, input, &target);
if (!matched) matched = iterate_menu (chsrc_wr_menu, input, &target); if (!matched) matched = iterate_menu (ProgStore.wr, input, &target);
if (!matched) return false; if (!matched) return false;
@ -623,7 +627,8 @@ get_target (const char *input, TargetOp code, char *option)
int int
main (int argc, char const *argv[]) main (int argc, char const *argv[])
{ {
chsrc_framework_init (); chsrc_init_framework ();
chsrc_init_menu ();
argc -= 1; argc -= 1;