X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fimpl_var.h;h=762f421cde68d37f730a03216475a342cab81e23;hp=e35a8b71486861212a9beeb54cd10fb90ddf43a4;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=2f5af21b263403997e154658635d6b6e6eaab453 diff --git a/src/types/impl_var.h b/src/types/impl_var.h index e35a8b7..762f421 100644 --- a/src/types/impl_var.h +++ b/src/types/impl_var.h @@ -26,19 +26,48 @@ #ifndef PSI_TYPES_IMPL_VAR_H #define PSI_TYPES_IMPL_VAR_H -typedef struct impl_var { +struct psi_token; +struct psi_impl; +struct psi_impl_arg; +struct psi_validate_scope; + +struct psi_impl_var { struct psi_token *token; - char *name; - struct impl_arg *arg; + char *name, *fqn; + struct psi_impl_arg *arg; unsigned reference:1; -} impl_var; +}; + +struct psi_impl_var *psi_impl_var_init(const char *name, bool is_reference); +struct psi_impl_var *psi_impl_var_copy(struct psi_impl_var *var); +void psi_impl_var_free(struct psi_impl_var **var_ptr); +void psi_impl_var_dump(int fd, struct psi_impl_var *var, bool vararg); + +#include -impl_var *init_impl_var(const char *name, int is_reference); -impl_var *copy_impl_var(impl_var *var); -void free_impl_var(impl_var *var); +static inline char *psi_impl_var_name_prepend(char *current, const char *prepend) { + size_t c_len = strlen(current); + size_t p_len = strlen(prepend); -struct impl_args; + current = realloc(current, p_len + + c_len // includes '$' + + 1 // connecting dot + + 1 // terminating 0 + ); + if (current) { + if (c_len > 1) { + memmove(current + p_len + 1 + 1, current + 1, c_len - 1 + 1); + current[p_len + 1] = '.'; + } else { + /* just '$' */ + current[p_len + 1] = '\0'; + } + memcpy(current + 1, prepend, p_len); + } + return current; +} -struct impl_arg *locate_impl_var_arg(impl_var *var, struct impl_args *args); +bool psi_impl_var_validate(struct psi_data *data, struct psi_impl_var *ivar, + struct psi_validate_scope *scope); #endif