PSI_MACROS
+struct utsname *uname2() {
+ struct utsname *u = calloc(1, sizeof(*u));
+ uname(u);
+ return u;
+}
+
int psi_glob(const char *pattern, int flags,
int (*errfunc) (const char *epath, int eerrno),
glob_t *pglob) {
void (*func)(void);
} psi_func_redirs[] = {
{"glob", (void (*)(void)) psi_glob},
+ {"uname2", (void (*)(void)) uname2},
PSI_REDIRS
{0}
};
case PSI_T_ELLIPSIS:
if (set->outer.set && set->outer.set->func->type == PSI_T_TO_ARRAY) {
set->func->handler = psi_to_recursive;
+ set->inner = set->outer.set->inner;
+ set->count = set->outer.set->count;
break;
}
/* no break */
if (ref_type->type == PSI_T_STRUCT) {
/* to_array(struct, to_...) */
- for (i = 0; i < set->count; ++i) {
- decl_var *sub_var = set->inner[i]->vars->vars[0];
- decl_arg *sub_ref = locate_struct_member(ref_type->strct, sub_var);
-
- if (sub_ref) {
- if (!validate_set_value_ex(data, set->inner[i], sub_ref, ref_type->strct->args)) {
- return 0;
+ if (!set->outer.set || set->outer.set->inner != set->inner) {
+ for (i = 0; i < set->count; ++i) {
+ decl_var *sub_var = set->inner[i]->vars->vars[0];
+ decl_arg *sub_ref = locate_struct_member(ref_type->strct, sub_var);
+
+ if (sub_ref) {
+ if (!validate_set_value_ex(data, set->inner[i], sub_ref, ref_type->strct->args)) {
+ return 0;
+ }
}
}
}
free_call->func, impl->func->name);
return 0;
}
- if (!impl->decl->args) {
- data->error(free_call->token, PSI_WARNING,
- "Declaration '%s' of implementation '%s'"
- " does not have any arguments to free",
- impl->decl->func->var->name, impl->func->name);
- }
+
+
/* now check for known vars */
for (l = 0; l < free_call->vars->count; ++l) {
int check = 0;
decl_var *free_var = free_call->vars->vars[l];
- for (k = 0; k < impl->decl->args->count; ++k) {
- decl_arg *free_arg = impl->decl->args->args[k];
+ if (!strcmp(free_var->name, impl->decl->func->var->name)) {
+ check = 1;
+ free_var->arg = impl->decl->func;
+ } else if (impl->decl->args) {
+ for (k = 0; k < impl->decl->args->count; ++k) {
+ decl_arg *free_arg = impl->decl->args->args[k];
- if (!strcmp(free_var->name, free_arg->var->name)) {
- check = 1;
- free_var->arg = free_arg;
- break;
+ if (!strcmp(free_var->name, free_arg->var->name)) {
+ check = 1;
+ free_var->arg = free_arg;
+ break;
+ }
}
}
}
static inline void dump_impl_set_value(int fd, set_value *set, unsigned level) {
- size_t i, j;
+ size_t i;
if (level > 1) {
/* only if not directly after `set ...` */