Coder Social home page Coder Social logo

fuzziqersoftware / resource_dasm Goto Github PK

View Code? Open in Web Editor NEW
92.0 11.0 10.0 2.41 MB

Classic Mac OS resource fork and application disassembler, with reverse-engineering tools for specific applications

License: MIT License

C++ 99.80% CMake 0.20%
classic-mac-os disassembler hypercard resource-fork reverse-engineering soundmusicsys sprites

resource_dasm's People

Contributors

fuzziqersoftware avatar kristine1975 avatar ownezx avatar sembiance avatar syto203 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

resource_dasm's Issues

Suggestion: Conditional compilation for some features

My July 2022 build of resource_dasm was 13 MB, and the one I did just now is 12.5 MB (Intel)

I thought maybe separating the disassembly stuff would make the build smaller, but it didn't seem to help?

It's a low priority issue. But I plan to bundle resource_dasm, picttoppm, and a 3rd program I am developing (a converter) which will convert 90's (Al Staffieri) GameMaker games to a new modern runtime (a 4th program that's long been written). All the program sizes add up I guess, and my first computer was an LC II with 4 MB of RAM and an 80 MB hard drive and I never quite shed that mentality ;)

I remember ~2 years ago hacking a build of resource_dasm that was much smaller after cutting out everything except for the PICT and 'snd ' converters.

I could probably take a stab at it, basically would just be a bunch of #ifdef statements?

compile errors with g++ 13.2.1 20230826

Running g++ 13.2.1 20230826 and cmake 3.27.4 and the latest resource_dasm 2023-08-31 and phosg 2023-09-21 I get this error:

[20/100] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -O2 -MD -MT CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -MF CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o.d -o CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc
FAILED: CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o 
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -O2 -MD -MT CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -MF CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o.d -o CMakeFiles/resource_file.dir/src/ExecutableFormats/PEFile.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc: In member function ‘void PEFile::parse(const void*, size_t)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc:195:17: error: possibly dangling reference to a temporary [-Werror=dangling-reference]
  195 |     const auto& header = this->read_from_rva(
      |                 ^~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/ExecutableFormats/PEFile.cc:197:55: note: the temporary was destroyed at the end of the full expression ‘PEFile::read_from_rva(uint32_t, uint32_t) const(((PEFile*)this)->PEFile::header.PEHeader::export_table_rva.little_endian<unsigned int>::<anonymous>.same_endian<unsigned int, unsigned int>::<anonymous>.converted_endian<unsigned int, unsigned int, ident_st<unsigned int, unsigned int>, ident_st<unsigned int, unsigned int> >::operator unsigned int(), ((PEFile*)this)->PEFile::header.PEHeader::export_table_size.little_endian<unsigned int>::<anonymous>.same_endian<unsigned int, unsigned int>::<anonymous>.converted_endian<unsigned int, unsigned int, ident_st<unsigned int, unsigned int>, ident_st<unsigned int, unsigned int> >::operator unsigned int()).StringReader::get<PEExportTableHeader>(1, sizeof (PEExportTableHeader))’
  195 |     const auto& header = this->read_from_rva(
      |                          ~~~~~~~~~~~~~~~~~~~~          
  196 |                                  this->header.export_table_rva, this->header.export_table_size)
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  197 |                              .get<PEExportTableHeader>();
      |                              ~~~~~~~~~~~~~~~~~~~~~~~~~^~
cc1plus: all warnings being treated as errors

and

[54/100] /usr/bin/x86_64-pc-linux-gnu-g++  -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -MF CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o.d -o CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc
FAILED: CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o 
/usr/bin/x86_64-pc-linux-gnu-g++  -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -MF CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o.d -o CMakeFiles/resource_dasm.dir/src/resource_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc:533:120: error: ‘std::uint32_t’ has not been declared
  533 |   shared_ptr<const ResourceFile::Resource> load_family_icon(const std::shared_ptr<const ResourceFile::Resource>& icon, std::uint32_t type) {
      |                                                                                                                        ^~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc: In member function ‘std::shared_ptr<const ResourceFile::Resource> ResourceExporter::load_family_icon(const std::shared_ptr<const ResourceFile::Resource>&, int)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/resource_dasm.cc:534:20: error: comparison of integer expressions of different signedness: ‘const uint32_t’ {aka ‘const unsigned int’} and ‘int’ [-Werror=sign-compare]
  534 |     if (icon->type == type) {
      |         ~~~~~~~~~~~^~~~~~~
cc1plus: all warnings being treated as errors

Disabling the errors with -Wno-dangling-reference and -Wno-sign-compare allows it to continue but then I get:

[48/100] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -MF CMakeFiles/resource_file.dir/src/TextCodecs.cc.o.d -o CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc
FAILED: CMakeFiles/resource_file.dir/src/TextCodecs.cc.o 
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -O2 -MD -MT CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -MF CMakeFiles/resource_file.dir/src/TextCodecs.cc.o.d -o CMakeFiles/resource_file.dir/src/TextCodecs.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc
In file included from /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:1:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:38: error: ‘uint32_t’ was not declared in this scope
   11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
      |                                      ^~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:4:1: note: ‘uint32_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
    3 | #include <string>
  +++ |+#include <cstdint>
    4 | 
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:53: error: expected primary-expression before ‘bool’
   11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
      |                                                     ^~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:42: error: ‘uint32_t’ was not declared in this scope
   12 | std::string raw_string_for_resource_type(uint32_t type);
      |                                          ^~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:42: note: ‘uint32_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:98:65: error: ‘std::string string_for_resource_type(uint32_t, bool)’ redeclared as different kind of entity
   98 | string string_for_resource_type(uint32_t type, bool for_filename) {
      |                                                                 ^
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:11:13: note: previous declaration ‘std::string string_for_resource_type’
   11 | std::string string_for_resource_type(uint32_t type, bool for_filename = false);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.cc:113:50: error: ‘std::string raw_string_for_resource_type(uint32_t)’ redeclared as different kind of entity
  113 | string raw_string_for_resource_type(uint32_t type) {
      |                                                  ^
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/TextCodecs.hh:12:13: note: previous declaration ‘std::string raw_string_for_resource_type’
   12 | std::string raw_string_for_resource_type(uint32_t type);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

Which I can fix by adding #include <cstdint> to src/TextCodecs.hh

But then I get:

[21/22] /usr/bin/x86_64-pc-linux-gnu-g++  -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -Wno-sign-compare -O2 -MD -MT CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -MF CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o.d -o CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc
FAILED: CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o 
/usr/bin/x86_64-pc-linux-gnu-g++  -I/usr/local/include  -O2 -march=native -pipe -std=gnu++20 -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-dangling-reference -Wno-sign-compare -O2 -MD -MT CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -MF CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o.d -o CMakeFiles/hypercard_dasm.dir/src/hypercard_dasm.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc: In function ‘int main(int, char**)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc:1163:29: error: redundant move in initialization [-Werror=redundant-move]
 1163 |       string dir = std::move(*it);
      |                    ~~~~~~~~~^~~~~
/var/tmp/portage/app-arch/resource-dasm-0_p20230831/work/resource_dasm-master/src/hypercard_dasm.cc:1163:29: note: remove ‘std::move’ call
cc1plus: all warnings being treated as errors

If I disable that error with -Wno-redundant-move then everything finishes compiling ok.

Incorrect canvas size for some PICTs

Thanks for these great tools, I'm glad I found them! I used resource_dasm to extract the resources from the DOCMaker readme for Marathon Infinity and convert its PICTs, but the tool got tripped up converting a couple of the resources, attached. As you'll see, the resulting bitmaps seem to contain only the top-left quadrant of the original image. I've called this an "incorrect canvas size" in the issue title; not sure if that's an accurate description of the problem.

P.S.: Almost all of the other PICT resources in the app fail conversion with the error "(subheader has incorrect version (00000000 or 0000)); attempting rendering using picttoppm", however picttoppm converts them correctly. Do you want me to open another issue with samples of those problem PICTs, or is it considered acceptable behavior to punt those to picttoppm since it handles the resources successfully?

badpicts.zip

compile error with g++ 11.2.1_p20220115

I got the following compile error with latest git code from Mar 28 using g++ 11.2.1_p20220115:

[2/57] /usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -DNDEBUG -O2 -march=native -pipe -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -std=gnu++20 -MD -MT CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -MF CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o.d -o CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc
FAILED: CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o 
/usr/bin/x86_64-pc-linux-gnu-g++ -Dresource_file_EXPORTS -I/usr/local/include  -DNDEBUG -O2 -march=native -pipe -fPIC -Wall -Wextra -Werror -Wno-strict-aliasing -std=gnu++20 -MD -MT CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -MF CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o.d -o CMakeFiles/resource_file.dir/src/Decompressors/System2.cc.o -c /var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc
/var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc: In function ‘std::string decompress_system2(const CompressedResourceHeader&, const void*, size_t)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220329/work/resource_dasm-master/src/Decompressors/System2.cc:106:20: error: ‘source_types’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  106 |       source_types <<= 1;
      |       ~~~~~~~~~~~~~^~~~~
cc1plus: all warnings being treated as errors

Modifying the initial value of source_types with uint8_t source_types=0; fixes it.

Improvement : extracting as png instead of bmp

Hi, I was recently extracting the files from slithereen and managed to use your library to extract all I wanted to extract.

I did realize as I was starting to compress my images into png that the lossless compression of the file format makes a massive difference for the color lookup table generated images. The file size goes from 1.9MB to 47kB.

Perhaps that format should be used for any image extracted to make the extract files lighter while not loosing any data.

Encoding.hh: shifting a negative signed value is undefined

(Not sure if I should file this here or in phosg)

I'm using master (f0950b7) and phosg master (9336a3a) with AppleClang 11.0.0.11000033. Compiling results in the following error:

Encoding.hh:14:66: error: shifting a negative signed value is undefined
      [-Werror,-Wshift-negative-value]
    return static_cast<ResultT>(src) | (static_cast<ResultT>(-1) << (sizeof(SrcT) << 3));

Fix that uses unsigned for the shift and then converts to the result type:

template <typename ResultT, typename SrcT>
ResultT sign_extend(SrcT src) {
  using UResultT = std::make_unsigned_t<ResultT>;
  if (src & (1 << ((sizeof(SrcT) << 3) - 1))) {
    return static_cast<ResultT>(src) | (static_cast<ResultT>(static_cast<UResultT>(-1) << (sizeof(SrcT) << 3)));
  } else {
    return static_cast<ResultT>(src);
  }
}

Bad CPU type in executable

I'm on OS 10.15.7 Intel Mac Mini (late 2012) and when I run I get this:
-bash: ./resource_dasm: Bad CPU type in executable
What systems is this utility expected to work on?

Support PICTs that contain a PNG or JPEG

Attached are two PICTs. One contains a standard PNG, and the other contains a standard JPEG. These PICTs are obtained from "resource_dasm --save-raw=yes" using the latest source available.

Besides the compressed image, each PICT also contains a few other opcodes, the purpose of which are to draw a warning message that says, "QuickTime™ and a XXXX decompressor are needed to see this picture." where XXXX may be either "PNG" or "Photo - JPEG" (but perhaps other formats as well, which I have yet to personally encounter).

I am dealing with some game files right now that seem to use this "Compressed Image within a PICT" format. Currently, the compressed image is ignored and the PICT is passed off (I assume to) picttoppm which renders the "QuickTime... needed" text and ignores the compressed image.
PICTs with Compressed Images.zip

Black borders when decoding PICT

I used resource_dasm revision b435972 to convert a PICT file: resource_dasm --decode-pict-file Test.pict. The result was a bmp of the correct size and contents except that close to the edges the image was black. See attached files
Test.pict.zip and Test.pict_PICT_1.bmp.zip (zipped, because Github likes neither PICT nor BMP).

I created the PICT file with Superpaint 3.5, it should contain only a pixmap, no drawing commands. Preview.app displays it correctly.

Easier way to convert TEXT/styl to .rtf?

The data format of SilverCreator is a proprietary non-resource fork format, but in v1.5.1 and earlier it stored styled text in that file using "styl" data. However it seems the only way to convert a TEXT/styl pair with resource_dasm is to put it into a resource fork first, but that's super awkward. A SilverCreator file may have 100s of old TEXT/styl parings in it.

Maybe if --decode-single-resource could be specified twice, something like this (where the output name would also have to be specified, due to the ambiguity of two input files)

resource_dasm --decode-single-resource TEXT text.data --decode-single-resource styl styl.data OutputFile.rtf

Or this syntax would be a bit cleaner. If no output file is specified then stdout is assumed.

resource_dasm --decode-text-styl-pair text.data styl.data

[Question] CLUT file

Question regarding extracting CLUTs for use with resource_dasm.

I can see the system CLUT resource using resedit, how can this be extracted into a useable file for resource_dasm?

image

warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect

Always make a new build before submitting issues 🤣

I got a new one for you 😊

Most of the PICT resources in Dude 2000 v2.71 fail to decode. (Disclaimer: I wrote this game when I was like, 11)

... dudenew/Dude 2000 v2.71_PICT_1118.pict
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=152, y1=163, x2=398, y2=388)); attempting rendering using picttoppm
picttoppm: Invalid PICT: compressed line of 63232 bytes for Row 0 is too big to represent a 256-byte padded row, even with worse case compression.
warning: failed to decode resource: picttoppm failed (256)

PICT 1118 totally fails both resource_dasm and picttoppm. I will raise this issue separately with the NetPBM guy. The picttoppm error here doesn't make sense to me, since the entire PICT is only 6826 bytes.

... dudenew/Dude 2000 v2.71_PICT_1119.pict
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=152, y1=163, x2=398, y2=388)); attempting rendering using picttoppm

PICT 1119 fails in resource_dasm, and picttoppm does not have an error but I still don't get the BMP output for some reason?

Actually, now I'm confused, because for 1120 I did get a BMP file, but the program output looks identical to 1118, which failed totally and gave me the raw PICT output?

... dudenew/Dude 2000 v2.71_PICT_1120.bmp
warning: PICT rendering failed (mask region rect Rect(x1=-27892, y1=26790, x2=0, y2=256) is not same as source rect Rect(x1=27, y1=163, x2=523, y2=388)); attempting rendering using picttoppm
picttoppm: Invalid PICT: compressed line of 1153 bytes for Row 0 is too big to represent a 496-byte padded row, even with worse case compression.
warning: failed to decode resource: picttoppm failed (256)

I ran resource_dasm again with skip-decode and the 3 PICTs (1118, 1119, 1120) are in the attached ZIP. The entire game is available here, use The Unarchiver to decompress: https://mikerichardson.name/graveyard/dude2000_271.sit

3 picts.zip

Even weirder: 1118 and 1119 render fine in Catalina (Preview, QuickLook, etc). 1120 does not (just shows white). The BMP output I got from (whatever managed to decode it) is correct (just shows blue).

image

My build of resource_dasm is from master on July 11, 2022. If any PICT stuff changed since then let me know and I'll try with the latest sources. (It's not super easy to build for me, for some reason.)

make error on Debian 10

Hi, I'm not a C++ expert, this is my output on my Debian 10

make
g++ -I/opt/local/include -g -Wall -std=c++14 -c -o render_bits.o render_bits.cc
In file included from resource_fork.hh:14,
from render_bits.cc:10:
quickdraw_formats.hh:48:8: warning: ignoring packed attribute because of unpacked non-POD field ‘rect bit_map_header::bounds’
rect bounds;
^~~~~~
quickdraw_formats.hh:55:8: warning: ignoring packed attribute because of unpacked non-POD field ‘rect pixel_map_header::bounds’
rect bounds;
^~~~~~
render_bits.cc: In function ‘int main(int, char**)’:
render_bits.cc:136:24: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
for (size_t x = 1; x < argc; x++) {
~~^~~~~~
render_bits.cc:176:16: error: ‘sqrt’ was not declared in this scope
double z = sqrt(pixel_count);
^~~~
render_bits.cc:176:16: note: suggested alternative: ‘stat’
double z = sqrt(pixel_count);
^~~~
stat
render_bits.cc:177:14: error: ‘floor’ was not declared in this scope
if (z != floor(z)) {
^~~~~
render_bits.cc:177:14: note: suggested alternative: ‘flock’
if (z != floor(z)) {
^~~~~
flock
make: *** [: render_bits.o] Error 1

Prebuilt binary for Linux with phosg prelinked

I'm trying to pull the pictures and sounds out of old HyperCard stacks in an environment where I don't have root/sudo so I can't install phosg as a library.

I've been playing with the make files to try to merge the two codebases. There's probably a trick to make it easy, since the macOS release.zip has all the binaries and they seem to run. Can we have a Debian release?

Suggestion: Rework the codebase into a .hsb/.rmf extractor

I suggest that someone (maybe fuzziqer) reworks this into something that can rip .rmf/.hsb files.
It also uses snd/esnd/csnd, midi/emid/cmid/ecmi, SONG and INST.
Documentation on hsb/rmf can be found in the miniBAE source code. ALIS is for duplicate patches.

Blobbo - resource fork missing or empty

Hi,
I've been trying to dump the Blobbo lite 1.0.1 resource files for a personal project of mine (a "demake" of the original game for the Playdate). The issue is, attempting to invoke resource_dasm on the Blobbo.rsrc file produced by unar yields

./resource_dasm ./Blobbo.rsrc
>>> ./Blobbo.rsrc (resource fork missing or empty)

Platform used : Ubuntu 22.04 on WSL2
resource_dasm build : whatever was on master last night

I reckon I'm probably doing it wrong because I know little about classic Mac files. Do you have any insights into this ?

compile error in Ubuntu on Pi4 ARM

[ 12%] Building CXX object CMakeFiles/resource_file.dir/src/Emulators/MemoryContext.cc.o
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc: In member function ‘std::__cxx11::string MemoryContext::Arena::str() const’:
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc:193:30: error: format ‘%lX’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘unsigned int’ [-Werror=format=]
   string ret = string_printf("[Arena %08" PRIX32 "-%08lX at %p alloc=%zX free=%zX alloc_blocks=[",
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/pi/programs/resource_dasm/src/Emulators/MemoryContext.cc:195:7:
       this->addr + this->size,
       ~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/resource_file.dir/build.make:206: CMakeFiles/resource_file.dir/src/Emulators/MemoryContext.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:224: CMakeFiles/resource_file.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

changing the source line to the following seems to allow it to compile OK (take out the L from %08lX):
string ret = string_printf("[Arena %08" PRIX32 "-%08X at %p alloc=%zX free=%zX alloc_blocks=[",

compile errors with g++ 11.2.1_p20211127

I got the following compile error with g++ 11.2.1_p20211127

/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc: In function ‘int main(int, char**)’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1220:74: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
 1220 |         backgrounds.emplace(piecewise_construct, forward_as_tuple(header.id),
      |                                                                   ~~~~~~~^~
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1224:68: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
 1224 |         cards.emplace(piecewise_construct, forward_as_tuple(header.id),
      |                                                             ~~~~~~~^~
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/hypercard_dasm.cc:1228:70: error: cannot bind packed field ‘header.BlockHeader::id’ to ‘int&’
 1228 |         bitmaps.emplace(piecewise_construct, forward_as_tuple(header.id),
      |                                                               ~~~~~~~^~

Which led me to this report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566

Also got this error:

/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc: In member function ‘void ComplexEncounter::byteswap()’:
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc:810:53: error: iteration 5 invokes undefined behavior [-Werror=aggressive-loop-optimizations]
  810 |     this->item_codes[x] = bswap16(this->item_codes[x]);
      |                                   ~~~~~~~~~~~~~~~~~~^
/var/tmp/portage/app-arch/resource-dasm-0_p20220101/work/resource_dasm-master/src/RealmzLib.cc:809:21: note: within this loop
  809 |   for (int x = 0; x < 10; x++) {
      |                   ~~^~~~

That and some other errors led me to this patch to fix the issues:

diff -Naur a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt	2022-01-01 19:29:02.196919666 -0500
+++ b/CMakeLists.txt	2022-01-01 19:29:31.827894405 -0500
@@ -12,7 +12,7 @@
 if (MSVC)
     add_compile_options(/W4 /WX)
 else()
-    add_compile_options(-Wall -Wextra -Werror)
+    add_compile_options(-Wall -Wextra -Werror -Wno-strict-aliasing -Wno-unused-result -Wno-overflow -Wno-maybe-uninitialized -Wno-format -Wno-aggressive-loop-optimizations)
 endif()
 
 include_directories("/usr/local/include")
diff -Naur a/src/hypercard_dasm.cc b/src/hypercard_dasm.cc
--- a/src/hypercard_dasm.cc	2022-01-01 19:29:15.748908114 -0500
+++ b/src/hypercard_dasm.cc	2022-01-01 19:24:45.749129132 -0500
@@ -1201,6 +1201,7 @@
     size_t block_offset = r.where();
     BlockHeader header = r.get_sw<BlockHeader>(false);
     size_t block_end = block_offset + header.size;
+    const int& header_id(header.id);
 
     if (dump_raw_blocks) {
       string type_str = string_for_resource_type(header.type);
@@ -1217,15 +1218,15 @@
         stack_format = stack->format;
         break;
       case 0x424B4744: // BKGD
-        backgrounds.emplace(piecewise_construct, forward_as_tuple(header.id),
+        backgrounds.emplace(piecewise_construct, forward_as_tuple(header_id),
             forward_as_tuple(r, stack_format));
         break;
       case 0x43415244: // CARD
-        cards.emplace(piecewise_construct, forward_as_tuple(header.id),
+        cards.emplace(piecewise_construct, forward_as_tuple(header_id),
             forward_as_tuple(r, stack_format));
         break;
       case 0x424D4150: // BMAP
-        bitmaps.emplace(piecewise_construct, forward_as_tuple(header.id),
+        bitmaps.emplace(piecewise_construct, forward_as_tuple(header_id),
             forward_as_tuple(r, stack_format));
         break;

Minor Issue: BCD Version numbers in 'vers' resources

"Inside Macintosh: Toolbox Essentials" says that, in vers resources the first two binary bytes are encoded in binary coded decimal or BCD. (Page 7-69)

For instance, resource_dasm output suggests that Dark Castle 1.1 is version 1.16 because the first two bytes of the vers resource are 0x01 0x10. 1.16 would be correct if taking the bytes were sufficient. However, each digit is encoded in a nibble rather than a byte. So there are 4 digits and the version number is 01.10 in hex aka 1.1 in decimal

decoded.major_version = r.get_u8();

issue with Mail.app .emlx files

I have a bunch of old Mail.app message files (.emlx) that contain resource forks.
I tried using resource_dasm on one of them, and it produced a .emlx_cmpf_1.bin file.
Is this a compressed resource of some kind?
Any suggestions on what to do with it?

Build error ih hypercard_dasm.cc

Got the following build error with g++ (Gentoo 10.2.0-r5 p6) 10.2.0 for file hypercard_dasm.cc:

hypercard_dasm.cc: In function ‘std::string autoformat_hypertalk(const string&)’:
hypercard_dasm.cc:66:94: error: no matching function for call to ‘transform(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)’
   66 |       transform(lowercase_line.begin(), lowercase_line.end(), lowercase_line.begin(), tolower);
      |                                                                                              ^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include/g++-v10/functional:65,
                 from /usr/include/phosg/Filesystem.hh:15,
                 from hypercard_dasm.cc:9:
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include/g++-v10/bits/stl_algo.h:4302:5: note: candidate: ‘template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)’
 4302 |     transform(_InputIterator __first, _InputIterator __last,
      |     ^~~~~~~~~

Replacing Line #66 in hypercard_dasm.cc from:

transform(lowercase_line.begin(), lowercase_line.end(), lowercase_line.begin(), tolower);

to
transform(lowercase_line.begin(), lowercase_line.end(), lowercase_line.begin(), ::tolower);

Fixed it.

Format of Spectre Supreme "shap" resources

* Spectre Supreme: shap (these might be 3D models)

These are indeed 3D models. In Spectre VR, the "... Matrix" files contain a TMPL resource that describe the format. In Spectre Supreme, this TMPL is missing, but the shap format is almost identical; just the last field has been removed (some of the shap exist in both VR and Supreme, making it easy to compare).

Here's a HQX-encoded resource file with the Supreme TMPL: shap_SpectreSupreme.rsrc.hqx (txt extension because Github).

size_t compile error with GCC 11.1

Attempting to compile with GCC 11.1 produces the error:

In file included from AudioCodecs.cc:1:
AudioCodecs.hh:5:55: error: ‘size_t’ has not been declared
    5 | std::vector<int16_t> decode_mace(const uint8_t* data, size_t size, bool stereo,
      |                                                       ^~~~~~
AudioCodecs.hh:7:55: error: ‘size_t’ has not been declared
    7 | std::vector<int16_t> decode_ima4(const uint8_t* data, size_t size, bool stereo);
      |                                                       ^~~~~~
AudioCodecs.hh:8:55: error: ‘size_t’ has not been declared
    8 | std::vector<int16_t> decode_alaw(const uint8_t* data, size_t size);
      |                                                       ^~~~~~
AudioCodecs.hh:9:55: error: ‘size_t’ has not been declared
    9 | std::vector<int16_t> decode_ulaw(const uint8_t* data, size_t size);
      |                                                       ^~~~~~
make: *** [<builtin>: AudioCodecs.o] Error 1

Adding this to the top of AudioCodecs.hh fixes it:
#include <stddef.h>

Doesn't Work On Amazon Trail?

Pretty sure there are snd and csnd resources in this file, but the tool doesn't work on it? I'm probably doing something wrong, but I had to run the installer in Basilisk II and then extract the installed files from the hard disk using HFVExplorer. Maybe doing this copy screwed something up? Any tips on how to extract sounds from this game?

Format string errors

I'm using master (f0950b7) with AppleClang 11.0.0.11000033. Compiling results in the following error:

resource_dasm.cc:287:77: error: format specifies type 'unsigned short' but the argument has type 'uint8_t' (aka 'unsigned char')

Fix: replace %hu with %hhu:

add_line(prefix + string_printf("(align to %hhu-byte boundary)", entry->end_alignment));

Then:

RealmzScenarioData.cc:587:14: error: format specifies type 'short' but the argument has type 'int8_t' (aka 'signed char')
RealmzScenarioData.cc:645:14: error: format specifies type 'short' but the argument has type 'int8_t' (aka 'signed char')

Fix: replace %hd with %hhd (twice):

string ret = string_printf("===== SIMPLE ENCOUNTER id=%zu can_backout=%hhd max_times=%hhd prompt=%s [SEC%zu]\n",
                                                                       ^^^            ^^^

And finally:

RealmzScenarioData.cc:2046:23: error: format specifies type 'short' but the argument has type 'uint8_t' (aka 'unsigned char')

Fix: replace %hd with %hhu:

map.draw_text(text_xp, text_yp, 0xFFFFFFFF, 0x00000080, "%d-%hhu%%",

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.