diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index c55406f845..8f63228016 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -3561,115 +3561,31 @@ QList CutterCore::getAllVTables() } QList CutterCore::getAllTypes() -{ - QList types; - - types.append(getAllPrimitiveTypes()); - types.append(getAllUnions()); - types.append(getAllStructs()); - types.append(getAllEnums()); - types.append(getAllTypedefs()); - - return types; -} - -QList CutterCore::getAllPrimitiveTypes() -{ - CORE_LOCK(); - QList primitiveTypes; - - QJsonArray typesArray = cmdj("tj").array(); - for (const QJsonValue &value : typesArray) { - QJsonObject typeObject = value.toObject(); - - TypeDescription exp; - - exp.type = typeObject[RJsonKey::type].toString(); - exp.size = (int)typeObject[RJsonKey::size].toVariant().toULongLong(); - exp.category = tr("Primitive"); - primitiveTypes << exp; - } - - return primitiveTypes; -} - -QList CutterCore::getAllUnions() { CORE_LOCK(); - QList unions; - - QJsonArray typesArray = cmdj("tuj").array(); - for (const QJsonValue value : typesArray) { - QJsonObject typeObject = value.toObject(); - - TypeDescription exp; - - exp.type = typeObject[RJsonKey::name].toString(); - exp.category = "Union"; - unions << exp; - } - - return unions; -} - -QList CutterCore::getAllStructs() -{ - CORE_LOCK(); - QList structs; - - QJsonArray typesArray = cmdj("tsj").array(); - for (const QJsonValue value : typesArray) { - QJsonObject typeObject = value.toObject(); - - TypeDescription exp; - - exp.type = typeObject[RJsonKey::name].toString(); - exp.size = 0; - exp.category = "Struct"; - structs << exp; - } - - return structs; -} - -QList CutterCore::getAllEnums() -{ - CORE_LOCK(); - QList enums; - - QJsonObject typesObject = cmdj("tej").object(); - for (const QJsonValue value : typesObject.keys()) { - QJsonObject typeObject = value.toObject(); - - TypeDescription exp; - - exp.type = typeObject[RJsonKey::name].toString(); - exp.size = 0; - exp.category = "Enum"; - enums << exp; - } - - return enums; -} - -QList CutterCore::getAllTypedefs() -{ - CORE_LOCK(); - QList typeDefs; - - QJsonObject typesObject = cmdj("ttj").object(); - for (const QJsonValue value : typesObject.keys()) { - QJsonObject typeObject = value.toObject(); - - TypeDescription exp; + QList types_desc; + RzList *types = rz_type_db_get_base_types(core->analysis->typedb); + RzListIter *it; + RzBaseType *btype; - exp.type = typeObject[RJsonKey::name].toString(); - exp.size = 0; - exp.category = "Typedef"; - typeDefs << exp; + CutterRListForeach(types, it, RzBaseType, btype) + { + TypeDescription typeDescription; + typeDescription.type = btype->name; + if (btype->kind == RZ_BASE_TYPE_KIND_STRUCT) { + typeDescription.category = "Struct"; + } else if (btype->kind == RZ_BASE_TYPE_KIND_ENUM) { + typeDescription.category = "Enum"; + } else if (btype->kind == RZ_BASE_TYPE_KIND_ATOMIC) { + typeDescription.category = "Primitive"; + } else if (btype->kind == RZ_BASE_TYPE_KIND_TYPEDEF) { + typeDescription.category = "Typedef"; + } + typeDescription.size = btype->size; + types_desc << typeDescription; } - return typeDefs; + return types_desc; } QString CutterCore::addTypes(const char *str) @@ -3677,7 +3593,7 @@ QString CutterCore::addTypes(const char *str) CORE_LOCK(); char *error_msg = nullptr; int result = rz_type_parse_string(core->analysis->typedb, str, &error_msg); - // TODO fix adding and parsing types + QString error; if (result && error_msg) { @@ -3695,16 +3611,23 @@ QString CutterCore::getTypeAsC(QString name, QString category) if (name.isEmpty() || category.isEmpty()) { return output; } - QString typeName = sanitizeStringForCommand(name); + + const char *name_char = name.toStdString().c_str(); + RzBaseType *rzBaseType; + if (category == "Struct") { - output = cmdRaw(QString("tsc %1").arg(typeName)); + rzBaseType = rz_type_db_get_struct(core->analysis->typedb, name_char); } else if (category == "Union") { - output = cmdRaw(QString("tuc %1").arg(typeName)); + rzBaseType = rz_type_db_get_union(core->analysis->typedb, name_char); } else if (category == "Enum") { - output = cmdRaw(QString("tec %1").arg(typeName)); + rzBaseType = rz_type_db_get_enum(core->analysis->typedb, name_char); } else if (category == "Typedef") { - output = cmdRaw(QString("ttc %1").arg(typeName)); + rzBaseType = rz_type_db_get_typedef(core->analysis->typedb, name_char); } + + char *output_char = rz_type_db_base_type_as_string(core->analysis->typedb, rzBaseType); + + output = QString(output_char); return output; }