OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
-#include "php_psi_stdinc.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# include "php_config.h"
+#endif
#include "token.h"
#include "data.h"
#define PSI_STD_TYPES
-#include "php_psi_posix.h"
+#include "php_psi_predef.h"
-struct psi_decl_type *psi_decl_type_init(token_t type, const char *name)
+struct psi_decl_type *psi_decl_type_init(token_t type, zend_string *name)
{
- struct psi_decl_type *t = calloc(1, sizeof(*t));
+ struct psi_decl_type *t = pecalloc(1, sizeof(*t), 1);
t->type = type;
- t->name = strdup(name);
+ t->name = zend_string_copy(name);
return t;
}
struct psi_decl_type *type = *type_ptr;
*type_ptr = NULL;
- if (type->token) {
- free(type->token);
- }
+ psi_token_free(&type->token);
if (type->type == PSI_T_FUNCTION) {
psi_decl_free(&type->real.func);
}
- free(type->name);
+ zend_string_release(type->name);
free(type);
}
}
struct psi_decl_type *psi_decl_type_copy(struct psi_decl_type *src)
{
- struct psi_decl_type *dst = calloc(1, sizeof(*dst));
+ struct psi_decl_type *dst = pecalloc(1, sizeof(*dst), 1);
dst->type = src->type;
if (src->name) {
- dst->name = strdup(src->name);
+ dst->name = zend_string_copy(src->name);
}
if (src->token) {
dst->token = psi_token_copy(src->token);
}
if (defs) {
while (psi_plist_get(defs, i++, &def)) {
- if (!strcmp(def->var->name, type->name)) {
+ if (zend_string_equals(def->var->name, type->name)) {
type->real.def = def;
return true;
}
}
}
for (stdtyp = &psi_std_types[0]; stdtyp->type_tag; ++stdtyp) {
- if (!strcmp(type->name, stdtyp->alias ?: stdtyp->type_name)) {
+ if (!strcmp(type->name->val, stdtyp->alias ?: stdtyp->type_name)) {
type->type = stdtyp->type_tag;
return true;
}
}
if (structs) {
while (psi_plist_get(structs, i++, &s)) {
- if (!strcmp(s->name, type->name)) {
+ if (zend_string_equals(s->name, type->name)) {
type->real.strct = s;
return true;
}
}
if (unions) {
while (psi_plist_get(unions, i++, &u)) {
- if (!strcmp(u->name, type->name)) {
+ if (zend_string_equals(u->name, type->name)) {
type->real.unn = u;
return true;
}
}
if (enums) {
while (psi_plist_get(enums, i++, &e)) {
- if (!strcmp(e->name, type->name)) {
+ if (zend_string_equals(e->name, type->name)) {
type->real.enm = e;
return true;
}
}
if (decls) {
while (psi_plist_get(decls, i++, &decl)) {
- if (!strcmp(decl->func->var->name, type->name)) {
+ if (zend_string_equals(decl->func->var->name, type->name)) {
type->real.func = decl;
return true;
}
return true;
} else {
data->error(data, type->token, PSI_WARNING,
- "Unknown struct '%s'", type->name);
+ "Unknown struct '%s'", type->name->val);
return false;
}
}
return true;
} else {
data->error(data, type->token, PSI_WARNING,
- "Unknown union '%s'", type->name);
+ "Unknown union '%s'", type->name->val);
return false;
}
}
case PSI_T_ENUM:
if (!psi_decl_type_get_enum(type, data->enums)) {
data->error(data, type->token, PSI_WARNING,
- "Unknown enum '%s'", type->name);
+ "Unknown enum '%s'", type->name->val);
return false;
}
break;
case PSI_T_FUNCTION:
if (!psi_decl_type_get_decl(type, data->decls)) {
data->error(data, type->token, PSI_WARNING,
- "Unknown decl '%s'", type->name);
+ "Unknown decl '%s'", type->name->val);
return false;
}
if (!psi_decl_validate_nodl(data, type->real.func, scope)) {
return true;
}
-void psi_decl_type_dump_args_with_layout(int fd, struct psi_plist *args,
+void psi_decl_type_dump_args_with_layout(struct psi_dump *dump, struct psi_plist *args,
unsigned level)
{
size_t i = 0;
- dprintf(fd, " {\n");
+ PSI_DUMP(dump, " {\n");
if (args) {
struct psi_decl_arg *sarg;
++level;
while (psi_plist_get(args, i++, &sarg)) {
- dprintf(fd, "%s", psi_t_indent(level));
- psi_decl_arg_dump(fd, sarg, level);
+ PSI_DUMP(dump, "%s", psi_t_indent(level));
+ psi_decl_arg_dump(dump, sarg, level);
if (sarg->layout) {
if (sarg->layout->bfw) {
- dprintf(fd, ":%zu", sarg->layout->bfw->len);
+ PSI_DUMP(dump, ":%zu", sarg->layout->bfw->len);
}
- dprintf(fd, "::(%zu, %zu);\n", sarg->layout->pos,
+ PSI_DUMP(dump, "::(%zu, %zu);\n", sarg->layout->pos,
sarg->layout->len);
} else {
- dprintf(fd, ";\n");
+ PSI_DUMP(dump, ";\n");
}
}
--level;
}
- dprintf(fd, "%s", psi_t_indent(level));
- dprintf(fd, "}");
+ PSI_DUMP(dump, "%s", psi_t_indent(level));
+ PSI_DUMP(dump, "}");
}
-void psi_decl_type_dump(int fd, struct psi_decl_type *t, unsigned level)
+void psi_decl_type_dump(struct psi_dump *dump, struct psi_decl_type *t, unsigned level)
{
switch (t->type) {
case PSI_T_POINTER:
- dprintf(fd, "%s *", t->name);
+ PSI_DUMP(dump, "%s *", t->name->val);
return;
case PSI_T_ENUM:
- dprintf(fd, "enum ");
if (psi_decl_type_is_anon(t->name, "enum")) {
- size_t i = 0, c = psi_plist_count(t->real.enm->items);
- struct psi_decl_enum_item *item;
-
- dprintf(fd, "{\n");
- ++level;
- while (psi_plist_get(t->real.enm->items, i++, &item)) {
- dprintf(fd, "%s", psi_t_indent(level));
- psi_decl_enum_item_dump(fd, item);
- if (i < c) {
- dprintf(fd, "%s\n", i < c ? "," : "");
- }
- }
- --level;
- dprintf(fd, "%s\n} ", psi_t_indent(level));
+ psi_decl_enum_dump(dump, t->real.enm, level);
return;
}
+ PSI_DUMP(dump, "enum ");
break;
case PSI_T_STRUCT:
- dprintf(fd, "struct ");
+ PSI_DUMP(dump, "struct ");
if (psi_decl_type_is_anon(t->name, "struct")) {
- psi_decl_type_dump_args_with_layout(fd, t->real.strct->args, level);
+ PSI_DUMP(dump, "/*::(%zu, %zu)*/", t->real.strct->align, t->real.strct->size);
+ psi_decl_type_dump_args_with_layout(dump, t->real.strct->args, level);
return;
}
break;
case PSI_T_UNION:
- dprintf(fd, "union ");
+ PSI_DUMP(dump, "union ");
if (psi_decl_type_is_anon(t->name, "union")) {
- psi_decl_type_dump_args_with_layout(fd, t->real.unn->args, level);
+ PSI_DUMP(dump, "/*::(%zu, %zu)*/", t->real.unn->align, t->real.unn->size);
+ psi_decl_type_dump_args_with_layout(dump, t->real.unn->args, level);
return;
}
break;
+ case PSI_T_FUNCTION:
+ psi_decl_type_dump(dump, t->real.func->func->type, level);
+ return;
+
default:
break;
}
- dprintf(fd, "%s", t->name);
+ PSI_DUMP(dump, "%s", t->name->val);
}
int psi_decl_type_is_weak(struct psi_decl_type *type)