void dng_stream::DuplicateStream (dng_stream &dstStream) { // Turn off sniffers for this operation. TempStreamSniffer noSniffer1 (*this , NULL); TempStreamSniffer noSniffer2 (dstStream, NULL); // First grow the destination stream if required, in an attempt to // reserve any needed space before overwriting the existing data. if (dstStream.Length () < Length ()) { dstStream.SetLength (Length ()); } SetReadPosition (0); dstStream.SetWritePosition (0); CopyToStream (dstStream, Length ()); dstStream.Flush (); dstStream.SetLength (Length ()); }
int main(int argc, char **argv) { char *wadfile; char *prefix = ""; FILE *file; wadinfo_t hdr; lumpinfo_t info; fname_t *it; int c; char lumpbase[4]; int direc_size, direc_offset; PrintBanner(); if (argc < 2 || argc > 3) { PrintUsage(); return 0; } wadfile = argv[1]; if (argc > 2) prefix = argv[2]; srand((unsigned int)time(0)); rand(); rand(); // First compile the list of all file names. InitList(); printf("Collecting files...\n"); CollectFiles(""); printf("Creating WAD file %s...\n", wadfile); if ((file = fopen(wadfile, "wb")) == NULL) { printf("Couldn't open %s.\n", wadfile); perror("Error"); goto stop_now; } // The header. hdr.identification[0] = 'P'; hdr.identification[1] = 'W'; hdr.identification[2] = 'A'; hdr.identification[3] = 'D'; hdr.numlumps = CountList() + 1; hdr.infotableofs = 0; // We've no idea yet. fwrite(&hdr, sizeof(hdr), 1, file); // Write all the files. sprintf(lumpbase, "%c%c", 'A' + rand() % 26, 'A' + rand() % 26); for (it = root.next, c = 0; it != &root; it = it->next, c++) { it->offset = ftell(file); if (!CopyToStream(file, it)) { perror(it->path); goto stop_now; } printf("%s\n", it->path); sprintf(it->lump, "__%s%04X", lumpbase, c); } // Write DD_DIREC. direc_offset = ftell(file); for (it = root.next; it != &root; it = it->next) fprintf(file, "%s %s%s\n", it->lump, prefix, it->path); direc_size = ftell(file) - direc_offset; // Time to write the info table. hdr.infotableofs = ftell(file); for (it = root.next, c = 0; it != &root; it = it->next, c++) { memset(&info, 0, sizeof(info)); info.filepos = it->offset; info.size = it->size; memcpy(info.name, it->lump, 8); fwrite(&info, sizeof(info), 1, file); } // Finally DD_DIREC's entry. info.filepos = direc_offset; info.size = direc_size; strncpy(info.name, "DD_DIREC", 8); fwrite(&info, sizeof(info), 1, file); // Rewrite the header. rewind(file); fwrite(&hdr, sizeof(hdr), 1, file); // We're done! fclose(file); stop_now: DestroyList(); return 0; }