Iterate registry to find target

This commit is contained in:
Aoran Zeng 2025-08-09 15:58:44 +08:00
parent a417afa4b5
commit 8b60633230
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98

View File

@ -380,56 +380,63 @@ cli_print_issues ()
/** /**
* targets列表`input`target匹 * @param:input @param:registry target
* *
* @param[out] target_info targets列表中最后的target_info信息 * @param[in] registry registry
* @param[in] size registry
* @param[in] input
* @param[out] target Target_t
* *
* @return truefalse * @return truefalse
*/ */
#define iterate_registry(ary, input, target) iterate_registry_(ary, xy_arylen(ary), input, target)
bool bool
iterate_targets_ (const char ***array, size_t size, const char *input, const char ***target_info) iterate_registry_ (TargetRegisterInfo_t registry[], size_t size, const char *input, Target_t **target)
{ {
int matched = 0; for (int i = 0; i < size; i++)
const char **target = NULL;
int k = 0;
const char *alias = NULL;
for (int i=0; i<size; i++)
{ {
target = array[i]; TargetRegisterInfo_t *entry = &registry[i];
alias = target[k];
while (NULL!=alias) char *aliases = entry->aliases;
char *aliases_copy = xy_strdup (aliases);
char *tok_start = aliases_copy;
char *cursor;
while (*tok_start != '\0')
{ {
if (xy_streql_ic (input, alias)) cursor = tok_start;
while (*cursor != ' ' && *cursor != '\0') cursor++;
// 结束当前token
char space_or_eos = *cursor;
*cursor = '\0';
if (xy_streql_ic (input, tok_start))
{ {
matched = 1; break; if (entry->prelude)
{
chsrc_log ("该target已定义 prelude()");
entry->prelude();
}
else
{
chsrc_warn ("该target未定义 prelude()");
}
*target = entry->target;
return true;
} }
k++;
alias = target[k]; *cursor = space_or_eos;
if (space_or_eos == '\0') { break; }
tok_start = cursor+1;
} }
if (!matched) k = 0;
if (matched) break;
} }
if (!matched) *target = NULL;
{ return false;
*target_info = NULL;
return false;
}
do
{
k++;
alias = target[k];
}
while (NULL!=alias);
*target_info = target + k + 1;
return true;
} }
#define iterate_targets(ary, input, target) iterate_targets_(ary, xy_arylen(ary), input, target)
/** /**
@ -464,16 +471,14 @@ typedef enum {
bool bool
get_target (const char *input, TargetOp code, char *option) get_target (const char *input, TargetOp code, char *option)
{ {
const char **target_tmp = NULL; Target_t *target = NULL;
bool matched = iterate_targets(pl_packagers, input, &target_tmp); bool matched = iterate_registry (chsrc_programming_languages_registry, input, &target);
if (!matched) matched = iterate_targets(os_systems, input, &target_tmp); if (!matched) matched = iterate_registry (chsrc_operating_systems_registry, input, &target);
if (!matched) matched = iterate_targets(wr_softwares, input, &target_tmp); if (!matched) matched = iterate_registry (chsrc_softwares_registry, input, &target);
if (!matched) return false; if (!matched) return false;
Target_t *target = (Target_t*) *target_tmp;
if (TargetOp_Set_Source==code) if (TargetOp_Set_Source==code)
{ {
if (target->setfn) target->setfn(option); if (target->setfn) target->setfn(option);