YAMLTraits.cpp revision 2b45dd58b22da40bb08e82d1564ccecca4a700f5
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 43ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerInput::Input(StringRef InputContent, void *Ctxt) : IO(Ctxt), CurrentNode(NULL) { 448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Strm = new Stream(InputContent, SrcMgr); 458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DocIterator = Strm->begin(); 468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 48ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramererror_code Input::error() { 498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return EC; 508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 52ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Input::setDiagHandler(SourceMgr::DiagHandlerTy Handler, void *Ctxt) { 538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SrcMgr.setDiagHandler(Handler, Ctxt); 548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::outputting() { 578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() { 61ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (DocIterator != Strm->end()) { 628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Node *N = DocIterator->getRoot(); 63ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (isa<NullNode>(N)) { 648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Empty files are allowed and ignored 658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++DocIterator; 668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return setCurrentDocument(); 678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = this->createHNodes(N); 698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::nextDocument() { 758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++DocIterator; 768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() { 79ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 81ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 82ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (MN) { 838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.clear(); 848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 87ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault, 88ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer void *&SaveInfo) { 898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 90ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 92ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 93ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) { 948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "not a mapping"); 958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.push_back(Key); 988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik HNode *Value = MN->Mapping[Key]; 99ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!Value) { 100ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required) 1018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, Twine("missing required key '") + Key + "'"); 1028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 1038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = true; 104ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return false; 1058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = Value; 1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) { 112ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(saveInfo); 1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() { 116ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 118ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) 1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 121ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (MapHNode::NameToNode::iterator i = MN->Mapping.begin(), 122ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = MN->Mapping.end(); i != End; ++i) { 123ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN->isValidKey(i->first)) { 124ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer setError(i->second, Twine("unknown key '") + i->first + "'"); 1258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 1268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() { 131ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQ->Entries.size(); 1338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 136ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() { 1388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 139ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) { 141ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 143ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = SQ->Entries[Index]; 1468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 150ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) { 152ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginFlowSequence() { 156ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQ->Entries.size(); 1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 161ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) { 163ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 165ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = SQ->Entries[index]; 1688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 172ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) { 174ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 176ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() { 1788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() { 1818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = false; 1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) { 185ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarMatchFound) 1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 187ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 188ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = true; 1908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() { 197ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!ScalarMatchFound) { 1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unknown enumerated scalar"); 1998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) { 2038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.clear(); 204ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false); 206ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = true; 2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) { 214ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 216ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Index = 0; 218ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (std::vector<HNode *>::iterator i = SQ->Entries.begin(), 219ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = SQ->Entries.end(); i != End; ++i) { 220ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(*i)) { 221ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed[Index] = true; 2238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 225ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar in sequence of bit values"); 2278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++Index; 2298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 230ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() { 237ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 239ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(BitValuesUsed.size() == SQ->Entries.size()); 241ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < SQ->Entries.size(); ++i) { 242ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!BitValuesUsed[i]) { 2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(SQ->Entries[i], "unknown bit value"); 2448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::scalarString(StringRef &S) { 251ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 2528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik S = SN->value(); 253ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar"); 2558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) { 2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(hnode->_node, message); 2608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) { 2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Strm->printError(node, message); 2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EC = make_error_code(errc::invalid_argument); 2658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikInput::HNode *Input::createHNodes(Node *N) { 268ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<128> StringStorage; 269ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { 2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringRef KeyStr = SN->getValue(StringStorage); 271ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 274ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *Buf = Allocator.Allocate<char>(Len); 2758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 2768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return new (Allocator) ScalarHNode(N, KeyStr); 279ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { 2808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SequenceHNode *SQHNode = new (Allocator) SequenceHNode(N); 281ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (SequenceNode::iterator i = SQ->begin(), End = SQ->end(); i != End; 282ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ++i) { 2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik HNode *Entry = this->createHNodes(i); 284ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 2868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SQHNode->Entries.push_back(Entry); 2878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQHNode; 289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { 2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MapHNode *mapHNode = new (Allocator) MapHNode(N); 291ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (MappingNode::iterator i = Map->begin(), End = Map->end(); i != End; 292ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ++i) { 293ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ScalarNode *KeyScalar = dyn_cast<ScalarNode>(i->getKey()); 2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringStorage.clear(); 295ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef KeyStr = KeyScalar->getValue(StringStorage); 296ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 2978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 2988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 299ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *Buf = Allocator.Allocate<char>(Len); 3008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 3018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 3028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 303ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer HNode *ValueHNode = this->createHNodes(i->getValue()); 304ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 3068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik mapHNode->Mapping[KeyStr] = ValueHNode; 3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return mapHNode; 309ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (isa<NullNode>(N)) { 3108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return new (Allocator) EmptyHNode(N); 311ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 3128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(N, "unknown node kind"); 3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return NULL; 3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) { 318ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (SmallVector<const char *, 6>::iterator i = ValidKeys.begin(), 319ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer End = ValidKeys.end(); i != End; ++i) { 320ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Key.equals(*i)) 3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) { 3278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(CurrentNode, Message); 3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Output 3328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 334ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerOutput::Output(raw_ostream &yout, void *context) 335ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer : IO(context), 336ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out(yout), 337ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Column(0), 338ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ColumnAtFlowStart(0), 339ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedBitValueComma(false), 340ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedFlowSequenceComma(false), 341ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer EnumerationMatchFound(false), 342ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedsNewLine(false) { 3438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() { 3468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::outputting() { 3498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() { 3538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapFirstKey); 3548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 3558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() { 3588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 3598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault, 362ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer bool &UseDefault, void *&) { 3638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 364ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required || !SameAsDefault) { 3658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 3668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->paddedKey(Key); 3678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 3708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 372ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) { 373ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inMapFirstKey) { 3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 3758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapOtherKey); 3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() { 3808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("---"); 3818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) { 384ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (index > 0) 3858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("\n---"); 3868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() { 3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() { 3938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n...\n"); 3948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() { 3978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inSeq); 3988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 3998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 401ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() { 4038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 405ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 406ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) { 4078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 409ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 410ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) { 4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() { 4148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inFlowSeq); 4168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ColumnAtFlowStart = Column; 4178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 4188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = false; 4198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 421ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() { 4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 4258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 426ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 427ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) { 428ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedFlowSequenceComma) 4298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 430ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Column > 70) { 4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n"); 432ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (int i = 0; i < ColumnAtFlowStart; ++i) 4338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = ColumnAtFlowStart; 4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 439ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 440ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) { 4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = true; 4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() { 4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = false; 4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) { 449ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Match && !EnumerationMatchFound) { 4508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(Str); 4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = true; 4538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 4558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() { 458ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!EnumerationMatchFound) 4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik llvm_unreachable("bad runtime enum value"); 4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) { 4638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = false; 4668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = false; 4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) { 471ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Matches) { 472ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedBitValueComma) 4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 4748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(Str); 4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = true; 4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() { 4818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::scalarString(StringRef &S) { 4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik if (S.find('\n') == StringRef::npos) { 4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // No embedded new-line chars, just print string. 4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(S); 4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned i = 0; 4928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned j = 0; 4938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned End = S.size(); 4948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); // Starting single quote. 4958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *Base = S.data(); 4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik while (j < End) { 4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Escape a single quote by doubling it. 4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik if (S[j] == '\'') { 4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i + 1)); 5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); 5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik i = j + 1; 5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++j; 5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i)); 5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("'"); // Ending single quote. 5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) { 5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) { 5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column += s.size(); 5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << s; 5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) { 5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(s); 5192b45dd58b22da40bb08e82d1564ccecca4a700f5Richard Smith if (StateStack.empty() || StateStack.back() != inFlowSeq) 5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() { 5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << "\n"; 5258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = 0; 5268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- " 5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use " " 5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() { 533ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!NeedsNewLine) 5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = false; 5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputNewLine(); 5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(StateStack.size() > 0); 5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Indent = StateStack.size() - 1; 5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik bool OutputDash = false; 5428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 543ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inSeq) { 5448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 545ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) && 546ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer (StateStack[StateStack.size() - 2] == inSeq)) { 5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik --Indent; 5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 551ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < Indent; ++i) { 5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 554ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (OutputDash) { 5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("- "); 5568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) { 5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(key); 5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(":"); 5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *spaces = " "; 564ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (key.size() < strlen(spaces)) 5658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(&spaces[key.size()]); 5668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 5688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// traits for built-in types 5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 574ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) { 575ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << (Val ? "true" : "false"); 576ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 5778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 578ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) { 579ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Scalar.equals("true")) { 580ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = true; 5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 582ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (Scalar.equals("false")) { 583ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = false; 5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 586ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid boolean"; 587ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 589ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *, 590ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 591ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 592ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 594ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *, 595ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef &Val) { 596ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Scalar; 597ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 598ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 5998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 600ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *, 601ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 602ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp uin32_t because ostream thinks uint8_t is a character 603ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 604ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 605ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 607ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) { 608ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 609ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 610ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 611ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 612ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 613ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 614ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 615ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 617ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *, 618ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 619ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 620ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 622ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *, 623ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t &Val) { 624ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 625ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 626ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 627ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 628ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 629ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 630ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 631ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 633ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *, 634ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 635ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 636ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 638ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *, 639ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t &Val) { 640ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 641ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 642ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 643ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 644ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 645ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 646ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 647ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 649ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *, 650ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 651ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 652ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 654ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *, 655ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t &Val) { 656ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long N; 657ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, N)) 658ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 659ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 660ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 661ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 663ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) { 664ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp in32_t because ostream thinks int8_t is a character 665ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer int32_t Num = Val; 666ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 667ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 669ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) { 670ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 671ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 672ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 673ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > 127) || (N < -128)) 674ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 675ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 676ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 677ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 679ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *, 680ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 681ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 682ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 684ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) { 685ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 686ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 687ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 688ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT16_MAX) || (N < INT16_MIN)) 689ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 690ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 691ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 692ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 694ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *, 695ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 696ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 697ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 699ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) { 700ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 701ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 702ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 703ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT32_MAX) || (N < INT32_MIN)) 704ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 706ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 707ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 709ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *, 710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 711ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 712ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 714ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) { 715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 716ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 717ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 718ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 719ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 720ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 722ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) { 723ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 724ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 726ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) { 727ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 729ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 730ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 731ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 732ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 733ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 735ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) { 736ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 737ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 739ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) { 740ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 741ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 742ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 743ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 744ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 745ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 746ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 748ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) { 749ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint8_t Num = Val; 750ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%02X", Num); 751ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) { 754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 755ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex8 number"; 757ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex8 number"; 759ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 761ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 763ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) { 764ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t Num = Val; 765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%04X", Num); 766ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) { 769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 770ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 771ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex16 number"; 772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex16 number"; 774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 775ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 778ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) { 779ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 780ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%08X", Num); 781ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 783ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) { 784ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 785ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 786ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex32 number"; 787ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 788ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex32 number"; 789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 790ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) { 794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t Num = Val; 795ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%016llX", Num); 796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) { 799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long Num; 800ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, Num)) 801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex64 number"; 802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Num; 803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 805