New iterations

This commit is contained in:
Aoran Zeng 2025-08-09 16:41:52 +08:00
parent d3f6e16bc3
commit 777f9175e4
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98

View File

@ -172,29 +172,78 @@ cli_print_available_mirrors ()
say ("--------- -------------- ------------------------------------- ---------------------"); say ("--------- -------------- ------------------------------------- ---------------------");
} }
for (int i = 0; i < xy_arylen (available_mirrors); i++) for (int i = 0; i < xy_arylen (chsrc_available_mirrors); i++)
{ {
MirrorSite_t *mir = available_mirrors[i]; MirrorSite_t *mir = chsrc_available_mirrors[i];
printf ("%-14s%-18s%-41s ", mir->code, mir->abbr, mir->site); say (mir->name); printf ("%-14s%-18s%-41s ", mir->code, mir->abbr, mir->site); say (mir->name);
} }
} }
void /**
cli_print_supported_targets_ (const char ***array, size_t size) *
*
* @param aliases alias
* @param callback alias
* @param user_data
* @return true则停止遍历并返回truefalse
*/
bool
iterate_aliases (const char *aliases, bool (*callback)(const char *alias, void *user_data), void *user_data)
{ {
for (int i=0; i<size; i++) char *aliases_copy = xy_strdup (aliases);
char *tok_start = aliases_copy;
char *cursor;
bool result = false;
while (*tok_start != '\0')
{ {
const char **target = array[i]; cursor = tok_start;
const char *alias = target[0]; while (*cursor != ' ' && *cursor != '\0') cursor++;
for (int k=1; alias!=NULL; k++)
// 结束当前token
char space_or_eos = *cursor;
*cursor = '\0';
// 调用回调函数
if (callback(tok_start, user_data))
{ {
printf ("%s\t", alias); result = true;
alias = target[k]; break;
} }
br();
*cursor = space_or_eos;
if (space_or_eos == '\0') { break; }
tok_start = cursor+1;
} }
br();
return result;
}
/**
* cli_print_supported_targets_
*/
bool
print_alias_callback (const char *alias, void *user_data)
{
printf ("%s ", alias);
return false; // 继续遍历,不停止
}
void
cli_print_supported_targets_ (TargetRegisterInfo_t registry[], size_t size)
{
for (int i = 0; i < size; i++)
{
TargetRegisterInfo_t *entry = &registry[i];
// 使用通用的别名遍历函数打印所有别名
iterate_aliases (entry->aliases, print_alias_callback, NULL);
br(); // 每个target换行
}
br(); // 最后额外换行
} }
void void
@ -210,21 +259,21 @@ cli_print_supported_targets ()
char *msg = ENGLISH ? "Programming Languages" : "编程语言"; char *msg = ENGLISH ? "Programming Languages" : "编程语言";
say (bdgreen(msg)); say (bdgreen(msg));
say ("-------------------------"); say ("-------------------------");
cli_print_supported_targets_ (pl_packagers, xy_arylen(pl_packagers)); cli_print_supported_targets_ (chsrc_pl_menu, xy_arylen(chsrc_pl_menu));
} }
{ {
char *msg = ENGLISH ? "Operating Systems" : "操作系统"; char *msg = ENGLISH ? "Operating Systems" : "操作系统";
say (bdgreen(msg)); say (bdgreen(msg));
say ("-------------------------"); say ("-------------------------");
cli_print_supported_targets_ (os_systems, xy_arylen(os_systems)); cli_print_supported_targets_ (chsrc_os_menu, xy_arylen(chsrc_os_menu));
} }
{ {
char *msg = ENGLISH ? "Softwares" : "软件"; char *msg = ENGLISH ? "Softwares" : "软件";
say (bdgreen(msg)); say (bdgreen(msg));
say ("-------------------------"); say ("-------------------------");
cli_print_supported_targets_ (wr_softwares, xy_arylen(wr_softwares)); cli_print_supported_targets_ (chsrc_wr_menu, xy_arylen(chsrc_wr_menu));
} }
} }
@ -235,7 +284,7 @@ cli_print_supported_pl ()
: "支持对以下编程语言生态换源 (同一行表示这几个目标兼容)\n"; : "支持对以下编程语言生态换源 (同一行表示这几个目标兼容)\n";
say (bdgreen(msg)); say (bdgreen(msg));
cli_print_supported_targets_ (pl_packagers, xy_arylen(pl_packagers)); cli_print_supported_targets_ (chsrc_pl_menu, xy_arylen(chsrc_pl_menu));
} }
void void
@ -244,7 +293,7 @@ cli_print_supported_os ()
char *msg = ENGLISH ? "Support following Operating Systems (same line indicates these targets are compatible)\n" char *msg = ENGLISH ? "Support following Operating Systems (same line indicates these targets are compatible)\n"
: "支持对以下操作系统换源 (同一行表示这几个目标兼容)\n"; : "支持对以下操作系统换源 (同一行表示这几个目标兼容)\n";
say (bdgreen(msg)); say (bdgreen(msg));
cli_print_supported_targets_ (os_systems, xy_arylen(os_systems)); cli_print_supported_targets_ (chsrc_os_menu, xy_arylen(chsrc_os_menu));
} }
void void
@ -253,7 +302,7 @@ cli_print_supported_wr ()
char *msg = ENGLISH ? "Support following Softwares (same line indicates these targets are compatible)\n" char *msg = ENGLISH ? "Support following Softwares (same line indicates these targets are compatible)\n"
: "支持对以下软件换源 (同一行表示这几个目标兼容)\n"; : "支持对以下软件换源 (同一行表示这几个目标兼容)\n";
say (bdgreen(msg)); say (bdgreen(msg));
cli_print_supported_targets_ (wr_softwares, xy_arylen(wr_softwares)); cli_print_supported_targets_ (chsrc_wr_menu, xy_arylen(chsrc_wr_menu));
} }
@ -389,29 +438,25 @@ cli_print_issues ()
* *
* @return truefalse * @return truefalse
*/ */
#define iterate_registry(ary, input, target) iterate_registry_(ary, xy_arylen(ary), input, target) /**
* iterate_menu_
*/
bool bool
iterate_registry_ (TargetRegisterInfo_t registry[], size_t size, const char *input, Target_t **target) match_alias_callback (const char *alias, void *user_data)
{
const char *input = (const char *)user_data;
return xy_streql_ic (input, alias);
}
#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)
{ {
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
TargetRegisterInfo_t *entry = &registry[i]; TargetRegisterInfo_t *entry = &registry[i];
char *aliases = entry->aliases; if (iterate_aliases (entry->aliases, match_alias_callback, (void *)input))
char *aliases_copy = xy_strdup (aliases);
char *tok_start = aliases_copy;
char *cursor;
while (*tok_start != '\0')
{
cursor = tok_start;
while (*cursor != ' ' && *cursor != '\0') cursor++;
// 结束当前token
char space_or_eos = *cursor;
*cursor = '\0';
if (xy_streql_ic (input, tok_start))
{ {
if (entry->prelude) if (entry->prelude)
{ {
@ -426,11 +471,6 @@ iterate_registry_ (TargetRegisterInfo_t registry[], size_t size, const char *inp
*target = entry->target; *target = entry->target;
return true; return true;
} }
*cursor = space_or_eos;
if (space_or_eos == '\0') { break; }
tok_start = cursor+1;
}
} }
*target = NULL; *target = NULL;
@ -473,9 +513,9 @@ get_target (const char *input, TargetOp code, char *option)
{ {
Target_t *target = NULL; Target_t *target = NULL;
bool matched = iterate_registry (chsrc_programming_languages_registry, input, &target); bool matched = iterate_menu (chsrc_pl_menu, input, &target);
if (!matched) matched = iterate_registry (chsrc_operating_systems_registry, input, &target); if (!matched) matched = iterate_menu (chsrc_os_menu, input, &target);
if (!matched) matched = iterate_registry (chsrc_softwares_registry, input, &target); if (!matched) matched = iterate_menu (chsrc_wr_menu, input, &target);
if (!matched) return false; if (!matched) return false;