X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=idl%2Fvalidator.c;fp=idl%2Fvalidator.c;h=0000000000000000000000000000000000000000;hp=87951ebb32e0c44de4e81aa4da073daaf9940a1a;hb=f1a387482a9270a34ae684109ad8be7c104148d6;hpb=e87ed355e2944460141e24bf24c2e5b9afe0c1f7 diff --git a/idl/validator.c b/idl/validator.c deleted file mode 100644 index 87951eb..0000000 --- a/idl/validator.c +++ /dev/null @@ -1,239 +0,0 @@ -#include -#include -#include -#include -#include - -#include "validator.h" - -PSI_Validator *PSI_ValidatorInit(PSI_Validator *V, PSI_Parser *P) -{ - if (!V) { - V = malloc(sizeof(*V)); - } - memset(V, 0, sizeof(*V)); - - PSI_DataExchange((PSI_Data *) V, (PSI_Data *) P); - - return V; -} - -void PSI_ValidatorDtor(PSI_Validator *V) -{ - PSI_DataDtor((PSI_Data *) V); - memset(V, 0, sizeof(*V)); -} - -void PSI_ValidatorFree(PSI_Validator **V) -{ - if (*V) { - PSI_ValidatorDtor(*V); - free(*V); - *V = NULL; - } -} - -static inline int validate_lib(PSI_Validator *V) { - char lib[MAXPATHLEN]; - const char *ptr = V->lib; - size_t len; - - if (!ptr) { - /* FIXME: assume stdlib */ - return 1; - fprintf(stderr, "No import library defined;" - " use 'lib \"\";' statement.\n"); - } else if (!strchr(ptr, '/')) { -#ifdef DARWIN - len = snprintf(lib, MAXPATHLEN, "lib%s.dylib", ptr); -#else - len = snprintf(lib, MAXPATHLEN, "lib%s.so", ptr); -#endif - if (MAXPATHLEN == len) { - fprintf(stderr, "Library name too long: '%s'\n", ptr); - } - lib[len] = 0; - ptr = lib; - } - if (!(V->dlopened = dlopen(ptr, RTLD_LAZY|RTLD_LOCAL))) { - perror(ptr); - return 0; - } - return 1; -} -static inline int locate_decl_type_alias(decl_typedefs *defs, decl_type *type) { - size_t i; - - if (type->real) { - return 1; - } - for (i = 0; i < defs->count; ++i) { - if (!strcmp(defs->list[i]->alias, type->name)) { - type->real = defs->list[i]->type; - return 1; - } - } - return 0; -} -static inline int validate_decl_type(PSI_Validator *V, decl_arg *arg, decl_type *type) { - if (type->type == PSI_T_NAME) { - size_t i; - - if (!V->defs || !locate_decl_type_alias(V->defs, type)) { - fprintf(stderr, "Cannot use '%s' as type for '%s';" - " Use 'typedef ;' statement.\n", - type->name, arg->var->name); - } - } - return 1; -} -static inline int validate_typedef(PSI_Validator *V, decl_typedef *def) { - /* FIXME: check def->alias */ - if (def->type->type == PSI_T_NAME) { - fprintf(stderr, "Type '%s' cannot be aliased to '%s'\n", - def->type->name, def->alias); - return 0; - } - return 1; -} -static inline int validate_typedefs(PSI_Validator *V) { - size_t i; - - for (i = 0; i < V->defs->count; ++i) { - if (!validate_typedef(V, V->defs->list[i])) { - return 0; - } - } - - return 1; -} -static inline int validate_decl_func(PSI_Validator *V, decl *decl, decl_arg *func) -{ - void *dlptr; - - if (!strcmp(func->var->name, "dlsym")) { - fprintf(stderr, "Cannot dlsym dlsym (sic!)\n"); - return 0; - } - - if (!validate_decl_type(V, func, func->type)) { - return 0; - } - - decl->dlptr = dlsym(V->dlopened ?: RTLD_DEFAULT, func->var->name); - if (!decl->dlptr) { - fprintf(stderr, "Failed to located symbol '%s': %s\n", - func->var->name, dlerror()); - } - return 1; -} -static inline int validate_decl_abi(PSI_Validator *V, decl_abi *abi) { - if (strcasecmp(abi->convention, "default")) { - fprintf(stderr, "Invalid calling convention: '%s'\n", abi->convention); - return 0; - } - /* FIXME */ - return 1; -} -static inline int validate_decl_arg(PSI_Validator *V, decl *decl, decl_arg *arg) { - if (!validate_decl_type(V, arg, arg->type)) { - return 0; - } - return 1; -} -static inline int validate_decl_args(PSI_Validator *V, decl *decl, decl_args *args) { - size_t i; - - for (i = 0; i < args->count; ++i) { - if (!validate_decl_arg(V, decl, args->args[i])) { - return 0; - } - } - return 1; -} -static inline int validate_decl(PSI_Validator *V, decl *decl) { - if (!validate_decl_abi(V, decl->abi)) { - return 0; - } - if (!validate_decl_func(V, decl, decl->func)) { - return 0; - } - if (decl->args && !validate_decl_args(V, decl, decl->args)) { - return 0; - } - return 1; -} -static inline int validate_decls(PSI_Validator *V) { - size_t i; - - for (i = 0; i < V->decls->count; ++i) { - if (!validate_decl(V, V->decls->list[i])) { - return 0; - } - } - return 1; -} - -static inline int validate_impl_type(PSI_Validator *V, impl *impl, impl_type *type) { - /* FIXME */ - return 1; -} -static inline int validate_impl_arg(PSI_Validator *V, impl *impl, impl_arg *arg) { - return 1; -} -static inline int validate_impl_args(PSI_Validator *V, impl *impl, impl_args *args) { - size_t i; - - for (i = 0; i < args->count; ++i) { - if (!validate_impl_arg(V, impl, args->args[i])) { - return 0; - } - } - return 1; -} -static inline int validate_impl_func(PSI_Validator *V, impl *impl, impl_func *func) { - /* FIXME: does name need any validation? */ - if (!validate_impl_type(V, impl, func->return_type)) { - return 0; - } - if (func->args && !validate_impl_args(V, impl, func->args)) { - return 0; - } - return 1; -} -static inline int validate_impl_stmts(PSI_Validator *V, impl *impl, impl_stmts *stmts) { - return 1; -} -static inline int validate_impl(PSI_Validator *V, impl *impl) { - if (!validate_impl_func(V, impl, impl->func)) { - return 0; - } - if (!validate_impl_stmts(V, impl, impl->stmts)) { - return 0; - } - return 1; -} -static inline int validate_impls(PSI_Validator *V) { - size_t i; - - for (i = 0; i < V->impls->count; ++i) { - if (!validate_impl(V, V->impls->list[i])) { - return 0; - } - } - return 1; -} - -int PSI_ValidatorValidate(PSI_Validator *V) -{ - if (V->defs && !validate_typedefs(V)) { - return 0; - } - if (V->decls && !validate_decls(V)) { - return 0; - } - if (V->impls && !validate_impls(V)) { - return 0; - } - return 1; -}