From 4da60f0c7db2edde045ddb37e3979ca12791545d Mon Sep 17 00:00:00 2001 From: Aoran Zeng Date: Sun, 10 Aug 2025 22:39:05 +0800 Subject: [PATCH] We should define aliases in target --- src/chsrc-main.c | 14 +++++++------- src/framework/core.c | 12 ++++++++++-- src/framework/struct.h | 6 ++++-- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/chsrc-main.c b/src/chsrc-main.c index 8236387..15cd8c3 100644 --- a/src/chsrc-main.c +++ b/src/chsrc-main.c @@ -538,11 +538,11 @@ match_alias_callback (const char *alias, void *user_data) /** - * 查询用户输入 @param:input 是否与该 @param:registry 中的某个 target 匹配 + * 查询用户输入 @param:input 是否与该 @param:menu 中的某个 target 匹配 * 若匹配将直接调用 prelude * - * @param[in] registry registry - * @param[in] size registry 大小 + * @param[in] menu menu + * @param[in] size menu 大小 * @param[in] input 用户输入的目标名 * @param[out] target 返回匹配到的 Target_t 指针 * @@ -550,13 +550,13 @@ match_alias_callback (const char *alias, void *user_data) */ #define iterate_menu(ary, input, target) iterate_menu_(ary, xy_arylen(ary), input, target) bool -iterate_menu_ (TargetRegisterInfo_t registry[], size_t size, const char *input, Target_t **target) +iterate_menu_ (TargetRegisterInfo_t menu[], size_t size, const char *input, Target_t **target) { for (int i = 0; i < size; i++) { - TargetRegisterInfo_t *entry = ®istry[i]; + TargetRegisterInfo_t *entry = &menu[i]; - if (iterate_aliases (entry->aliases, match_alias_callback, (void *)input)) + if (iterate_aliases (entry->target->aliases, match_alias_callback, (void *)input)) { if (entry->prelude) { @@ -564,7 +564,7 @@ iterate_menu_ (TargetRegisterInfo_t registry[], size_t size, const char *input, } else { - chsrc_warn ("该target未定义 prelude()"); + chsrc_error ("该target未定义 prelude()"); } *target = entry->target; diff --git a/src/framework/core.c b/src/framework/core.c index bf49253..f5fb266 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -935,17 +935,25 @@ auto_select_mirror (Source_t *sources, size_t size, const char *target_name) } +/** + * 从 menu 中反向找到该 target 的 alias + */ +char *get_first_alias_of_target (Target_t *t) +{ + +} + int use_specific_mirror_or_auto_select (char *input, Target_t *t) { if (input) { - return query_mirror_exist (t->sources, t->sources_n, t->name, input); + return query_mirror_exist (t->sources, t->sources_n, t->aliases, input); } else { - return auto_select_mirror (t->sources, t->sources_n, t->name); + return auto_select_mirror (t->sources, t->sources_n, t->aliases); } } diff --git a/src/framework/struct.h b/src/framework/struct.h index 3b83741..519818b 100644 --- a/src/framework/struct.h +++ b/src/framework/struct.h @@ -117,6 +117,9 @@ Contributor_t; typedef struct Target_t { + /* 以 / 为分隔符的多个目标别名 */ + char *aliases; + void (*getfn) (char *option); void (*setfn) (char *option); void (*resetfn) (char *option); @@ -159,12 +162,11 @@ typedef struct TargetRegisterInfo_t { Target_t *target; /* target 本身 */ void (*prelude) (void); /* 填充 target 信息等预置操作 */ - char *aliases; /* 以空格分隔的 alias 字符串 */ } TargetRegisterInfo_t; -#define def_target(t) void t##_getsrc(char *option);void t##_setsrc(char *option);void t##_resetsrc(char *option); Target_t t##_target={name}; +#define def_target(t, aliases) void t##_getsrc(char *option);void t##_setsrc(char *option);void t##_resetsrc(char *option); Target_t t##_target={aliases}; /* 以下宏仅能放在 prelude() 中使用 */ #define use_this(t) Target_t *this = &t##_target;