mirror of
https://github.com/RubyMetric/chsrc
synced 2025-08-14 00:20:47 +08:00
We should define aliases in target
This commit is contained in:
parent
5af9e5a2b1
commit
4da60f0c7d
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user