/** Write string table back to disk. Free space is zeroed out; holes are left as they are. */ void SgAsmElfStrtab::unparse(std::ostream &f) const { SgAsmGenericSection *container = get_container(); /* Write strings with NUL termination. Shared strings will be written more than once, but that's OK. */ for (size_t i=0; i<p_storage_list.size(); i++) { SgAsmStringStorage *storage = p_storage_list[i]; ROSE_ASSERT(storage->get_offset()!=SgAsmGenericString::unallocated); rose_addr_t at = container->write(f, storage->get_offset(), storage->get_string()); container->write(f, at, '\0'); } /* Fill free areas with zero */ BOOST_FOREACH (const AddressInterval &interval, get_freelist().intervals()) container->write(f, interval.least(), std::string(interval.size(), '\0')); }
/* Write string table back to disk. Free space is zeroed out; holes are left as they are. */ void SgAsmCoffStrtab::unparse(std::ostream &f) const { SgAsmGenericSection *container = get_container(); /* Write length coded strings. Shared strings will be written more than once, but that's OK. */ for (size_t i=0; i<p_storage_list.size(); i++) { SgAsmStringStorage *storage = p_storage_list[i]; ROSE_ASSERT(storage->get_offset()!=SgAsmGenericString::unallocated); rose_addr_t at = container->write(f, storage->get_offset(), storage->get_string()); container->write(f, at, '\0'); } /* Fill free areas with zero */ for (ExtentMap::const_iterator i=get_freelist().begin(); i!=get_freelist().end(); ++i) { container->write(f, i->first.first(), std::string(i->first.size(), '\0')); } }