-
- std::vector<std::pair<unsigned, unsigned> > MemberOffsetRefs;
-
- if (Symtab) {
- writeSymbolTable(Out, NewMembers, MemberOffsetRefs);
- }
-
- std::vector<unsigned> StringMapIndexes;
- writeStringTable(Out, NewMembers, StringMapIndexes);
-
- std::vector<std::pair<unsigned, unsigned> >::iterator MemberRefsI =
- MemberOffsetRefs.begin();
-
- unsigned MemberNum = 0;
- unsigned LongNameMemberNum = 0;
- for (std::vector<NewArchiveIterator>::iterator I = NewMembers.begin(),
- E = NewMembers.end();
- I != E; ++I, ++MemberNum) {
-
- unsigned Pos = Out.tell();
- while (MemberRefsI != MemberOffsetRefs.end() &&
- MemberRefsI->second == MemberNum) {
- Out.seek(MemberRefsI->first);
- print32BE(Out, Pos);
- ++MemberRefsI;
- }
- Out.seek(Pos);
-
- if (I->isNewMember()) {
- const char *FileName = I->getNew();
-
- int FD;
- failIfError(sys::fs::openFileForRead(FileName, FD), FileName);
-
- sys::fs::file_status Status;
- failIfError(sys::fs::status(FD, Status), FileName);
-
- OwningPtr<MemoryBuffer> File;
- failIfError(MemoryBuffer::getOpenFile(FD, FileName, File,
- Status.getSize(), false),
- FileName);
-
- StringRef Name = sys::path::filename(FileName);
- if (Name.size() < 16)
- printMemberHeader(Out, Name, Status.getLastModificationTime(),
- Status.getUser(), Status.getGroup(),
- Status.permissions(), Status.getSize());
- else
- printMemberHeader(Out, StringMapIndexes[LongNameMemberNum++],
- Status.getLastModificationTime(), Status.getUser(),
- Status.getGroup(), Status.permissions(),
- Status.getSize());
- Out << File->getBuffer();
- } else {
- object::Archive::child_iterator OldMember = I->getOld();
- StringRef Name = I->getName();
-
- if (Name.size() < 16)
- printMemberHeader(Out, Name, OldMember->getLastModified(),
- OldMember->getUID(), OldMember->getGID(),
- OldMember->getAccessMode(), OldMember->getSize());
- else
- printMemberHeader(Out, StringMapIndexes[LongNameMemberNum++],
- OldMember->getLastModified(), OldMember->getUID(),
- OldMember->getGID(), OldMember->getAccessMode(),
- OldMember->getSize());
- Out << OldMember->getBuffer();
- }
-
- if (Out.tell() % 2)
- Out << '\n';
- }
- Output.keep();
- Out.close();
- sys::fs::rename(TemporaryOutput, ArchiveName);
- TemporaryOutput = NULL;