1*da58b97aSjoerg //===- ArchiveEmitter.cpp ---------------------------- --------------------===//
2*da58b97aSjoerg //
3*da58b97aSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*da58b97aSjoerg // See https://llvm.org/LICENSE.txt for license information.
5*da58b97aSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*da58b97aSjoerg //
7*da58b97aSjoerg //===----------------------------------------------------------------------===//
8*da58b97aSjoerg 
9*da58b97aSjoerg #include "llvm/ObjectYAML/ArchiveYAML.h"
10*da58b97aSjoerg #include "llvm/ObjectYAML/yaml2obj.h"
11*da58b97aSjoerg #include "llvm/Support/Error.h"
12*da58b97aSjoerg #include "llvm/Support/raw_ostream.h"
13*da58b97aSjoerg 
14*da58b97aSjoerg using namespace llvm;
15*da58b97aSjoerg using namespace ArchYAML;
16*da58b97aSjoerg 
17*da58b97aSjoerg namespace llvm {
18*da58b97aSjoerg namespace yaml {
19*da58b97aSjoerg 
yaml2archive(ArchYAML::Archive & Doc,raw_ostream & Out,ErrorHandler EH)20*da58b97aSjoerg bool yaml2archive(ArchYAML::Archive &Doc, raw_ostream &Out, ErrorHandler EH) {
21*da58b97aSjoerg   Out.write(Doc.Magic.data(), Doc.Magic.size());
22*da58b97aSjoerg 
23*da58b97aSjoerg   if (Doc.Content) {
24*da58b97aSjoerg     Doc.Content->writeAsBinary(Out);
25*da58b97aSjoerg     return true;
26*da58b97aSjoerg   }
27*da58b97aSjoerg 
28*da58b97aSjoerg   if (!Doc.Members)
29*da58b97aSjoerg     return true;
30*da58b97aSjoerg 
31*da58b97aSjoerg   auto WriteField = [&](StringRef Field, uint8_t Size) {
32*da58b97aSjoerg     Out.write(Field.data(), Field.size());
33*da58b97aSjoerg     for (size_t I = Field.size(); I != Size; ++I)
34*da58b97aSjoerg       Out.write(' ');
35*da58b97aSjoerg   };
36*da58b97aSjoerg 
37*da58b97aSjoerg   for (const Archive::Child &C : *Doc.Members) {
38*da58b97aSjoerg     for (auto &P : C.Fields)
39*da58b97aSjoerg       WriteField(P.second.Value, P.second.MaxLength);
40*da58b97aSjoerg 
41*da58b97aSjoerg     if (C.Content)
42*da58b97aSjoerg       C.Content->writeAsBinary(Out);
43*da58b97aSjoerg     if (C.PaddingByte)
44*da58b97aSjoerg       Out.write(*C.PaddingByte);
45*da58b97aSjoerg   }
46*da58b97aSjoerg 
47*da58b97aSjoerg   return true;
48*da58b97aSjoerg }
49*da58b97aSjoerg 
50*da58b97aSjoerg } // namespace yaml
51*da58b97aSjoerg } // namespace llvm
52