in yaml/scannerc.go [1524:1615]
func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
// Eat '%'.
start_mark := parser.mark
skip(parser)
// Scan the directive name.
var name []byte
if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
return false
}
// Is it a YAML directive?
if bytes.Equal(name, []byte("YAML")) {
// Scan the VERSION directive value.
var major, minor int8
if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
return false
}
end_mark := parser.mark
// Create a VERSION-DIRECTIVE token.
*token = yaml_token_t{
typ: yaml_VERSION_DIRECTIVE_TOKEN,
start_mark: start_mark,
end_mark: end_mark,
major: major,
minor: minor,
}
// Is it a TAG directive?
} else if bytes.Equal(name, []byte("TAG")) {
// Scan the TAG directive value.
var handle, prefix []byte
if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
return false
}
end_mark := parser.mark
// Create a TAG-DIRECTIVE token.
*token = yaml_token_t{
typ: yaml_TAG_DIRECTIVE_TOKEN,
start_mark: start_mark,
end_mark: end_mark,
value: handle,
prefix: prefix,
}
// Unknown directive.
} else {
yaml_parser_set_scanner_error(parser, "while scanning a directive",
start_mark, "found uknown directive name")
return false
}
// Eat the rest of the line including any comments.
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
return false
}
for is_blank(parser.buffer, parser.buffer_pos) {
skip(parser)
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
return false
}
}
if parser.buffer[parser.buffer_pos] == '#' {
for !is_breakz(parser.buffer, parser.buffer_pos) {
skip(parser)
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
return false
}
}
}
// Check if we are at the end of the line.
if !is_breakz(parser.buffer, parser.buffer_pos) {
yaml_parser_set_scanner_error(parser, "while scanning a directive",
start_mark, "did not find expected comment or line break")
return false
}
// Eat a line break.
if is_break(parser.buffer, parser.buffer_pos) {
if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
return false
}
skip_line(parser)
}
return true
}