18ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===- lib/Support/YAMLTraits.cpp -----------------------------------------===// 28ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 38ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// The LLVM Linker 48ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 58ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// This file is distributed under the University of Illinois Open Source 68ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// License. See LICENSE.TXT for details. 78ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 88ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 98ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLTraits.h" 118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/ADT/Twine.h" 128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/Casting.h" 138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/ErrorHandling.h" 1411b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/Format.h" 158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLParser.h" 1611b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/raw_ostream.h" 178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include <cstring> 18ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace llvm; 19ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace yaml; 208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// IO 238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::IO(void *Context) : Ctxt(Context) { 268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::~IO() { 298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid *IO::getContext() { 328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return Ctxt; 338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid IO::setContext(void *Context) { 368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Ctxt = Context; 378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Input 418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::Input(StringRef InputContent, void *Ctxt) 4402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik : IO(Ctxt), 4502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik Strm(new Stream(InputContent, SrcMgr)), 4602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik CurrentNode(NULL) { 478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DocIterator = Strm->begin(); 488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::~Input() { 5102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 5202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik} 5302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 54ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramererror_code Input::error() { 558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return EC; 568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 58ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Input::setDiagHandler(SourceMgr::DiagHandlerTy Handler, void *Ctxt) { 598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SrcMgr.setDiagHandler(Handler, Ctxt); 608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::outputting() { 638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() { 67ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (DocIterator != Strm->end()) { 688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Node *N = DocIterator->getRoot(); 69ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (isa<NullNode>(N)) { 708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Empty files are allowed and ignored 718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++DocIterator; 728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return setCurrentDocument(); 738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 7402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik TopNode.reset(this->createHNodes(N)); 7502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik CurrentNode = TopNode.get(); 768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::nextDocument() { 828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++DocIterator; 838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() { 86ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 88ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 89ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (MN) { 908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.clear(); 918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 94ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault, 95ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer void *&SaveInfo) { 968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 97ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 99ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 100ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) { 1018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "not a mapping"); 1028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.push_back(Key); 1058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik HNode *Value = MN->Mapping[Key]; 106ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!Value) { 107ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required) 1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, Twine("missing required key '") + Key + "'"); 1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 1108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = true; 111ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return false; 1128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = Value; 1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) { 119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(saveInfo); 1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() { 123ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 125ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 126ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) 1278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 128ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (MapHNode::NameToNode::iterator i = MN->Mapping.begin(), 129ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = MN->Mapping.end(); i != End; ++i) { 1309e8eafa0f0ad36c3e4397e97b67b8245b04ba618Dmitri Gribenko if (!MN->isValidKey(i->first())) { 1319e8eafa0f0ad36c3e4397e97b67b8245b04ba618Dmitri Gribenko setError(i->second, Twine("unknown key '") + i->first() + "'"); 1328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 1338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() { 138ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQ->Entries.size(); 1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 143ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() { 1458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 146ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) { 148ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 150ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = SQ->Entries[Index]; 1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 157ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) { 159ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginFlowSequence() { 163ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQ->Entries.size(); 1658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 168ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) { 170ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 172ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = SQ->Entries[index]; 1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 179ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) { 181ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 183ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() { 1858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() { 1888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = false; 1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) { 192ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarMatchFound) 1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 194ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 195ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = true; 1978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() { 204ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!ScalarMatchFound) { 2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unknown enumerated scalar"); 2068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) { 2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.clear(); 211ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false); 213ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = true; 2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) { 221ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 223ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Index = 0; 225ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (std::vector<HNode *>::iterator i = SQ->Entries.begin(), 226ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = SQ->Entries.end(); i != End; ++i) { 227ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(*i)) { 228ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 2298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed[Index] = true; 2308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 232ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar in sequence of bit values"); 2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++Index; 2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 237ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() { 244ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 246ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(BitValuesUsed.size() == SQ->Entries.size()); 248ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < SQ->Entries.size(); ++i) { 249ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!BitValuesUsed[i]) { 2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(SQ->Entries[i], "unknown bit value"); 2518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 2528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::scalarString(StringRef &S) { 258ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik S = SN->value(); 260ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar"); 2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) { 2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(hnode->_node, message); 2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) { 2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Strm->printError(node, message); 2718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EC = make_error_code(errc::invalid_argument); 2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikInput::HNode *Input::createHNodes(Node *N) { 275ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<128> StringStorage; 276ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { 2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringRef KeyStr = SN->getValue(StringStorage); 278ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 2798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 2808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 28102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik char *Buf = StringAllocator.Allocate<char>(Len); 2828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 2848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 28502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik return new ScalarHNode(N, KeyStr); 286ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { 28702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik SequenceHNode *SQHNode = new SequenceHNode(N); 288ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (SequenceNode::iterator i = SQ->begin(), End = SQ->end(); i != End; 289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ++i) { 2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik HNode *Entry = this->createHNodes(i); 291ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 2938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SQHNode->Entries.push_back(Entry); 2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQHNode; 296ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { 29702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik MapHNode *mapHNode = new MapHNode(N); 298ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (MappingNode::iterator i = Map->begin(), End = Map->end(); i != End; 299ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ++i) { 300ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ScalarNode *KeyScalar = dyn_cast<ScalarNode>(i->getKey()); 3018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringStorage.clear(); 302ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef KeyStr = KeyScalar->getValue(StringStorage); 303ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 3048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 30602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik char *Buf = StringAllocator.Allocate<char>(Len); 3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 3098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 310ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer HNode *ValueHNode = this->createHNodes(i->getValue()); 311ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 3128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik mapHNode->Mapping[KeyStr] = ValueHNode; 3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return mapHNode; 316ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (isa<NullNode>(N)) { 31702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik return new EmptyHNode(N); 318ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 3198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(N, "unknown node kind"); 3208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return NULL; 3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) { 3256227d5c690504c7ada5780c00a635b282c46e275Craig Topper for (SmallVectorImpl<const char *>::iterator i = ValidKeys.begin(), 326ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = ValidKeys.end(); i != End; ++i) { 327ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Key.equals(*i)) 3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 3318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) { 3348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(CurrentNode, Message); 3358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 33702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::MapHNode::~MapHNode() { 33802fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik for (MapHNode::NameToNode::iterator i = Mapping.begin(), End = Mapping.end(); 33902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik i != End; ++i) { 34002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik delete i->second; 34102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik } 34202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik} 34302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 34402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::SequenceHNode::~SequenceHNode() { 34502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik for (std::vector<HNode*>::iterator i = Entries.begin(), End = Entries.end(); 34602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik i != End; ++i) { 34702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik delete *i; 34802fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik } 34902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik} 35002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 35102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 35202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 3538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Output 3558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 357ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerOutput::Output(raw_ostream &yout, void *context) 358ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer : IO(context), 359ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out(yout), 360ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Column(0), 361ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ColumnAtFlowStart(0), 362ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedBitValueComma(false), 363ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedFlowSequenceComma(false), 364ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer EnumerationMatchFound(false), 365ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedsNewLine(false) { 3668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() { 3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::outputting() { 3728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() { 3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapFirstKey); 3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() { 3818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault, 385ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer bool &UseDefault, void *&) { 3868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 387ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required || !SameAsDefault) { 3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->paddedKey(Key); 3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 3938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 395ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) { 396ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inMapFirstKey) { 3978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 3988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapOtherKey); 3998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() { 4038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("---"); 4048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) { 407ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (index > 0) 4088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("\n---"); 4098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() { 4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() { 4168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n...\n"); 4178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() { 4208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inSeq); 4218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 424ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() { 4268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 428ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 429ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) { 4308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 432ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 433ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) { 4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() { 4378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inFlowSeq); 43850c30427405142f1b587edee846606184ae6af8eNick Kledzik this->newLineCheck(); 4398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ColumnAtFlowStart = Column; 4408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = false; 4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 444ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() { 4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 449ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 450ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) { 451ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedFlowSequenceComma) 4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 453ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Column > 70) { 4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n"); 455ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (int i = 0; i < ColumnAtFlowStart; ++i) 4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = ColumnAtFlowStart; 4588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 462ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 463ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) { 4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = true; 4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() { 4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = false; 4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) { 472ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Match && !EnumerationMatchFound) { 4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(Str); 4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = true; 4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() { 481ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!EnumerationMatchFound) 4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik llvm_unreachable("bad runtime enum value"); 4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) { 4868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = false; 4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = false; 4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) { 494ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Matches) { 495ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedBitValueComma) 4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(Str); 4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = true; 4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() { 5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::scalarString(StringRef &S) { 5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik if (S.find('\n') == StringRef::npos) { 5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // No embedded new-line chars, just print string. 5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(S); 5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned i = 0; 5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned j = 0; 5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned End = S.size(); 5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); // Starting single quote. 5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *Base = S.data(); 5198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik while (j < End) { 5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Escape a single quote by doubling it. 5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik if (S[j] == '\'') { 5228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i + 1)); 5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); 5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik i = j + 1; 5258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++j; 5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i)); 5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("'"); // Ending single quote. 5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) { 5338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) { 5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column += s.size(); 5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << s; 5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) { 5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(s); 5422b45dd58b22da40bb08e82d1564ccecca4a700f5Richard Smith if (StateStack.empty() || StateStack.back() != inFlowSeq) 5438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 5448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() { 5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << "\n"; 5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = 0; 5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- " 5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use " " 5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 5548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() { 556ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!NeedsNewLine) 5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = false; 5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputNewLine(); 5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(StateStack.size() > 0); 5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Indent = StateStack.size() - 1; 5648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik bool OutputDash = false; 5658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 566ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inSeq) { 5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 568ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) && 569ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer (StateStack[StateStack.size() - 2] == inSeq)) { 5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik --Indent; 5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 574ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < Indent; ++i) { 5758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 5768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 577ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (OutputDash) { 5788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("- "); 5798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) { 5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(key); 5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(":"); 5868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *spaces = " "; 587ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (key.size() < strlen(spaces)) 5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(&spaces[key.size()]); 5898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 5908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 5918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 5948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// traits for built-in types 5958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 5968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 597ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) { 598ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << (Val ? "true" : "false"); 599ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 601ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) { 602ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Scalar.equals("true")) { 603ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = true; 6048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 605ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (Scalar.equals("false")) { 606ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = false; 6078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 6088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 609ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid boolean"; 610ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 612ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *, 613ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 614ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 615ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 617ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *, 618ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef &Val) { 619ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Scalar; 620ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 621ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 623ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *, 624ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 625ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp uin32_t because ostream thinks uint8_t is a character 626ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 627ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 628ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 630ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) { 631ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 632ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 633ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 634ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 635ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 636ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 637ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 638ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 640ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *, 641ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 642ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 643ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 645ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *, 646ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t &Val) { 647ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 648ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 649ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 650ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 651ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 652ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 653ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 654ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 656ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *, 657ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 658ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 659ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 661ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *, 662ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t &Val) { 663ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 664ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 665ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 666ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 667ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 668ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 669ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 670ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 672ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *, 673ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 674ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 675ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 677ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *, 678ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t &Val) { 679ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long N; 680ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, N)) 681ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 682ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 683ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 684ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 686ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) { 687ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp in32_t because ostream thinks int8_t is a character 688ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer int32_t Num = Val; 689ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 690ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 692ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) { 693ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 694ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 695ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 696ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > 127) || (N < -128)) 697ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 698ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 699ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 700ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 702ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *, 703ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 704ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 707ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) { 708ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 709ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 711ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT16_MAX) || (N < INT16_MIN)) 712ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 713ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 714ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 717ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *, 718ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 719ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 720ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 722ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) { 723ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 724ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 725ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 726ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT32_MAX) || (N < INT32_MIN)) 727ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 729ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 730ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 732ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *, 733ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 734ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 735ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 737ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) { 738ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 739ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 740ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 741ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 742ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 743ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 745ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) { 746ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 747ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 749ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) { 750ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 751ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 752ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 755ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) { 759ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 762ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) { 763ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 764ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 766ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 767ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 771ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) { 772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint8_t Num = Val; 773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%02X", Num); 774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) { 777ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 778ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 779ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex8 number"; 780ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 781ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex8 number"; 782ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 783ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 784ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 786ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) { 787ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t Num = Val; 788ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%04X", Num); 789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) { 792ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex16 number"; 795ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex16 number"; 797ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) { 802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%08X", Num); 804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 806ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) { 807ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 808ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 809ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex32 number"; 810ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 811ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex32 number"; 812ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 813ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 814ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 816ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) { 817ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t Num = Val; 818ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%016llX", Num); 819ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 821ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) { 822ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long Num; 823ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, Num)) 824ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex64 number"; 825ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Num; 826ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 827ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 828