@@ -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 */
132133bool
133134iterate_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 */
168169bool
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 */
455456bool
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)
475488bool
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)
623627int
624628main (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