9 PSI_Validator
*PSI_ValidatorInit(PSI_Validator
*V
, PSI_Parser
*P
)
12 V
= malloc(sizeof(*V
));
14 memset(V
, 0, sizeof(*V
));
16 PSI_DataExchange((PSI_Data
*) V
, (PSI_Data
*) P
);
21 void PSI_ValidatorDtor(PSI_Validator
*V
)
23 PSI_DataDtor((PSI_Data
*) V
);
24 memset(V
, 0, sizeof(*V
));
27 void PSI_ValidatorFree(PSI_Validator
**V
)
30 PSI_ValidatorDtor(*V
);
36 static inline int validate_lib(PSI_Validator
*V
) {
38 const char *ptr
= V
->lib
;
42 /* FIXME: assume stdlib */
44 fprintf(stderr
, "No import library defined;"
45 " use 'lib \"<libname>\";' statement.\n");
46 } else if (!strchr(ptr
, '/')) {
48 len
= snprintf(lib
, MAXPATHLEN
, "lib%s.dylib", ptr
);
50 len
= snprintf(lib
, MAXPATHLEN
, "lib%s.so", ptr
);
52 if (MAXPATHLEN
== len
) {
53 fprintf(stderr
, "Library name too long: '%s'\n", ptr
);
58 if (!(V
->dlopened
= dlopen(ptr
, RTLD_LAZY
|RTLD_LOCAL
))) {
64 static inline int locate_decl_type_alias(decl_typedefs
*defs
, decl_type
*type
) {
70 for (i
= 0; i
< defs
->count
; ++i
) {
71 if (!strcmp(defs
->list
[i
]->alias
, type
->name
)) {
72 type
->real
= defs
->list
[i
]->type
;
78 static inline int validate_decl_type(PSI_Validator
*V
, decl_arg
*arg
, decl_type
*type
) {
79 if (type
->type
== PSI_T_NAME
) {
82 if (!V
->defs
|| !locate_decl_type_alias(V
->defs
, type
)) {
83 fprintf(stderr
, "Cannot use '%s' as type for '%s';"
84 " Use 'typedef <type> <basic_type>;' statement.\n",
85 type
->name
, arg
->var
->name
);
90 static inline int validate_typedef(PSI_Validator
*V
, decl_typedef
*def
) {
91 /* FIXME: check def->alias */
92 if (def
->type
->type
== PSI_T_NAME
) {
93 fprintf(stderr
, "Type '%s' cannot be aliased to '%s'\n",
94 def
->type
->name
, def
->alias
);
99 static inline int validate_typedefs(PSI_Validator
*V
) {
102 for (i
= 0; i
< V
->defs
->count
; ++i
) {
103 if (!validate_typedef(V
, V
->defs
->list
[i
])) {
110 static inline int validate_decl_func(PSI_Validator
*V
, decl
*decl
, decl_arg
*func
)
114 if (!strcmp(func
->var
->name
, "dlsym")) {
115 fprintf(stderr
, "Cannot dlsym dlsym (sic!)\n");
119 if (!validate_decl_type(V
, func
, func
->type
)) {
123 decl
->dlptr
= dlsym(V
->dlopened
?: RTLD_DEFAULT
, func
->var
->name
);
125 fprintf(stderr
, "Failed to located symbol '%s': %s\n",
126 func
->var
->name
, dlerror());
130 static inline int validate_decl_abi(PSI_Validator
*V
, decl_abi
*abi
) {
131 if (strcasecmp(abi
->convention
, "default")) {
132 fprintf(stderr
, "Invalid calling convention: '%s'\n", abi
->convention
);
138 static inline int validate_decl_arg(PSI_Validator
*V
, decl
*decl
, decl_arg
*arg
) {
139 if (!validate_decl_type(V
, arg
, arg
->type
)) {
144 static inline int validate_decl_args(PSI_Validator
*V
, decl
*decl
, decl_args
*args
) {
147 for (i
= 0; i
< args
->count
; ++i
) {
148 if (!validate_decl_arg(V
, decl
, args
->args
[i
])) {
154 static inline int validate_decl(PSI_Validator
*V
, decl
*decl
) {
155 if (!validate_decl_abi(V
, decl
->abi
)) {
158 if (!validate_decl_func(V
, decl
, decl
->func
)) {
161 if (decl
->args
&& !validate_decl_args(V
, decl
, decl
->args
)) {
166 static inline int validate_decls(PSI_Validator
*V
) {
169 for (i
= 0; i
< V
->decls
->count
; ++i
) {
170 if (!validate_decl(V
, V
->decls
->list
[i
])) {
177 static inline int validate_impl_type(PSI_Validator
*V
, impl
*impl
, impl_type
*type
) {
181 static inline int validate_impl_arg(PSI_Validator
*V
, impl
*impl
, impl_arg
*arg
) {
184 static inline int validate_impl_args(PSI_Validator
*V
, impl
*impl
, impl_args
*args
) {
187 for (i
= 0; i
< args
->count
; ++i
) {
188 if (!validate_impl_arg(V
, impl
, args
->args
[i
])) {
194 static inline int validate_impl_func(PSI_Validator
*V
, impl
*impl
, impl_func
*func
) {
195 /* FIXME: does name need any validation? */
196 if (!validate_impl_type(V
, impl
, func
->return_type
)) {
199 if (func
->args
&& !validate_impl_args(V
, impl
, func
->args
)) {
204 static inline int validate_impl_stmts(PSI_Validator
*V
, impl
*impl
, impl_stmts
*stmts
) {
207 static inline int validate_impl(PSI_Validator
*V
, impl
*impl
) {
208 if (!validate_impl_func(V
, impl
, impl
->func
)) {
211 if (!validate_impl_stmts(V
, impl
, impl
->stmts
)) {
216 static inline int validate_impls(PSI_Validator
*V
) {
219 for (i
= 0; i
< V
->impls
->count
; ++i
) {
220 if (!validate_impl(V
, V
->impls
->list
[i
])) {
227 int PSI_ValidatorValidate(PSI_Validator
*V
)
229 if (V
->defs
&& !validate_typedefs(V
)) {
232 if (V
->decls
&& !validate_decls(V
)) {
235 if (V
->impls
&& !validate_impls(V
)) {