parser.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374
  1. /*
  2. * The parser implements the following grammar:
  3. *
  4. * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
  5. * implicit_document ::= block_node DOCUMENT-END*
  6. * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
  7. * block_node_or_indentless_sequence ::=
  8. * ALIAS
  9. * | properties (block_content | indentless_block_sequence)?
  10. * | block_content
  11. * | indentless_block_sequence
  12. * block_node ::= ALIAS
  13. * | properties block_content?
  14. * | block_content
  15. * flow_node ::= ALIAS
  16. * | properties flow_content?
  17. * | flow_content
  18. * properties ::= TAG ANCHOR? | ANCHOR TAG?
  19. * block_content ::= block_collection | flow_collection | SCALAR
  20. * flow_content ::= flow_collection | SCALAR
  21. * block_collection ::= block_sequence | block_mapping
  22. * flow_collection ::= flow_sequence | flow_mapping
  23. * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
  24. * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
  25. * block_mapping ::= BLOCK-MAPPING_START
  26. * ((KEY block_node_or_indentless_sequence?)?
  27. * (VALUE block_node_or_indentless_sequence?)?)*
  28. * BLOCK-END
  29. * flow_sequence ::= FLOW-SEQUENCE-START
  30. * (flow_sequence_entry FLOW-ENTRY)*
  31. * flow_sequence_entry?
  32. * FLOW-SEQUENCE-END
  33. * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  34. * flow_mapping ::= FLOW-MAPPING-START
  35. * (flow_mapping_entry FLOW-ENTRY)*
  36. * flow_mapping_entry?
  37. * FLOW-MAPPING-END
  38. * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  39. */
  40. #include "yaml_private.h"
  41. /*
  42. * Peek the next token in the token queue.
  43. */
  44. #define PEEK_TOKEN(parser) \
  45. ((parser->token_available || yaml_parser_fetch_more_tokens(parser)) ? \
  46. parser->tokens.head : NULL)
  47. /*
  48. * Remove the next token from the queue (must be called after PEEK_TOKEN).
  49. */
  50. #define SKIP_TOKEN(parser) \
  51. (parser->token_available = 0, \
  52. parser->tokens_parsed ++, \
  53. parser->stream_end_produced = \
  54. (parser->tokens.head->type == YAML_STREAM_END_TOKEN), \
  55. parser->tokens.head ++)
  56. /*
  57. * Public API declarations.
  58. */
  59. YAML_DECLARE(int)
  60. yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
  61. /*
  62. * Error handling.
  63. */
  64. static int
  65. yaml_parser_set_parser_error(yaml_parser_t *parser,
  66. const char *problem, yaml_mark_t problem_mark);
  67. static int
  68. yaml_parser_set_parser_error_context(yaml_parser_t *parser,
  69. const char *context, yaml_mark_t context_mark,
  70. const char *problem, yaml_mark_t problem_mark);
  71. /*
  72. * State functions.
  73. */
  74. static int
  75. yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event);
  76. static int
  77. yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event);
  78. static int
  79. yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
  80. int implicit);
  81. static int
  82. yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event);
  83. static int
  84. yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event);
  85. static int
  86. yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
  87. int block, int indentless_sequence);
  88. static int
  89. yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
  90. yaml_event_t *event, int first);
  91. static int
  92. yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
  93. yaml_event_t *event);
  94. static int
  95. yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
  96. yaml_event_t *event, int first);
  97. static int
  98. yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
  99. yaml_event_t *event);
  100. static int
  101. yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
  102. yaml_event_t *event, int first);
  103. static int
  104. yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
  105. yaml_event_t *event);
  106. static int
  107. yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
  108. yaml_event_t *event);
  109. static int
  110. yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
  111. yaml_event_t *event);
  112. static int
  113. yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
  114. yaml_event_t *event, int first);
  115. static int
  116. yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
  117. yaml_event_t *event, int empty);
  118. /*
  119. * Utility functions.
  120. */
  121. static int
  122. yaml_parser_process_empty_scalar(yaml_parser_t *parser,
  123. yaml_event_t *event, yaml_mark_t mark);
  124. static int
  125. yaml_parser_process_directives(yaml_parser_t *parser,
  126. yaml_version_directive_t **version_directive_ref,
  127. yaml_tag_directive_t **tag_directives_start_ref,
  128. yaml_tag_directive_t **tag_directives_end_ref);
  129. static int
  130. yaml_parser_append_tag_directive(yaml_parser_t *parser,
  131. yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark);
  132. /*
  133. * Get the next event.
  134. */
  135. YAML_DECLARE(int)
  136. yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event)
  137. {
  138. assert(parser); /* Non-NULL parser object is expected. */
  139. assert(event); /* Non-NULL event object is expected. */
  140. /* Erase the event object. */
  141. memset(event, 0, sizeof(yaml_event_t));
  142. /* No events after the end of the stream or error. */
  143. if (parser->stream_end_produced || parser->error ||
  144. parser->state == YAML_PARSE_END_STATE) {
  145. return 1;
  146. }
  147. /* Generate the next event. */
  148. return yaml_parser_state_machine(parser, event);
  149. }
  150. /*
  151. * Set parser error.
  152. */
  153. static int
  154. yaml_parser_set_parser_error(yaml_parser_t *parser,
  155. const char *problem, yaml_mark_t problem_mark)
  156. {
  157. parser->error = YAML_PARSER_ERROR;
  158. parser->problem = problem;
  159. parser->problem_mark = problem_mark;
  160. return 0;
  161. }
  162. static int
  163. yaml_parser_set_parser_error_context(yaml_parser_t *parser,
  164. const char *context, yaml_mark_t context_mark,
  165. const char *problem, yaml_mark_t problem_mark)
  166. {
  167. parser->error = YAML_PARSER_ERROR;
  168. parser->context = context;
  169. parser->context_mark = context_mark;
  170. parser->problem = problem;
  171. parser->problem_mark = problem_mark;
  172. return 0;
  173. }
  174. /*
  175. * State dispatcher.
  176. */
  177. static int
  178. yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event)
  179. {
  180. switch (parser->state)
  181. {
  182. case YAML_PARSE_STREAM_START_STATE:
  183. return yaml_parser_parse_stream_start(parser, event);
  184. case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
  185. return yaml_parser_parse_document_start(parser, event, 1);
  186. case YAML_PARSE_DOCUMENT_START_STATE:
  187. return yaml_parser_parse_document_start(parser, event, 0);
  188. case YAML_PARSE_DOCUMENT_CONTENT_STATE:
  189. return yaml_parser_parse_document_content(parser, event);
  190. case YAML_PARSE_DOCUMENT_END_STATE:
  191. return yaml_parser_parse_document_end(parser, event);
  192. case YAML_PARSE_BLOCK_NODE_STATE:
  193. return yaml_parser_parse_node(parser, event, 1, 0);
  194. case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
  195. return yaml_parser_parse_node(parser, event, 1, 1);
  196. case YAML_PARSE_FLOW_NODE_STATE:
  197. return yaml_parser_parse_node(parser, event, 0, 0);
  198. case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
  199. return yaml_parser_parse_block_sequence_entry(parser, event, 1);
  200. case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
  201. return yaml_parser_parse_block_sequence_entry(parser, event, 0);
  202. case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
  203. return yaml_parser_parse_indentless_sequence_entry(parser, event);
  204. case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
  205. return yaml_parser_parse_block_mapping_key(parser, event, 1);
  206. case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
  207. return yaml_parser_parse_block_mapping_key(parser, event, 0);
  208. case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
  209. return yaml_parser_parse_block_mapping_value(parser, event);
  210. case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
  211. return yaml_parser_parse_flow_sequence_entry(parser, event, 1);
  212. case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
  213. return yaml_parser_parse_flow_sequence_entry(parser, event, 0);
  214. case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
  215. return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event);
  216. case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
  217. return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event);
  218. case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
  219. return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event);
  220. case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
  221. return yaml_parser_parse_flow_mapping_key(parser, event, 1);
  222. case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
  223. return yaml_parser_parse_flow_mapping_key(parser, event, 0);
  224. case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
  225. return yaml_parser_parse_flow_mapping_value(parser, event, 0);
  226. case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
  227. return yaml_parser_parse_flow_mapping_value(parser, event, 1);
  228. default:
  229. assert(1); /* Invalid state. */
  230. }
  231. return 0;
  232. }
  233. /*
  234. * Parse the production:
  235. * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
  236. * ************
  237. */
  238. static int
  239. yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event)
  240. {
  241. yaml_token_t *token;
  242. token = PEEK_TOKEN(parser);
  243. if (!token) return 0;
  244. if (token->type != YAML_STREAM_START_TOKEN) {
  245. return yaml_parser_set_parser_error(parser,
  246. "did not find expected <stream-start>", token->start_mark);
  247. }
  248. parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
  249. STREAM_START_EVENT_INIT(*event, token->data.stream_start.encoding,
  250. token->start_mark, token->start_mark);
  251. SKIP_TOKEN(parser);
  252. return 1;
  253. }
  254. /*
  255. * Parse the productions:
  256. * implicit_document ::= block_node DOCUMENT-END*
  257. * *
  258. * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
  259. * *************************
  260. */
  261. static int
  262. yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
  263. int implicit)
  264. {
  265. yaml_token_t *token;
  266. yaml_version_directive_t *version_directive = NULL;
  267. struct {
  268. yaml_tag_directive_t *start;
  269. yaml_tag_directive_t *end;
  270. } tag_directives = { NULL, NULL };
  271. token = PEEK_TOKEN(parser);
  272. if (!token) return 0;
  273. /* Parse extra document end indicators. */
  274. if (!implicit)
  275. {
  276. while (token->type == YAML_DOCUMENT_END_TOKEN) {
  277. SKIP_TOKEN(parser);
  278. token = PEEK_TOKEN(parser);
  279. if (!token) return 0;
  280. }
  281. }
  282. /* Parse an implicit document. */
  283. if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
  284. token->type != YAML_TAG_DIRECTIVE_TOKEN &&
  285. token->type != YAML_DOCUMENT_START_TOKEN &&
  286. token->type != YAML_STREAM_END_TOKEN)
  287. {
  288. if (!yaml_parser_process_directives(parser, NULL, NULL, NULL))
  289. return 0;
  290. if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
  291. return 0;
  292. parser->state = YAML_PARSE_BLOCK_NODE_STATE;
  293. DOCUMENT_START_EVENT_INIT(*event, NULL, NULL, NULL, 1,
  294. token->start_mark, token->start_mark);
  295. return 1;
  296. }
  297. /* Parse an explicit document. */
  298. else if (token->type != YAML_STREAM_END_TOKEN)
  299. {
  300. yaml_mark_t start_mark, end_mark;
  301. start_mark = token->start_mark;
  302. if (!yaml_parser_process_directives(parser, &version_directive,
  303. &tag_directives.start, &tag_directives.end))
  304. return 0;
  305. token = PEEK_TOKEN(parser);
  306. if (!token) goto error;
  307. if (token->type != YAML_DOCUMENT_START_TOKEN) {
  308. yaml_parser_set_parser_error(parser,
  309. "did not find expected <document start>", token->start_mark);
  310. goto error;
  311. }
  312. if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
  313. goto error;
  314. parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
  315. end_mark = token->end_mark;
  316. DOCUMENT_START_EVENT_INIT(*event, version_directive,
  317. tag_directives.start, tag_directives.end, 0,
  318. start_mark, end_mark);
  319. SKIP_TOKEN(parser);
  320. version_directive = NULL;
  321. tag_directives.start = tag_directives.end = NULL;
  322. return 1;
  323. }
  324. /* Parse the stream end. */
  325. else
  326. {
  327. parser->state = YAML_PARSE_END_STATE;
  328. STREAM_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
  329. SKIP_TOKEN(parser);
  330. return 1;
  331. }
  332. error:
  333. yaml_free(version_directive);
  334. while (tag_directives.start != tag_directives.end) {
  335. yaml_free(tag_directives.end[-1].handle);
  336. yaml_free(tag_directives.end[-1].prefix);
  337. tag_directives.end --;
  338. }
  339. yaml_free(tag_directives.start);
  340. return 0;
  341. }
  342. /*
  343. * Parse the productions:
  344. * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
  345. * ***********
  346. */
  347. static int
  348. yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event)
  349. {
  350. yaml_token_t *token;
  351. token = PEEK_TOKEN(parser);
  352. if (!token) return 0;
  353. if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
  354. token->type == YAML_TAG_DIRECTIVE_TOKEN ||
  355. token->type == YAML_DOCUMENT_START_TOKEN ||
  356. token->type == YAML_DOCUMENT_END_TOKEN ||
  357. token->type == YAML_STREAM_END_TOKEN) {
  358. parser->state = POP(parser, parser->states);
  359. return yaml_parser_process_empty_scalar(parser, event,
  360. token->start_mark);
  361. }
  362. else {
  363. return yaml_parser_parse_node(parser, event, 1, 0);
  364. }
  365. }
  366. /*
  367. * Parse the productions:
  368. * implicit_document ::= block_node DOCUMENT-END*
  369. * *************
  370. * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
  371. * *************
  372. */
  373. static int
  374. yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event)
  375. {
  376. yaml_token_t *token;
  377. yaml_mark_t start_mark, end_mark;
  378. int implicit = 1;
  379. token = PEEK_TOKEN(parser);
  380. if (!token) return 0;
  381. start_mark = end_mark = token->start_mark;
  382. if (token->type == YAML_DOCUMENT_END_TOKEN) {
  383. end_mark = token->end_mark;
  384. SKIP_TOKEN(parser);
  385. implicit = 0;
  386. }
  387. while (!STACK_EMPTY(parser, parser->tag_directives)) {
  388. yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
  389. yaml_free(tag_directive.handle);
  390. yaml_free(tag_directive.prefix);
  391. }
  392. parser->state = YAML_PARSE_DOCUMENT_START_STATE;
  393. DOCUMENT_END_EVENT_INIT(*event, implicit, start_mark, end_mark);
  394. return 1;
  395. }
  396. /*
  397. * Parse the productions:
  398. * block_node_or_indentless_sequence ::=
  399. * ALIAS
  400. * *****
  401. * | properties (block_content | indentless_block_sequence)?
  402. * ********** *
  403. * | block_content | indentless_block_sequence
  404. * *
  405. * block_node ::= ALIAS
  406. * *****
  407. * | properties block_content?
  408. * ********** *
  409. * | block_content
  410. * *
  411. * flow_node ::= ALIAS
  412. * *****
  413. * | properties flow_content?
  414. * ********** *
  415. * | flow_content
  416. * *
  417. * properties ::= TAG ANCHOR? | ANCHOR TAG?
  418. * *************************
  419. * block_content ::= block_collection | flow_collection | SCALAR
  420. * ******
  421. * flow_content ::= flow_collection | SCALAR
  422. * ******
  423. */
  424. static int
  425. yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
  426. int block, int indentless_sequence)
  427. {
  428. yaml_token_t *token;
  429. yaml_char_t *anchor = NULL;
  430. yaml_char_t *tag_handle = NULL;
  431. yaml_char_t *tag_suffix = NULL;
  432. yaml_char_t *tag = NULL;
  433. yaml_mark_t start_mark, end_mark, tag_mark;
  434. int implicit;
  435. token = PEEK_TOKEN(parser);
  436. if (!token) return 0;
  437. if (token->type == YAML_ALIAS_TOKEN)
  438. {
  439. parser->state = POP(parser, parser->states);
  440. ALIAS_EVENT_INIT(*event, token->data.alias.value,
  441. token->start_mark, token->end_mark);
  442. SKIP_TOKEN(parser);
  443. return 1;
  444. }
  445. else
  446. {
  447. start_mark = end_mark = token->start_mark;
  448. if (token->type == YAML_ANCHOR_TOKEN)
  449. {
  450. anchor = token->data.anchor.value;
  451. start_mark = token->start_mark;
  452. end_mark = token->end_mark;
  453. SKIP_TOKEN(parser);
  454. token = PEEK_TOKEN(parser);
  455. if (!token) goto error;
  456. if (token->type == YAML_TAG_TOKEN)
  457. {
  458. tag_handle = token->data.tag.handle;
  459. tag_suffix = token->data.tag.suffix;
  460. tag_mark = token->start_mark;
  461. end_mark = token->end_mark;
  462. SKIP_TOKEN(parser);
  463. token = PEEK_TOKEN(parser);
  464. if (!token) goto error;
  465. }
  466. }
  467. else if (token->type == YAML_TAG_TOKEN)
  468. {
  469. tag_handle = token->data.tag.handle;
  470. tag_suffix = token->data.tag.suffix;
  471. start_mark = tag_mark = token->start_mark;
  472. end_mark = token->end_mark;
  473. SKIP_TOKEN(parser);
  474. token = PEEK_TOKEN(parser);
  475. if (!token) goto error;
  476. if (token->type == YAML_ANCHOR_TOKEN)
  477. {
  478. anchor = token->data.anchor.value;
  479. end_mark = token->end_mark;
  480. SKIP_TOKEN(parser);
  481. token = PEEK_TOKEN(parser);
  482. if (!token) goto error;
  483. }
  484. }
  485. if (tag_handle) {
  486. if (!*tag_handle) {
  487. tag = tag_suffix;
  488. yaml_free(tag_handle);
  489. tag_handle = tag_suffix = NULL;
  490. }
  491. else {
  492. yaml_tag_directive_t *tag_directive;
  493. for (tag_directive = parser->tag_directives.start;
  494. tag_directive != parser->tag_directives.top;
  495. tag_directive ++) {
  496. if (strcmp((char *)tag_directive->handle, (char *)tag_handle) == 0) {
  497. size_t prefix_len = strlen((char *)tag_directive->prefix);
  498. size_t suffix_len = strlen((char *)tag_suffix);
  499. tag = yaml_malloc(prefix_len+suffix_len+1);
  500. if (!tag) {
  501. parser->error = YAML_MEMORY_ERROR;
  502. goto error;
  503. }
  504. memcpy(tag, tag_directive->prefix, prefix_len);
  505. memcpy(tag+prefix_len, tag_suffix, suffix_len);
  506. tag[prefix_len+suffix_len] = '\0';
  507. yaml_free(tag_handle);
  508. yaml_free(tag_suffix);
  509. tag_handle = tag_suffix = NULL;
  510. break;
  511. }
  512. }
  513. if (!tag) {
  514. yaml_parser_set_parser_error_context(parser,
  515. "while parsing a node", start_mark,
  516. "found undefined tag handle", tag_mark);
  517. goto error;
  518. }
  519. }
  520. }
  521. implicit = (!tag || !*tag);
  522. if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
  523. end_mark = token->end_mark;
  524. parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
  525. SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
  526. YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
  527. return 1;
  528. }
  529. else {
  530. if (token->type == YAML_SCALAR_TOKEN) {
  531. int plain_implicit = 0;
  532. int quoted_implicit = 0;
  533. end_mark = token->end_mark;
  534. if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
  535. || (tag && strcmp((char *)tag, "!") == 0)) {
  536. plain_implicit = 1;
  537. }
  538. else if (!tag) {
  539. quoted_implicit = 1;
  540. }
  541. parser->state = POP(parser, parser->states);
  542. SCALAR_EVENT_INIT(*event, anchor, tag,
  543. token->data.scalar.value, token->data.scalar.length,
  544. plain_implicit, quoted_implicit,
  545. token->data.scalar.style, start_mark, end_mark);
  546. SKIP_TOKEN(parser);
  547. return 1;
  548. }
  549. else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
  550. end_mark = token->end_mark;
  551. parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
  552. SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
  553. YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
  554. return 1;
  555. }
  556. else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
  557. end_mark = token->end_mark;
  558. parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
  559. MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
  560. YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
  561. return 1;
  562. }
  563. else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
  564. end_mark = token->end_mark;
  565. parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
  566. SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
  567. YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
  568. return 1;
  569. }
  570. else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
  571. end_mark = token->end_mark;
  572. parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
  573. MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
  574. YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
  575. return 1;
  576. }
  577. else if (anchor || tag) {
  578. yaml_char_t *value = yaml_malloc(1);
  579. if (!value) {
  580. parser->error = YAML_MEMORY_ERROR;
  581. goto error;
  582. }
  583. value[0] = '\0';
  584. parser->state = POP(parser, parser->states);
  585. SCALAR_EVENT_INIT(*event, anchor, tag, value, 0,
  586. implicit, 0, YAML_PLAIN_SCALAR_STYLE,
  587. start_mark, end_mark);
  588. return 1;
  589. }
  590. else {
  591. yaml_parser_set_parser_error_context(parser,
  592. (block ? "while parsing a block node"
  593. : "while parsing a flow node"), start_mark,
  594. "did not find expected node content", token->start_mark);
  595. goto error;
  596. }
  597. }
  598. }
  599. error:
  600. yaml_free(anchor);
  601. yaml_free(tag_handle);
  602. yaml_free(tag_suffix);
  603. yaml_free(tag);
  604. return 0;
  605. }
  606. /*
  607. * Parse the productions:
  608. * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
  609. * ******************** *********** * *********
  610. */
  611. static int
  612. yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
  613. yaml_event_t *event, int first)
  614. {
  615. yaml_token_t *token;
  616. if (first) {
  617. token = PEEK_TOKEN(parser);
  618. if (!PUSH(parser, parser->marks, token->start_mark))
  619. return 0;
  620. SKIP_TOKEN(parser);
  621. }
  622. token = PEEK_TOKEN(parser);
  623. if (!token) return 0;
  624. if (token->type == YAML_BLOCK_ENTRY_TOKEN)
  625. {
  626. yaml_mark_t mark = token->end_mark;
  627. SKIP_TOKEN(parser);
  628. token = PEEK_TOKEN(parser);
  629. if (!token) return 0;
  630. if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
  631. token->type != YAML_BLOCK_END_TOKEN) {
  632. if (!PUSH(parser, parser->states,
  633. YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
  634. return 0;
  635. return yaml_parser_parse_node(parser, event, 1, 0);
  636. }
  637. else {
  638. parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
  639. return yaml_parser_process_empty_scalar(parser, event, mark);
  640. }
  641. }
  642. else if (token->type == YAML_BLOCK_END_TOKEN)
  643. {
  644. yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */
  645. parser->state = POP(parser, parser->states);
  646. dummy_mark = POP(parser, parser->marks);
  647. SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
  648. SKIP_TOKEN(parser);
  649. return 1;
  650. }
  651. else
  652. {
  653. return yaml_parser_set_parser_error_context(parser,
  654. "while parsing a block collection", POP(parser, parser->marks),
  655. "did not find expected '-' indicator", token->start_mark);
  656. }
  657. }
  658. /*
  659. * Parse the productions:
  660. * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
  661. * *********** *
  662. */
  663. static int
  664. yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
  665. yaml_event_t *event)
  666. {
  667. yaml_token_t *token;
  668. token = PEEK_TOKEN(parser);
  669. if (!token) return 0;
  670. if (token->type == YAML_BLOCK_ENTRY_TOKEN)
  671. {
  672. yaml_mark_t mark = token->end_mark;
  673. SKIP_TOKEN(parser);
  674. token = PEEK_TOKEN(parser);
  675. if (!token) return 0;
  676. if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
  677. token->type != YAML_KEY_TOKEN &&
  678. token->type != YAML_VALUE_TOKEN &&
  679. token->type != YAML_BLOCK_END_TOKEN) {
  680. if (!PUSH(parser, parser->states,
  681. YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
  682. return 0;
  683. return yaml_parser_parse_node(parser, event, 1, 0);
  684. }
  685. else {
  686. parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
  687. return yaml_parser_process_empty_scalar(parser, event, mark);
  688. }
  689. }
  690. else
  691. {
  692. parser->state = POP(parser, parser->states);
  693. SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
  694. return 1;
  695. }
  696. }
  697. /*
  698. * Parse the productions:
  699. * block_mapping ::= BLOCK-MAPPING_START
  700. * *******************
  701. * ((KEY block_node_or_indentless_sequence?)?
  702. * *** *
  703. * (VALUE block_node_or_indentless_sequence?)?)*
  704. *
  705. * BLOCK-END
  706. * *********
  707. */
  708. static int
  709. yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
  710. yaml_event_t *event, int first)
  711. {
  712. yaml_token_t *token;
  713. if (first) {
  714. token = PEEK_TOKEN(parser);
  715. if (!PUSH(parser, parser->marks, token->start_mark))
  716. return 0;
  717. SKIP_TOKEN(parser);
  718. }
  719. token = PEEK_TOKEN(parser);
  720. if (!token) return 0;
  721. if (token->type == YAML_KEY_TOKEN)
  722. {
  723. yaml_mark_t mark = token->end_mark;
  724. SKIP_TOKEN(parser);
  725. token = PEEK_TOKEN(parser);
  726. if (!token) return 0;
  727. if (token->type != YAML_KEY_TOKEN &&
  728. token->type != YAML_VALUE_TOKEN &&
  729. token->type != YAML_BLOCK_END_TOKEN) {
  730. if (!PUSH(parser, parser->states,
  731. YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
  732. return 0;
  733. return yaml_parser_parse_node(parser, event, 1, 1);
  734. }
  735. else {
  736. parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
  737. return yaml_parser_process_empty_scalar(parser, event, mark);
  738. }
  739. }
  740. else if (token->type == YAML_BLOCK_END_TOKEN)
  741. {
  742. yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */
  743. parser->state = POP(parser, parser->states);
  744. dummy_mark = POP(parser, parser->marks);
  745. MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
  746. SKIP_TOKEN(parser);
  747. return 1;
  748. }
  749. else
  750. {
  751. return yaml_parser_set_parser_error_context(parser,
  752. "while parsing a block mapping", POP(parser, parser->marks),
  753. "did not find expected key", token->start_mark);
  754. }
  755. }
  756. /*
  757. * Parse the productions:
  758. * block_mapping ::= BLOCK-MAPPING_START
  759. *
  760. * ((KEY block_node_or_indentless_sequence?)?
  761. *
  762. * (VALUE block_node_or_indentless_sequence?)?)*
  763. * ***** *
  764. * BLOCK-END
  765. *
  766. */
  767. static int
  768. yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
  769. yaml_event_t *event)
  770. {
  771. yaml_token_t *token;
  772. token = PEEK_TOKEN(parser);
  773. if (!token) return 0;
  774. if (token->type == YAML_VALUE_TOKEN)
  775. {
  776. yaml_mark_t mark = token->end_mark;
  777. SKIP_TOKEN(parser);
  778. token = PEEK_TOKEN(parser);
  779. if (!token) return 0;
  780. if (token->type != YAML_KEY_TOKEN &&
  781. token->type != YAML_VALUE_TOKEN &&
  782. token->type != YAML_BLOCK_END_TOKEN) {
  783. if (!PUSH(parser, parser->states,
  784. YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
  785. return 0;
  786. return yaml_parser_parse_node(parser, event, 1, 1);
  787. }
  788. else {
  789. parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
  790. return yaml_parser_process_empty_scalar(parser, event, mark);
  791. }
  792. }
  793. else
  794. {
  795. parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
  796. return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
  797. }
  798. }
  799. /*
  800. * Parse the productions:
  801. * flow_sequence ::= FLOW-SEQUENCE-START
  802. * *******************
  803. * (flow_sequence_entry FLOW-ENTRY)*
  804. * * **********
  805. * flow_sequence_entry?
  806. * *
  807. * FLOW-SEQUENCE-END
  808. * *****************
  809. * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  810. * *
  811. */
  812. static int
  813. yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
  814. yaml_event_t *event, int first)
  815. {
  816. yaml_token_t *token;
  817. yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */
  818. if (first) {
  819. token = PEEK_TOKEN(parser);
  820. if (!PUSH(parser, parser->marks, token->start_mark))
  821. return 0;
  822. SKIP_TOKEN(parser);
  823. }
  824. token = PEEK_TOKEN(parser);
  825. if (!token) return 0;
  826. if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
  827. {
  828. if (!first) {
  829. if (token->type == YAML_FLOW_ENTRY_TOKEN) {
  830. SKIP_TOKEN(parser);
  831. token = PEEK_TOKEN(parser);
  832. if (!token) return 0;
  833. }
  834. else {
  835. return yaml_parser_set_parser_error_context(parser,
  836. "while parsing a flow sequence", POP(parser, parser->marks),
  837. "did not find expected ',' or ']'", token->start_mark);
  838. }
  839. }
  840. if (token->type == YAML_KEY_TOKEN) {
  841. parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
  842. MAPPING_START_EVENT_INIT(*event, NULL, NULL,
  843. 1, YAML_FLOW_MAPPING_STYLE,
  844. token->start_mark, token->end_mark);
  845. SKIP_TOKEN(parser);
  846. return 1;
  847. }
  848. else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
  849. if (!PUSH(parser, parser->states,
  850. YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
  851. return 0;
  852. return yaml_parser_parse_node(parser, event, 0, 0);
  853. }
  854. }
  855. parser->state = POP(parser, parser->states);
  856. dummy_mark = POP(parser, parser->marks);
  857. SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
  858. SKIP_TOKEN(parser);
  859. return 1;
  860. }
  861. /*
  862. * Parse the productions:
  863. * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  864. * *** *
  865. */
  866. static int
  867. yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
  868. yaml_event_t *event)
  869. {
  870. yaml_token_t *token;
  871. token = PEEK_TOKEN(parser);
  872. if (!token) return 0;
  873. if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
  874. && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
  875. if (!PUSH(parser, parser->states,
  876. YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
  877. return 0;
  878. return yaml_parser_parse_node(parser, event, 0, 0);
  879. }
  880. else {
  881. yaml_mark_t mark = token->end_mark;
  882. SKIP_TOKEN(parser);
  883. parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
  884. return yaml_parser_process_empty_scalar(parser, event, mark);
  885. }
  886. }
  887. /*
  888. * Parse the productions:
  889. * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  890. * ***** *
  891. */
  892. static int
  893. yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
  894. yaml_event_t *event)
  895. {
  896. yaml_token_t *token;
  897. token = PEEK_TOKEN(parser);
  898. if (!token) return 0;
  899. if (token->type == YAML_VALUE_TOKEN) {
  900. SKIP_TOKEN(parser);
  901. token = PEEK_TOKEN(parser);
  902. if (!token) return 0;
  903. if (token->type != YAML_FLOW_ENTRY_TOKEN
  904. && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
  905. if (!PUSH(parser, parser->states,
  906. YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
  907. return 0;
  908. return yaml_parser_parse_node(parser, event, 0, 0);
  909. }
  910. }
  911. parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
  912. return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
  913. }
  914. /*
  915. * Parse the productions:
  916. * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  917. * *
  918. */
  919. static int
  920. yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
  921. yaml_event_t *event)
  922. {
  923. yaml_token_t *token;
  924. token = PEEK_TOKEN(parser);
  925. if (!token) return 0;
  926. parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
  927. MAPPING_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
  928. return 1;
  929. }
  930. /*
  931. * Parse the productions:
  932. * flow_mapping ::= FLOW-MAPPING-START
  933. * ******************
  934. * (flow_mapping_entry FLOW-ENTRY)*
  935. * * **********
  936. * flow_mapping_entry?
  937. * ******************
  938. * FLOW-MAPPING-END
  939. * ****************
  940. * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  941. * * *** *
  942. */
  943. static int
  944. yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
  945. yaml_event_t *event, int first)
  946. {
  947. yaml_token_t *token;
  948. yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */
  949. if (first) {
  950. token = PEEK_TOKEN(parser);
  951. if (!PUSH(parser, parser->marks, token->start_mark))
  952. return 0;
  953. SKIP_TOKEN(parser);
  954. }
  955. token = PEEK_TOKEN(parser);
  956. if (!token) return 0;
  957. if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
  958. {
  959. if (!first) {
  960. if (token->type == YAML_FLOW_ENTRY_TOKEN) {
  961. SKIP_TOKEN(parser);
  962. token = PEEK_TOKEN(parser);
  963. if (!token) return 0;
  964. }
  965. else {
  966. return yaml_parser_set_parser_error_context(parser,
  967. "while parsing a flow mapping", POP(parser, parser->marks),
  968. "did not find expected ',' or '}'", token->start_mark);
  969. }
  970. }
  971. if (token->type == YAML_KEY_TOKEN) {
  972. SKIP_TOKEN(parser);
  973. token = PEEK_TOKEN(parser);
  974. if (!token) return 0;
  975. if (token->type != YAML_VALUE_TOKEN
  976. && token->type != YAML_FLOW_ENTRY_TOKEN
  977. && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
  978. if (!PUSH(parser, parser->states,
  979. YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
  980. return 0;
  981. return yaml_parser_parse_node(parser, event, 0, 0);
  982. }
  983. else {
  984. parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
  985. return yaml_parser_process_empty_scalar(parser, event,
  986. token->start_mark);
  987. }
  988. }
  989. else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
  990. if (!PUSH(parser, parser->states,
  991. YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
  992. return 0;
  993. return yaml_parser_parse_node(parser, event, 0, 0);
  994. }
  995. }
  996. parser->state = POP(parser, parser->states);
  997. dummy_mark = POP(parser, parser->marks);
  998. MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
  999. SKIP_TOKEN(parser);
  1000. return 1;
  1001. }
  1002. /*
  1003. * Parse the productions:
  1004. * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
  1005. * * ***** *
  1006. */
  1007. static int
  1008. yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
  1009. yaml_event_t *event, int empty)
  1010. {
  1011. yaml_token_t *token;
  1012. token = PEEK_TOKEN(parser);
  1013. if (!token) return 0;
  1014. if (empty) {
  1015. parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
  1016. return yaml_parser_process_empty_scalar(parser, event,
  1017. token->start_mark);
  1018. }
  1019. if (token->type == YAML_VALUE_TOKEN) {
  1020. SKIP_TOKEN(parser);
  1021. token = PEEK_TOKEN(parser);
  1022. if (!token) return 0;
  1023. if (token->type != YAML_FLOW_ENTRY_TOKEN
  1024. && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
  1025. if (!PUSH(parser, parser->states,
  1026. YAML_PARSE_FLOW_MAPPING_KEY_STATE))
  1027. return 0;
  1028. return yaml_parser_parse_node(parser, event, 0, 0);
  1029. }
  1030. }
  1031. parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
  1032. return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
  1033. }
  1034. /*
  1035. * Generate an empty scalar event.
  1036. */
  1037. static int
  1038. yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_event_t *event,
  1039. yaml_mark_t mark)
  1040. {
  1041. yaml_char_t *value;
  1042. value = yaml_malloc(1);
  1043. if (!value) {
  1044. parser->error = YAML_MEMORY_ERROR;
  1045. return 0;
  1046. }
  1047. value[0] = '\0';
  1048. SCALAR_EVENT_INIT(*event, NULL, NULL, value, 0,
  1049. 1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
  1050. return 1;
  1051. }
  1052. /*
  1053. * Parse directives.
  1054. */
  1055. static int
  1056. yaml_parser_process_directives(yaml_parser_t *parser,
  1057. yaml_version_directive_t **version_directive_ref,
  1058. yaml_tag_directive_t **tag_directives_start_ref,
  1059. yaml_tag_directive_t **tag_directives_end_ref)
  1060. {
  1061. yaml_tag_directive_t default_tag_directives[] = {
  1062. {(yaml_char_t *)"!", (yaml_char_t *)"!"},
  1063. {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
  1064. {NULL, NULL}
  1065. };
  1066. yaml_tag_directive_t *default_tag_directive;
  1067. yaml_version_directive_t *version_directive = NULL;
  1068. struct {
  1069. yaml_tag_directive_t *start;
  1070. yaml_tag_directive_t *end;
  1071. yaml_tag_directive_t *top;
  1072. } tag_directives = { NULL, NULL, NULL };
  1073. yaml_token_t *token;
  1074. if (!STACK_INIT(parser, tag_directives, INITIAL_STACK_SIZE))
  1075. goto error;
  1076. token = PEEK_TOKEN(parser);
  1077. if (!token) goto error;
  1078. while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
  1079. token->type == YAML_TAG_DIRECTIVE_TOKEN)
  1080. {
  1081. if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
  1082. if (version_directive) {
  1083. yaml_parser_set_parser_error(parser,
  1084. "found duplicate %YAML directive", token->start_mark);
  1085. goto error;
  1086. }
  1087. if (token->data.version_directive.major != 1
  1088. || token->data.version_directive.minor != 1) {
  1089. yaml_parser_set_parser_error(parser,
  1090. "found incompatible YAML document", token->start_mark);
  1091. goto error;
  1092. }
  1093. version_directive = yaml_malloc(sizeof(yaml_version_directive_t));
  1094. if (!version_directive) {
  1095. parser->error = YAML_MEMORY_ERROR;
  1096. goto error;
  1097. }
  1098. version_directive->major = token->data.version_directive.major;
  1099. version_directive->minor = token->data.version_directive.minor;
  1100. }
  1101. else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
  1102. yaml_tag_directive_t value;
  1103. value.handle = token->data.tag_directive.handle;
  1104. value.prefix = token->data.tag_directive.prefix;
  1105. if (!yaml_parser_append_tag_directive(parser, value, 0,
  1106. token->start_mark))
  1107. goto error;
  1108. if (!PUSH(parser, tag_directives, value))
  1109. goto error;
  1110. }
  1111. SKIP_TOKEN(parser);
  1112. token = PEEK_TOKEN(parser);
  1113. if (!token) goto error;
  1114. }
  1115. for (default_tag_directive = default_tag_directives;
  1116. default_tag_directive->handle; default_tag_directive++) {
  1117. if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
  1118. token->start_mark))
  1119. goto error;
  1120. }
  1121. if (version_directive_ref) {
  1122. *version_directive_ref = version_directive;
  1123. }
  1124. if (tag_directives_start_ref) {
  1125. if (STACK_EMPTY(parser, tag_directives)) {
  1126. *tag_directives_start_ref = *tag_directives_end_ref = NULL;
  1127. STACK_DEL(parser, tag_directives);
  1128. }
  1129. else {
  1130. *tag_directives_start_ref = tag_directives.start;
  1131. *tag_directives_end_ref = tag_directives.top;
  1132. }
  1133. }
  1134. else {
  1135. STACK_DEL(parser, tag_directives);
  1136. }
  1137. return 1;
  1138. error:
  1139. yaml_free(version_directive);
  1140. while (!STACK_EMPTY(parser, tag_directives)) {
  1141. yaml_tag_directive_t tag_directive = POP(parser, tag_directives);
  1142. yaml_free(tag_directive.handle);
  1143. yaml_free(tag_directive.prefix);
  1144. }
  1145. STACK_DEL(parser, tag_directives);
  1146. return 0;
  1147. }
  1148. /*
  1149. * Append a tag directive to the directives stack.
  1150. */
  1151. static int
  1152. yaml_parser_append_tag_directive(yaml_parser_t *parser,
  1153. yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark)
  1154. {
  1155. yaml_tag_directive_t *tag_directive;
  1156. yaml_tag_directive_t copy = { NULL, NULL };
  1157. for (tag_directive = parser->tag_directives.start;
  1158. tag_directive != parser->tag_directives.top; tag_directive ++) {
  1159. if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
  1160. if (allow_duplicates)
  1161. return 1;
  1162. return yaml_parser_set_parser_error(parser,
  1163. "found duplicate %TAG directive", mark);
  1164. }
  1165. }
  1166. copy.handle = yaml_strdup(value.handle);
  1167. copy.prefix = yaml_strdup(value.prefix);
  1168. if (!copy.handle || !copy.prefix) {
  1169. parser->error = YAML_MEMORY_ERROR;
  1170. goto error;
  1171. }
  1172. if (!PUSH(parser, parser->tag_directives, copy))
  1173. goto error;
  1174. return 1;
  1175. error:
  1176. yaml_free(copy.handle);
  1177. yaml_free(copy.prefix);
  1178. return 0;
  1179. }