static void do_extract_file(deark *c, lctx *d, de_int64 dir_pos, de_byte filetype_c64s, de_byte filetype) { de_int64 load_addr; de_int64 end_addr; de_int64 offset; dbuf *f = NULL; de_int64 payload_size; // = file_size-2 de_ucstring *fname = NULL; de_int64 fname_len; de_int64 i; de_int64 fnpos; de_finfo *fi = NULL; load_addr = de_getui16le(dir_pos+2); end_addr = de_getui16le(dir_pos+4); offset = de_getui32le(dir_pos+8); de_dbg(c, "load_addr=%d end_addr=%d offset=%d\n", (int)load_addr, (int)end_addr, (int)offset); // File name at pos+16 fnpos = dir_pos+16; // Find the length of the (space-padded) filename. fname_len = 0; for(i=15; i>=0; i--) { if(de_getbyte(fnpos+i)!=' ') { fname_len = i+1; break; } } de_dbg2(c, "filename length: %d\n", (int)fname_len); fname = ucstring_create(c); dbuf_read_to_ucstring(c->infile, fnpos, fname_len, fname, 0, DE_ENCODING_PETSCII); de_dbg(c, "filename: \"%s\"\n", ucstring_get_printable_sz(fname)); ucstring_append_sz(fname, ".prg", DE_ENCODING_ASCII); fi = de_finfo_create(c); de_finfo_set_name_from_ucstring(c, fi, fname); fi->original_filename_flag = 1; payload_size = end_addr - load_addr; if(payload_size < 0) { // TODO: Try to support files that don't have end_addr set properly. de_err(c, "This type of T64 file is not supported.\n"); goto done; } f = dbuf_create_output_file(c, NULL, fi, 0); dbuf_copy(c->infile, dir_pos+2, 2, f); dbuf_copy(c->infile, offset, payload_size, f); done: dbuf_close(f); de_finfo_destroy(c, fi); ucstring_destroy(fname); }
static void extract_unknown_ole_obj(deark *c, lctx *d, i64 pos, i64 len, struct de_stringreaderdata *srd_typename) { de_finfo *fi = NULL; de_ucstring *s = NULL; fi = de_finfo_create(c); s = ucstring_create(c); ucstring_append_sz(s, "oleobj", DE_ENCODING_LATIN1); if(ucstring_isnonempty(srd_typename->str)) { ucstring_append_sz(s, ".", DE_ENCODING_LATIN1); ucstring_append_ucstring(s, srd_typename->str); } de_finfo_set_name_from_ucstring(c, fi, s, 0); dbuf_create_file_from_slice(c->infile, pos, len, "bin", fi, 0); ucstring_destroy(s); de_finfo_destroy(c, fi); }
static void ucstring_vprintf(de_ucstring *s, int encoding, const char *fmt, va_list ap) { char buf[1024]; de_vsnprintf(buf, sizeof(buf), fmt, ap); ucstring_append_sz(s, buf, encoding); }