@@ -566,6 +566,35 @@ void WingCStruct::onRegisterScriptObj(WingHex::IWingAngel *o) {
566566 &WingCStruct::getParsedWarns),
567567 this , std::placeholders::_1),
568568 QStringLiteral (" getParsedWarns" ));
569+
570+ o->registerGlobalFunction (
571+ WingHex::Meta_String | WingHex::Meta_Array,
572+ std::bind (QOverload<const QVariantList &>::of (
573+ &WingCStruct::structOrUnionMemberNames),
574+ this , std::placeholders::_1),
575+ QStringLiteral (" structOrUnionMemberNames" ),
576+ {qMakePair (WingHex::Meta_String, QStringLiteral (" type" ))});
577+ o->registerGlobalFunction (
578+ WingHex::Meta_String | WingHex::Meta_Array,
579+ std::bind (QOverload<const QVariantList &>::of (
580+ &WingCStruct::structOrUnionMemberDataTypes),
581+ this , std::placeholders::_1),
582+ QStringLiteral (" structOrUnionMemberDataTypes" ),
583+ {qMakePair (WingHex::Meta_String, QStringLiteral (" type" ))});
584+ o->registerGlobalFunction (
585+ WingHex::Meta_String | WingHex::Meta_Array,
586+ std::bind (QOverload<const QVariantList &>::of (
587+ &WingCStruct::structOrUnionMemberDecls),
588+ this , std::placeholders::_1),
589+ QStringLiteral (" structOrUnionMemberDecls" ),
590+ {qMakePair (WingHex::Meta_String, QStringLiteral (" type" ))});
591+ o->registerGlobalFunction (
592+ WingHex::Meta_String | WingHex::Meta_Array,
593+ std::bind (QOverload<const QVariantList &>::of (
594+ &WingCStruct::structOrUnionMemberDeclWithoutNames),
595+ this , std::placeholders::_1),
596+ QStringLiteral (" structOrUnionMemberDeclWithoutNames" ),
597+ {qMakePair (WingHex::Meta_String, QStringLiteral (" type" ))});
569598}
570599
571600bool WingCStruct::parseFromSource (const QString &header) {
@@ -793,6 +822,126 @@ QStringList WingCStruct::getParsedErrors() const { return _errors; }
793822
794823QStringList WingCStruct::getParsedWarns () const { return _warns; }
795824
825+ QStringList WingCStruct::structOrUnionMemberNames (const QString &type) const {
826+ QStringList buffer;
827+ auto t = _parser->resolveTypeName (type);
828+ if (_parser->containsStruct (t)) {
829+ auto r = _parser->structMembers (t);
830+ for (auto &m : r) {
831+ buffer.append (m.var_name );
832+ }
833+ } else if (_parser->containsUnion (t)) {
834+ auto r = _parser->unionMembers (t);
835+ for (auto &m : r) {
836+ buffer.append (m.var_name );
837+ }
838+ }
839+
840+ return buffer;
841+ }
842+
843+ QStringList
844+ WingCStruct::structOrUnionMemberDataTypes (const QString &type) const {
845+ QStringList buffer;
846+ auto t = _parser->resolveTypeName (type);
847+ if (_parser->containsStruct (t)) {
848+ auto r = _parser->structMembers (t);
849+ for (auto &m : r) {
850+ buffer.append (m.data_type );
851+ }
852+ } else if (_parser->containsUnion (t)) {
853+ auto r = _parser->unionMembers (t);
854+ for (auto &m : r) {
855+ buffer.append (m.data_type );
856+ }
857+ }
858+ return buffer;
859+ }
860+
861+ QStringList WingCStruct::structOrUnionMemberDecls (const QString &type) const {
862+ QStringList buffer;
863+ static QString padding (4 , ' ' );
864+ auto t = _parser->resolveTypeName (type);
865+
866+ auto op = [](const VariableDeclaration &m) -> QString {
867+ QString buffer;
868+ QTextStream output (&buffer);
869+ output << m.data_type ;
870+
871+ if (m.is_pointer )
872+ output << QStringLiteral (" * " );
873+
874+ output << padding;
875+ if (m.var_name .isEmpty ()) {
876+ output << ' ?' ;
877+ } else {
878+ output << m.var_name ;
879+ }
880+
881+ for (auto &dim : m.array_dims ) {
882+ output << ' [' << dim << ' ]' ;
883+ }
884+
885+ if (m.bit_size ) {
886+ output << QStringLiteral (" : " ) << m.bit_size ;
887+ }
888+ return buffer;
889+ };
890+
891+ if (_parser->containsStruct (t)) {
892+ auto r = _parser->structMembers (t);
893+ for (auto &m : r) {
894+ buffer.append (op (m));
895+ }
896+ } else if (_parser->containsUnion (t)) {
897+ auto r = _parser->unionMembers (t);
898+ for (auto &m : r) {
899+ buffer.append (op (m));
900+ }
901+ }
902+ return buffer;
903+ }
904+
905+ QStringList
906+ WingCStruct::structOrUnionMemberDeclWithoutNames (const QString &type) const {
907+ QStringList buffer;
908+ static QString padding (4 , ' ' );
909+ auto t = _parser->resolveTypeName (type);
910+
911+ auto op = [](const VariableDeclaration &m) -> QString {
912+ QString buffer;
913+ QTextStream output (&buffer);
914+ output << m.data_type ;
915+
916+ if (m.is_pointer )
917+ output << QStringLiteral (" * " );
918+
919+ output << padding;
920+
921+ for (auto &dim : m.array_dims ) {
922+ output << ' [' << dim << ' ]' ;
923+ }
924+
925+ if (m.bit_size ) {
926+ output << QStringLiteral (" : " ) << m.bit_size ;
927+ }
928+ return buffer;
929+ };
930+
931+ if (_parser->containsStruct (t)) {
932+ auto r = _parser->structMembers (t);
933+ for (auto &m : r) {
934+ buffer.append (op (m));
935+ }
936+ } else if (_parser->containsUnion (t)) {
937+ auto r = _parser->unionMembers (t);
938+ for (auto &m : r) {
939+ buffer.append (op (m));
940+ }
941+ }
942+ return buffer;
943+ }
944+
796945bool WingCStruct::parseFromSource (const WingHex::SenderInfo &sender,
797946 const QString &header) {
798947 Q_UNUSED (sender);
@@ -1006,6 +1155,33 @@ QStringList WingCStruct::getParsedWarns(const WingHex::SenderInfo &sender) {
10061155 return getParsedWarns ();
10071156}
10081157
1158+ QStringList
1159+ WingCStruct::structOrUnionMemberNames (const WingHex::SenderInfo &sender,
1160+ const QString &type) {
1161+ Q_UNUSED (sender);
1162+ return structOrUnionMemberNames (type);
1163+ }
1164+
1165+ QStringList
1166+ WingCStruct::structOrUnionMemberDataTypes (const WingHex::SenderInfo &sender,
1167+ const QString &type) {
1168+ Q_UNUSED (sender);
1169+ return structOrUnionMemberDataTypes (type);
1170+ }
1171+
1172+ QStringList
1173+ WingCStruct::structOrUnionMemberDecls (const WingHex::SenderInfo &sender,
1174+ const QString &type) {
1175+ Q_UNUSED (sender);
1176+ return structOrUnionMemberDecls (type);
1177+ }
1178+
1179+ QStringList WingCStruct::structOrUnionMemberDeclWithoutNames (
1180+ const WingHex::SenderInfo &sender, const QString &type) {
1181+ Q_UNUSED (sender);
1182+ return structOrUnionMemberDeclWithoutNames (type);
1183+ }
1184+
10091185QString WingCStruct::getqsizeTypeAsString () const {
10101186 return sizeof (qsizetype) == sizeof (quint64) ? QStringLiteral (" int64" )
10111187 : QStringLiteral (" int32" );
@@ -1947,6 +2123,55 @@ QVariant WingCStruct::getParsedWarns(const QVariantList ¶ms) {
19472123 return getParsedWarns ();
19482124}
19492125
2126+ QVariant WingCStruct::structOrUnionMemberNames (const QVariantList ¶ms) {
2127+ if (params.size () != 1 ) {
2128+ return getScriptCallError (-1 , tr (" InvalidParamsCount" ));
2129+ }
2130+ auto type_v = params.at (0 );
2131+ if (!type_v.canConvert <QString>()) {
2132+ return getScriptCallError (-2 , tr (" InvalidParam" ));
2133+ }
2134+ auto type = type_v.toString ();
2135+ return structOrUnionMemberNames (type);
2136+ }
2137+
2138+ QVariant WingCStruct::structOrUnionMemberDataTypes (const QVariantList ¶ms) {
2139+ if (params.size () != 1 ) {
2140+ return getScriptCallError (-1 , tr (" InvalidParamsCount" ));
2141+ }
2142+ auto type_v = params.at (0 );
2143+ if (!type_v.canConvert <QString>()) {
2144+ return getScriptCallError (-2 , tr (" InvalidParam" ));
2145+ }
2146+ auto type = type_v.toString ();
2147+ return structOrUnionMemberDataTypes (type);
2148+ }
2149+
2150+ QVariant WingCStruct::structOrUnionMemberDecls (const QVariantList ¶ms) {
2151+ if (params.size () != 1 ) {
2152+ return getScriptCallError (-1 , tr (" InvalidParamsCount" ));
2153+ }
2154+ auto type_v = params.at (0 );
2155+ if (!type_v.canConvert <QString>()) {
2156+ return getScriptCallError (-2 , tr (" InvalidParam" ));
2157+ }
2158+ auto type = type_v.toString ();
2159+ return structOrUnionMemberDecls (type);
2160+ }
2161+
2162+ QVariant
2163+ WingCStruct::structOrUnionMemberDeclWithoutNames (const QVariantList ¶ms) {
2164+ if (params.size () != 1 ) {
2165+ return getScriptCallError (-1 , tr (" InvalidParamsCount" ));
2166+ }
2167+ auto type_v = params.at (0 );
2168+ if (!type_v.canConvert <QString>()) {
2169+ return getScriptCallError (-2 , tr (" InvalidParam" ));
2170+ }
2171+ auto type = type_v.toString ();
2172+ return structOrUnionMemberDeclWithoutNames (type);
2173+ }
2174+
19502175bool WingCStruct::isLittleEndian () const { return m_islittle; }
19512176
19522177void WingCStruct::setIsLittleEndian (bool newIslittle) {
0 commit comments