2
0

YAMLTraits.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. //===- lib/Support/YAMLTraits.cpp -----------------------------------------===//
  2. //
  3. // The LLVM Linker
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Support/YAMLTraits.h"
  10. #include "llvm/ADT/SmallString.h"
  11. #include "llvm/ADT/Twine.h"
  12. #include "llvm/Support/Casting.h"
  13. #include "llvm/Support/Errc.h"
  14. #include "llvm/Support/ErrorHandling.h"
  15. #include "llvm/Support/Format.h"
  16. #include "llvm/Support/LineIterator.h"
  17. #include "llvm/Support/YAMLParser.h"
  18. #include "llvm/Support/raw_ostream.h"
  19. #include <cctype>
  20. #include <cstring>
  21. using namespace llvm;
  22. using namespace yaml;
  23. //===----------------------------------------------------------------------===//
  24. // IO
  25. //===----------------------------------------------------------------------===//
  26. IO::IO(void *Context) : Ctxt(Context) {
  27. }
  28. IO::~IO() {
  29. }
  30. void *IO::getContext() {
  31. return Ctxt;
  32. }
  33. void IO::setContext(void *Context) {
  34. Ctxt = Context;
  35. }
  36. //===----------------------------------------------------------------------===//
  37. // Input
  38. //===----------------------------------------------------------------------===//
  39. Input::Input(StringRef InputContent,
  40. void *Ctxt,
  41. SourceMgr::DiagHandlerTy DiagHandler,
  42. void *DiagHandlerCtxt)
  43. : IO(Ctxt),
  44. Strm(new Stream(InputContent, SrcMgr)),
  45. CurrentNode(nullptr) {
  46. if (DiagHandler)
  47. SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt);
  48. DocIterator = Strm->begin();
  49. }
  50. Input::~Input() {
  51. }
  52. std::error_code Input::error() { return EC; }
  53. // Pin the vtables to this file.
  54. void Input::HNode::anchor() {}
  55. void Input::EmptyHNode::anchor() {}
  56. void Input::ScalarHNode::anchor() {}
  57. void Input::MapHNode::anchor() {}
  58. void Input::SequenceHNode::anchor() {}
  59. bool Input::outputting() {
  60. return false;
  61. }
  62. bool Input::setCurrentDocument() {
  63. if (DocIterator != Strm->end()) {
  64. Node *N = DocIterator->getRoot();
  65. if (!N) {
  66. assert(Strm->failed() && "Root is NULL iff parsing failed");
  67. EC = make_error_code(errc::invalid_argument);
  68. return false;
  69. }
  70. if (isa<NullNode>(N)) {
  71. // Empty files are allowed and ignored
  72. ++DocIterator;
  73. return setCurrentDocument();
  74. }
  75. TopNode = this->createHNodes(N);
  76. CurrentNode = TopNode.get();
  77. return true;
  78. }
  79. return false;
  80. }
  81. bool Input::nextDocument() {
  82. return ++DocIterator != Strm->end();
  83. }
  84. const Node *Input::getCurrentNode() const {
  85. return CurrentNode ? CurrentNode->_node : nullptr;
  86. }
  87. bool Input::mapTag(StringRef Tag, bool Default) {
  88. std::string foundTag = CurrentNode->_node->getVerbatimTag();
  89. if (foundTag.empty()) {
  90. // If no tag found and 'Tag' is the default, say it was found.
  91. return Default;
  92. }
  93. // Return true iff found tag matches supplied tag.
  94. return Tag.equals(foundTag);
  95. }
  96. void Input::beginMapping() {
  97. if (EC)
  98. return;
  99. // CurrentNode can be null if the document is empty.
  100. MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
  101. if (MN) {
  102. MN->ValidKeys.clear();
  103. }
  104. }
  105. bool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault,
  106. void *&SaveInfo) {
  107. UseDefault = false;
  108. if (EC)
  109. return false;
  110. // CurrentNode is null for empty documents, which is an error in case required
  111. // nodes are present.
  112. if (!CurrentNode) {
  113. if (Required)
  114. EC = make_error_code(errc::invalid_argument);
  115. return false;
  116. }
  117. MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
  118. if (!MN) {
  119. setError(CurrentNode, "not a mapping");
  120. return false;
  121. }
  122. MN->ValidKeys.push_back(Key);
  123. HNode *Value = MN->Mapping[Key].get();
  124. if (!Value) {
  125. if (Required)
  126. setError(CurrentNode, Twine("missing required key '") + Key + "'");
  127. else
  128. UseDefault = true;
  129. return false;
  130. }
  131. SaveInfo = CurrentNode;
  132. CurrentNode = Value;
  133. return true;
  134. }
  135. void Input::postflightKey(void *saveInfo) {
  136. CurrentNode = reinterpret_cast<HNode *>(saveInfo);
  137. }
  138. void Input::endMapping() {
  139. if (EC)
  140. return;
  141. // CurrentNode can be null if the document is empty.
  142. MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
  143. if (!MN)
  144. return;
  145. for (const auto &NN : MN->Mapping) {
  146. if (!MN->isValidKey(NN.first())) {
  147. setError(NN.second.get(), Twine("unknown key '") + NN.first() + "'");
  148. break;
  149. }
  150. }
  151. }
  152. void Input::beginFlowMapping() { beginMapping(); }
  153. void Input::endFlowMapping() { endMapping(); }
  154. unsigned Input::beginSequence() {
  155. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode))
  156. return SQ->Entries.size();
  157. if (isa<EmptyHNode>(CurrentNode))
  158. return 0;
  159. // Treat case where there's a scalar "null" value as an empty sequence.
  160. if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
  161. if (isNull(SN->value()))
  162. return 0;
  163. }
  164. // Any other type of HNode is an error.
  165. setError(CurrentNode, "not a sequence");
  166. return 0;
  167. }
  168. void Input::endSequence() {
  169. }
  170. bool Input::preflightElement(unsigned Index, void *&SaveInfo) {
  171. if (EC)
  172. return false;
  173. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
  174. SaveInfo = CurrentNode;
  175. CurrentNode = SQ->Entries[Index].get();
  176. return true;
  177. }
  178. return false;
  179. }
  180. void Input::postflightElement(void *SaveInfo) {
  181. CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
  182. }
  183. unsigned Input::beginFlowSequence() { return beginSequence(); }
  184. bool Input::preflightFlowElement(unsigned index, void *&SaveInfo) {
  185. if (EC)
  186. return false;
  187. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
  188. SaveInfo = CurrentNode;
  189. CurrentNode = SQ->Entries[index].get();
  190. return true;
  191. }
  192. return false;
  193. }
  194. void Input::postflightFlowElement(void *SaveInfo) {
  195. CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
  196. }
  197. void Input::endFlowSequence() {
  198. }
  199. void Input::beginEnumScalar() {
  200. ScalarMatchFound = false;
  201. }
  202. bool Input::matchEnumScalar(const char *Str, bool) {
  203. if (ScalarMatchFound)
  204. return false;
  205. if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
  206. if (SN->value().equals(Str)) {
  207. ScalarMatchFound = true;
  208. return true;
  209. }
  210. }
  211. return false;
  212. }
  213. bool Input::matchEnumFallback() {
  214. if (ScalarMatchFound)
  215. return false;
  216. ScalarMatchFound = true;
  217. return true;
  218. }
  219. void Input::endEnumScalar() {
  220. if (!ScalarMatchFound) {
  221. setError(CurrentNode, "unknown enumerated scalar");
  222. }
  223. }
  224. bool Input::beginBitSetScalar(bool &DoClear) {
  225. BitValuesUsed.clear();
  226. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
  227. BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false);
  228. } else {
  229. setError(CurrentNode, "expected sequence of bit values");
  230. }
  231. DoClear = true;
  232. return true;
  233. }
  234. bool Input::bitSetMatch(const char *Str, bool) {
  235. if (EC)
  236. return false;
  237. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
  238. unsigned Index = 0;
  239. for (auto &N : SQ->Entries) {
  240. if (ScalarHNode *SN = dyn_cast<ScalarHNode>(N.get())) {
  241. if (SN->value().equals(Str)) {
  242. BitValuesUsed[Index] = true;
  243. return true;
  244. }
  245. } else {
  246. setError(CurrentNode, "unexpected scalar in sequence of bit values");
  247. }
  248. ++Index;
  249. }
  250. } else {
  251. setError(CurrentNode, "expected sequence of bit values");
  252. }
  253. return false;
  254. }
  255. void Input::endBitSetScalar() {
  256. if (EC)
  257. return;
  258. if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
  259. assert(BitValuesUsed.size() == SQ->Entries.size());
  260. for (unsigned i = 0; i < SQ->Entries.size(); ++i) {
  261. if (!BitValuesUsed[i]) {
  262. setError(SQ->Entries[i].get(), "unknown bit value");
  263. return;
  264. }
  265. }
  266. }
  267. }
  268. void Input::scalarString(StringRef &S, bool) {
  269. if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
  270. S = SN->value();
  271. } else {
  272. setError(CurrentNode, "unexpected scalar");
  273. }
  274. }
  275. void Input::blockScalarString(StringRef &S) { scalarString(S, false); }
  276. void Input::setError(HNode *hnode, const Twine &message) {
  277. assert(hnode && "HNode must not be NULL");
  278. this->setError(hnode->_node, message);
  279. }
  280. void Input::setError(Node *node, const Twine &message) {
  281. Strm->printError(node, message);
  282. EC = make_error_code(errc::invalid_argument);
  283. }
  284. std::unique_ptr<Input::HNode> Input::createHNodes(Node *N) {
  285. SmallString<128> StringStorage;
  286. if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) {
  287. StringRef KeyStr = SN->getValue(StringStorage);
  288. if (!StringStorage.empty()) {
  289. // Copy string to permanent storage
  290. unsigned Len = StringStorage.size();
  291. char *Buf = StringAllocator.Allocate<char>(Len);
  292. memcpy(Buf, &StringStorage[0], Len);
  293. KeyStr = StringRef(Buf, Len);
  294. }
  295. return llvm::make_unique<ScalarHNode>(N, KeyStr);
  296. } else if (BlockScalarNode *BSN = dyn_cast<BlockScalarNode>(N)) {
  297. StringRef Value = BSN->getValue();
  298. char *Buf = StringAllocator.Allocate<char>(Value.size());
  299. memcpy(Buf, Value.data(), Value.size());
  300. return llvm::make_unique<ScalarHNode>(N, StringRef(Buf, Value.size()));
  301. } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) {
  302. auto SQHNode = llvm::make_unique<SequenceHNode>(N);
  303. for (Node &SN : *SQ) {
  304. auto Entry = this->createHNodes(&SN);
  305. if (EC)
  306. break;
  307. SQHNode->Entries.push_back(std::move(Entry));
  308. }
  309. return std::move(SQHNode);
  310. } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) {
  311. auto mapHNode = llvm::make_unique<MapHNode>(N);
  312. for (KeyValueNode &KVN : *Map) {
  313. Node *KeyNode = KVN.getKey();
  314. ScalarNode *KeyScalar = dyn_cast<ScalarNode>(KeyNode);
  315. if (!KeyScalar) {
  316. setError(KeyNode, "Map key must be a scalar");
  317. break;
  318. }
  319. StringStorage.clear();
  320. StringRef KeyStr = KeyScalar->getValue(StringStorage);
  321. if (!StringStorage.empty()) {
  322. // Copy string to permanent storage
  323. unsigned Len = StringStorage.size();
  324. char *Buf = StringAllocator.Allocate<char>(Len);
  325. memcpy(Buf, &StringStorage[0], Len);
  326. KeyStr = StringRef(Buf, Len);
  327. }
  328. auto ValueHNode = this->createHNodes(KVN.getValue());
  329. if (EC)
  330. break;
  331. mapHNode->Mapping[KeyStr] = std::move(ValueHNode);
  332. }
  333. return std::move(mapHNode);
  334. } else if (isa<NullNode>(N)) {
  335. return llvm::make_unique<EmptyHNode>(N);
  336. } else {
  337. setError(N, "unknown node kind");
  338. return nullptr;
  339. }
  340. }
  341. bool Input::MapHNode::isValidKey(StringRef Key) {
  342. for (const char *K : ValidKeys) {
  343. if (Key.equals(K))
  344. return true;
  345. }
  346. return false;
  347. }
  348. void Input::setError(const Twine &Message) {
  349. this->setError(CurrentNode, Message);
  350. }
  351. bool Input::canElideEmptySequence() {
  352. return false;
  353. }
  354. //===----------------------------------------------------------------------===//
  355. // Output
  356. //===----------------------------------------------------------------------===//
  357. Output::Output(raw_ostream &yout, void *context, int WrapColumn)
  358. : IO(context),
  359. Out(yout),
  360. WrapColumn(WrapColumn),
  361. Column(0),
  362. ColumnAtFlowStart(0),
  363. ColumnAtMapFlowStart(0),
  364. NeedBitValueComma(false),
  365. NeedFlowSequenceComma(false),
  366. EnumerationMatchFound(false),
  367. NeedsNewLine(false) {
  368. }
  369. Output::~Output() {
  370. }
  371. bool Output::outputting() {
  372. return true;
  373. }
  374. void Output::beginMapping() {
  375. StateStack.push_back(inMapFirstKey);
  376. NeedsNewLine = true;
  377. }
  378. bool Output::mapTag(StringRef Tag, bool Use) {
  379. if (Use) {
  380. this->output(" ");
  381. this->output(Tag);
  382. }
  383. return Use;
  384. }
  385. void Output::endMapping() {
  386. StateStack.pop_back();
  387. }
  388. bool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault,
  389. bool &UseDefault, void *&) {
  390. UseDefault = false;
  391. if (Required || !SameAsDefault) {
  392. auto State = StateStack.back();
  393. if (State == inFlowMapFirstKey || State == inFlowMapOtherKey) {
  394. flowKey(Key);
  395. } else {
  396. this->newLineCheck();
  397. this->paddedKey(Key);
  398. }
  399. return true;
  400. }
  401. return false;
  402. }
  403. void Output::postflightKey(void *) {
  404. if (StateStack.back() == inMapFirstKey) {
  405. StateStack.pop_back();
  406. StateStack.push_back(inMapOtherKey);
  407. } else if (StateStack.back() == inFlowMapFirstKey) {
  408. StateStack.pop_back();
  409. StateStack.push_back(inFlowMapOtherKey);
  410. }
  411. }
  412. void Output::beginFlowMapping() {
  413. StateStack.push_back(inFlowMapFirstKey);
  414. this->newLineCheck();
  415. ColumnAtMapFlowStart = Column;
  416. output("{ ");
  417. }
  418. void Output::endFlowMapping() {
  419. StateStack.pop_back();
  420. this->outputUpToEndOfLine(" }");
  421. }
  422. void Output::beginDocuments() {
  423. this->outputUpToEndOfLine("---");
  424. }
  425. bool Output::preflightDocument(unsigned index) {
  426. if (index > 0)
  427. this->outputUpToEndOfLine("\n---");
  428. return true;
  429. }
  430. void Output::postflightDocument() {
  431. }
  432. void Output::endDocuments() {
  433. output("\n...\n");
  434. }
  435. unsigned Output::beginSequence() {
  436. StateStack.push_back(inSeq);
  437. NeedsNewLine = true;
  438. return 0;
  439. }
  440. void Output::endSequence() {
  441. StateStack.pop_back();
  442. }
  443. bool Output::preflightElement(unsigned, void *&) {
  444. return true;
  445. }
  446. void Output::postflightElement(void *) {
  447. }
  448. unsigned Output::beginFlowSequence() {
  449. StateStack.push_back(inFlowSeq);
  450. this->newLineCheck();
  451. ColumnAtFlowStart = Column;
  452. output("[ ");
  453. NeedFlowSequenceComma = false;
  454. return 0;
  455. }
  456. void Output::endFlowSequence() {
  457. StateStack.pop_back();
  458. this->outputUpToEndOfLine(" ]");
  459. }
  460. bool Output::preflightFlowElement(unsigned, void *&) {
  461. if (NeedFlowSequenceComma)
  462. output(", ");
  463. if (WrapColumn && Column > WrapColumn) {
  464. output("\n");
  465. for (int i = 0; i < ColumnAtFlowStart; ++i)
  466. output(" ");
  467. Column = ColumnAtFlowStart;
  468. output(" ");
  469. }
  470. return true;
  471. }
  472. void Output::postflightFlowElement(void *) {
  473. NeedFlowSequenceComma = true;
  474. }
  475. void Output::beginEnumScalar() {
  476. EnumerationMatchFound = false;
  477. }
  478. bool Output::matchEnumScalar(const char *Str, bool Match) {
  479. if (Match && !EnumerationMatchFound) {
  480. this->newLineCheck();
  481. this->outputUpToEndOfLine(Str);
  482. EnumerationMatchFound = true;
  483. }
  484. return false;
  485. }
  486. bool Output::matchEnumFallback() {
  487. if (EnumerationMatchFound)
  488. return false;
  489. EnumerationMatchFound = true;
  490. return true;
  491. }
  492. void Output::endEnumScalar() {
  493. if (!EnumerationMatchFound)
  494. llvm_unreachable("bad runtime enum value");
  495. }
  496. bool Output::beginBitSetScalar(bool &DoClear) {
  497. this->newLineCheck();
  498. output("[ ");
  499. NeedBitValueComma = false;
  500. DoClear = false;
  501. return true;
  502. }
  503. bool Output::bitSetMatch(const char *Str, bool Matches) {
  504. if (Matches) {
  505. if (NeedBitValueComma)
  506. output(", ");
  507. this->output(Str);
  508. NeedBitValueComma = true;
  509. }
  510. return false;
  511. }
  512. void Output::endBitSetScalar() {
  513. this->outputUpToEndOfLine(" ]");
  514. }
  515. void Output::scalarString(StringRef &S, bool MustQuote) {
  516. this->newLineCheck();
  517. if (S.empty()) {
  518. // Print '' for the empty string because leaving the field empty is not
  519. // allowed.
  520. this->outputUpToEndOfLine("''");
  521. return;
  522. }
  523. if (!MustQuote) {
  524. // Only quote if we must.
  525. this->outputUpToEndOfLine(S);
  526. return;
  527. }
  528. unsigned i = 0;
  529. unsigned j = 0;
  530. unsigned End = S.size();
  531. output("'"); // Starting single quote.
  532. const char *Base = S.data();
  533. while (j < End) {
  534. // Escape a single quote by doubling it.
  535. if (S[j] == '\'') {
  536. output(StringRef(&Base[i], j - i + 1));
  537. output("'");
  538. i = j + 1;
  539. }
  540. ++j;
  541. }
  542. output(StringRef(&Base[i], j - i));
  543. this->outputUpToEndOfLine("'"); // Ending single quote.
  544. }
  545. void Output::blockScalarString(StringRef &S) {
  546. if (!StateStack.empty())
  547. newLineCheck();
  548. output(" |");
  549. outputNewLine();
  550. unsigned Indent = StateStack.empty() ? 1 : StateStack.size();
  551. auto Buffer = MemoryBuffer::getMemBuffer(S, "", false);
  552. for (line_iterator Lines(*Buffer, false); !Lines.is_at_end(); ++Lines) {
  553. for (unsigned I = 0; I < Indent; ++I) {
  554. output(" ");
  555. }
  556. output(*Lines);
  557. outputNewLine();
  558. }
  559. }
  560. void Output::setError(const Twine &message) {
  561. }
  562. bool Output::canElideEmptySequence() {
  563. // Normally, with an optional key/value where the value is an empty sequence,
  564. // the whole key/value can be not written. But, that produces wrong yaml
  565. // if the key/value is the only thing in the map and the map is used in
  566. // a sequence. This detects if the this sequence is the first key/value
  567. // in map that itself is embedded in a sequnce.
  568. if (StateStack.size() < 2)
  569. return true;
  570. if (StateStack.back() != inMapFirstKey)
  571. return true;
  572. return (StateStack[StateStack.size()-2] != inSeq);
  573. }
  574. void Output::output(StringRef s) {
  575. Column += s.size();
  576. Out << s;
  577. }
  578. void Output::outputUpToEndOfLine(StringRef s) {
  579. this->output(s);
  580. if (StateStack.empty() || (StateStack.back() != inFlowSeq &&
  581. StateStack.back() != inFlowMapFirstKey &&
  582. StateStack.back() != inFlowMapOtherKey))
  583. NeedsNewLine = true;
  584. }
  585. void Output::outputNewLine() {
  586. Out << "\n";
  587. Column = 0;
  588. }
  589. // if seq at top, indent as if map, then add "- "
  590. // if seq in middle, use "- " if firstKey, else use " "
  591. //
  592. void Output::newLineCheck() {
  593. if (!NeedsNewLine)
  594. return;
  595. NeedsNewLine = false;
  596. this->outputNewLine();
  597. assert(StateStack.size() > 0);
  598. unsigned Indent = StateStack.size() - 1;
  599. bool OutputDash = false;
  600. if (StateStack.back() == inSeq) {
  601. OutputDash = true;
  602. } else if ((StateStack.size() > 1) && ((StateStack.back() == inMapFirstKey) ||
  603. (StateStack.back() == inFlowSeq) ||
  604. (StateStack.back() == inFlowMapFirstKey)) &&
  605. (StateStack[StateStack.size() - 2] == inSeq)) {
  606. --Indent;
  607. OutputDash = true;
  608. }
  609. for (unsigned i = 0; i < Indent; ++i) {
  610. output(" ");
  611. }
  612. if (OutputDash) {
  613. output("- ");
  614. }
  615. }
  616. void Output::paddedKey(StringRef key) {
  617. output(key);
  618. output(":");
  619. const char *spaces = " ";
  620. if (key.size() < strlen(spaces))
  621. output(&spaces[key.size()]);
  622. else
  623. output(" ");
  624. }
  625. void Output::flowKey(StringRef Key) {
  626. if (StateStack.back() == inFlowMapOtherKey)
  627. output(", ");
  628. if (WrapColumn && Column > WrapColumn) {
  629. output("\n");
  630. for (int I = 0; I < ColumnAtMapFlowStart; ++I)
  631. output(" ");
  632. Column = ColumnAtMapFlowStart;
  633. output(" ");
  634. }
  635. output(Key);
  636. output(": ");
  637. }
  638. //===----------------------------------------------------------------------===//
  639. // traits for built-in types
  640. //===----------------------------------------------------------------------===//
  641. void ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) {
  642. Out << (Val ? "true" : "false");
  643. }
  644. StringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
  645. if (Scalar.equals("true")) {
  646. Val = true;
  647. return StringRef();
  648. } else if (Scalar.equals("false")) {
  649. Val = false;
  650. return StringRef();
  651. }
  652. return "invalid boolean";
  653. }
  654. void ScalarTraits<StringRef>::output(const StringRef &Val, void *,
  655. raw_ostream &Out) {
  656. Out << Val;
  657. }
  658. StringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *,
  659. StringRef &Val) {
  660. Val = Scalar;
  661. return StringRef();
  662. }
  663. void ScalarTraits<std::string>::output(const std::string &Val, void *,
  664. raw_ostream &Out) {
  665. Out << Val;
  666. }
  667. StringRef ScalarTraits<std::string>::input(StringRef Scalar, void *,
  668. std::string &Val) {
  669. Val = Scalar.str();
  670. return StringRef();
  671. }
  672. void ScalarTraits<uint8_t>::output(const uint8_t &Val, void *,
  673. raw_ostream &Out) {
  674. // use temp uin32_t because ostream thinks uint8_t is a character
  675. uint32_t Num = Val;
  676. Out << Num;
  677. }
  678. StringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) {
  679. unsigned long long n;
  680. if (getAsUnsignedInteger(Scalar, 0, n))
  681. return "invalid number";
  682. if (n > 0xFF)
  683. return "out of range number";
  684. Val = n;
  685. return StringRef();
  686. }
  687. void ScalarTraits<uint16_t>::output(const uint16_t &Val, void *,
  688. raw_ostream &Out) {
  689. Out << Val;
  690. }
  691. StringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *,
  692. uint16_t &Val) {
  693. unsigned long long n;
  694. if (getAsUnsignedInteger(Scalar, 0, n))
  695. return "invalid number";
  696. if (n > 0xFFFF)
  697. return "out of range number";
  698. Val = n;
  699. return StringRef();
  700. }
  701. void ScalarTraits<uint32_t>::output(const uint32_t &Val, void *,
  702. raw_ostream &Out) {
  703. Out << Val;
  704. }
  705. StringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *,
  706. uint32_t &Val) {
  707. unsigned long long n;
  708. if (getAsUnsignedInteger(Scalar, 0, n))
  709. return "invalid number";
  710. if (n > 0xFFFFFFFFUL)
  711. return "out of range number";
  712. Val = n;
  713. return StringRef();
  714. }
  715. void ScalarTraits<uint64_t>::output(const uint64_t &Val, void *,
  716. raw_ostream &Out) {
  717. Out << Val;
  718. }
  719. StringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *,
  720. uint64_t &Val) {
  721. unsigned long long N;
  722. if (getAsUnsignedInteger(Scalar, 0, N))
  723. return "invalid number";
  724. Val = N;
  725. return StringRef();
  726. }
  727. void ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) {
  728. // use temp in32_t because ostream thinks int8_t is a character
  729. int32_t Num = Val;
  730. Out << Num;
  731. }
  732. StringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) {
  733. long long N;
  734. if (getAsSignedInteger(Scalar, 0, N))
  735. return "invalid number";
  736. if ((N > 127) || (N < -128))
  737. return "out of range number";
  738. Val = N;
  739. return StringRef();
  740. }
  741. void ScalarTraits<int16_t>::output(const int16_t &Val, void *,
  742. raw_ostream &Out) {
  743. Out << Val;
  744. }
  745. StringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) {
  746. long long N;
  747. if (getAsSignedInteger(Scalar, 0, N))
  748. return "invalid number";
  749. if ((N > INT16_MAX) || (N < INT16_MIN))
  750. return "out of range number";
  751. Val = N;
  752. return StringRef();
  753. }
  754. void ScalarTraits<int32_t>::output(const int32_t &Val, void *,
  755. raw_ostream &Out) {
  756. Out << Val;
  757. }
  758. StringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) {
  759. long long N;
  760. if (getAsSignedInteger(Scalar, 0, N))
  761. return "invalid number";
  762. if ((N > INT32_MAX) || (N < INT32_MIN))
  763. return "out of range number";
  764. Val = N;
  765. return StringRef();
  766. }
  767. void ScalarTraits<int64_t>::output(const int64_t &Val, void *,
  768. raw_ostream &Out) {
  769. Out << Val;
  770. }
  771. StringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) {
  772. long long N;
  773. if (getAsSignedInteger(Scalar, 0, N))
  774. return "invalid number";
  775. Val = N;
  776. return StringRef();
  777. }
  778. void ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {
  779. Out << format("%g", Val);
  780. }
  781. StringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) {
  782. SmallString<32> buff(Scalar.begin(), Scalar.end());
  783. char *end;
  784. Val = strtod(buff.c_str(), &end);
  785. if (*end != '\0')
  786. return "invalid floating point number";
  787. return StringRef();
  788. }
  789. void ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {
  790. Out << format("%g", Val);
  791. }
  792. StringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) {
  793. SmallString<32> buff(Scalar.begin(), Scalar.end());
  794. char *end;
  795. Val = strtod(buff.c_str(), &end);
  796. if (*end != '\0')
  797. return "invalid floating point number";
  798. return StringRef();
  799. }
  800. void ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) {
  801. uint8_t Num = Val;
  802. Out << format("0x%02X", Num);
  803. }
  804. StringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) {
  805. unsigned long long n;
  806. if (getAsUnsignedInteger(Scalar, 0, n))
  807. return "invalid hex8 number";
  808. if (n > 0xFF)
  809. return "out of range hex8 number";
  810. Val = n;
  811. return StringRef();
  812. }
  813. void ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) {
  814. uint16_t Num = Val;
  815. Out << format("0x%04X", Num);
  816. }
  817. StringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) {
  818. unsigned long long n;
  819. if (getAsUnsignedInteger(Scalar, 0, n))
  820. return "invalid hex16 number";
  821. if (n > 0xFFFF)
  822. return "out of range hex16 number";
  823. Val = n;
  824. return StringRef();
  825. }
  826. void ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) {
  827. uint32_t Num = Val;
  828. Out << format("0x%08X", Num);
  829. }
  830. StringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) {
  831. unsigned long long n;
  832. if (getAsUnsignedInteger(Scalar, 0, n))
  833. return "invalid hex32 number";
  834. if (n > 0xFFFFFFFFUL)
  835. return "out of range hex32 number";
  836. Val = n;
  837. return StringRef();
  838. }
  839. void ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) {
  840. uint64_t Num = Val;
  841. Out << format("0x%016llX", Num);
  842. }
  843. StringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) {
  844. unsigned long long Num;
  845. if (getAsUnsignedInteger(Scalar, 0, Num))
  846. return "invalid hex64 number";
  847. Val = Num;
  848. return StringRef();
  849. }