OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
-#include "php_psi_stdinc.h"
-#include "php_psi.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# include "php_config.h"
+#endif
-#include <dlfcn.h>
#include <fnmatch.h>
-
#include <Zend/zend_smart_str.h>
+#include "php_psi.h"
#include "data.h"
+#include "dl.h"
#define PSI_FUNC_REDIRS
-#include "php_psi_posix.h"
+#include "php_psi_predef.h"
struct psi_decl *psi_decl_init(struct psi_decl_arg *func, struct psi_plist *args)
{
- struct psi_decl *d = calloc(1, sizeof(*d));
+ struct psi_decl *d = pecalloc(1, sizeof(*d), 1);
d->func = func;
d->args = args;
if (d->redir) {
zend_string_release(d->redir);
}
- free(d);
+ pefree(d, 1);
}
}
-void psi_decl_dump(int fd, struct psi_decl *decl)
+void psi_decl_dump(struct psi_dump *dump, struct psi_decl *decl)
{
if (decl->abi) {
- psi_decl_abi_dump(fd, decl->abi);
+ psi_decl_abi_dump(dump, decl->abi);
}
- dprintf(fd, " ");
- /* FIXME: functions returning arrays */
- psi_decl_arg_dump(fd, decl->func, 0);
- dprintf(fd, "(");
+ PSI_DUMP(dump, " ");
+
+ psi_decl_type_dump(dump, decl->func->type, 0);
+ PSI_DUMP(dump, " ");
+ PSI_DUMP(dump, "%s%s",
+ psi_t_indirection(decl->func->var->pointer_level - !!decl->func->var->array_size),
+ decl->func->var->name->val);
+
+ PSI_DUMP(dump, "(");
if (decl->args) {
size_t i;
struct psi_decl_arg *arg;
for (i = 0; psi_plist_get(decl->args, i, &arg); ++i) {
if (i) {
- dprintf(fd, ", ");
+ PSI_DUMP(dump, ", ");
}
- psi_decl_arg_dump(fd, arg, 0);
+ psi_decl_arg_dump(dump, arg, 0);
}
if (decl->varargs) {
- dprintf(fd, ", ...");
+ PSI_DUMP(dump, ", ...");
}
}
if (decl->func->var->array_size) {
- dprintf(fd, ")[%u]", decl->func->var->array_size);
+ PSI_DUMP(dump, ")[%u]", decl->func->var->array_size);
+ } else {
+ PSI_DUMP(dump, ")");
}
if (decl->redir) {
- dprintf(fd, ") __asm__ (\"%s\");", decl->redir->val);
+ PSI_DUMP(dump, " __asm__ (\"%s\");", decl->redir->val);
} else {
- dprintf(fd, ");");
+ PSI_DUMP(dump, ";");
}
}
for (redir = &psi_func_redirs[0]; redir->name; ++redir) {
if (!strcmp(func->var->name->val, redir->name)) {
decl->sym = redir->func;
+ break;
}
}
if (!decl->sym) {
- size_t i = 0;
- void *dl;
-
- while (!decl->sym && psi_plist_get(data->file.dlopened, i++, &dl)) {
- decl->sym = dlsym(dl, decl->redir ? decl->redir->val : func->var->name->val);
- }
+ decl->sym = psi_dlsym(data->file.dlopened, func->var->name->val,
+ decl->redir ? decl->redir->val : NULL);
}
if (!decl->sym) {
-#ifndef RTLD_NEXT
-# define RTLD_NEXT ((void *) -1l)
-#endif
-#ifndef RTLD_DEFAULT
-# define RTLD_DEFAULT ((void *) 0)
-#endif
- decl->sym = dlsym(RTLD_DEFAULT, decl->redir ? decl->redir->val : func->var->name->val);
- if (!decl->sym) {
- data->error(data, func->token, PSI_WARNING,
- "Failed to locate symbol '%s(%s)': %s",
- func->var->name->val,
- decl->redir ? decl->redir->val : "",
- dlerror() ?: "not found");
- return false;
- }
+ data->error(data, func->token, PSI_WARNING,
+ "Failed to locate symbol '%s(%s)': %s",
+ func->var->name->val,
+ decl->redir ? decl->redir->val : "",
+ psi_dlerror() ?: "not found");
+ return false;
}
return true;
}
return psi_decl_arg_get_by_var(var, decl->args, decl->func);
}
-