This is archive-extract, an un-archiver. Pass it a file created by archive.retro to extract the files.

As a recap of the file format.

# of files filename length in bytes ... data ... filename length in bytes ... data ... [ ... repeat for each file ... ]

I track the input (the archive) in In and the current file being extracted in Out.

~~~'In var 'Out var ~~~

The filename is passed in via the command line. Open it, save the pointer.

~~~#0 script:get-argument file:open-for-reading nip !In ~~~

I define a helper that will be used write data to the output file.

~~~:write @Out file:write ; ~~~

Define words to process the archive data.

~~~:get-count  @In file:read-line s:to-number ; :filename   @In file:read-line file:open-for-writing !Out ; :size       @In file:read-line s:to-number ; :extract    [ @In file:read write ] times ; :skip-nl    @In file:read-line drop ; :close      @Out file:close ; ~~~

Then use them to process the file.

~~~get-count [ filename size extract close skip-nl ] times @In file:close ~~~