chore: checkpoint before Python removal

This commit is contained in:
2026-03-26 22:33:59 +00:00
parent 683cec9307
commit e568ddf82a
29972 changed files with 11269302 additions and 2 deletions

View File

@@ -0,0 +1 @@
{"files":{".cargo_vcs_info.json":"2f25a2f0a9219a94054a8bee687eef1430c00cdbd872e45a8a17dcb59a5d500f",".github/FUNDING.yml":"b017158736b3c9751a2d21edfce7fe61c8954e2fced8da8dd3013c2f3e295bd9",".github/workflows/ci.yml":"82765992c7dde8d040bf0025b76123eac4b829e7f3c7dd1b66b7d83c7bb38459","Cargo.lock":"6e429a80cac66efa4259473d80702a35e4b25a6101b9c42e896a7c495486e0b3","Cargo.toml":"39d7eb7914105623a7baa0e953d82d8c4bb31e40f613e7e413e22c85f652bc69","Cargo.toml.orig":"f40bae96bb3f595170fbdf1feb222fd88978f517276ca49a0c4d1a6bb6443ce3","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"ad60144882a003bb1f20a3bf286e518c8335f0301e7d06c101ef1bd5668e11dd","src/api.rs":"85b2fd0cf09ec7560e0a58215a05af3f44a4403bcf0c1eb91603ec149d67dfc0","src/bin/cstr/mod.rs":"ea7d6c8c1376c7cae56afc2ed365d16e5aabe6a0dda06e01954b90bb7ba8d038","src/bin/run-emitter-test-suite.rs":"a7e2c21524a5a88c68d4193a2f2ed49ed7d30e4aa1f868ec570e8c81274a721e","src/bin/run-parser-test-suite.rs":"62390b5be838cb94c078024187274978290789df4f82144aabfca0c653fbb1b0","src/dumper.rs":"984cbb2187095856bac9d0ec3612634d69db76a16800e02e873a89d6f9dbcc2e","src/emitter.rs":"e2e5741bad8714f1772f83c77d7bf9b793763808aedc19cf6afd6b50983ac8da","src/lib.rs":"fbd23c6a81736d761301f7efec14962989e327e308ce1c9302c518e8c33faf45","src/loader.rs":"a4b1def1986adace844b499bedd568bdf3ec0bbeceab02e42808d848d89a4115","src/macros.rs":"fb383fe61179b9bdbc77da57539b8211d7b7bc6775b6d7ce7d0d75249f63508a","src/ops.rs":"9716b7e16a430e7b45f3196e9659fa369fcda4e5117e18d2595f8ea75ce2340d","src/parser.rs":"27125c0a61b3df054b726a574ed883954ba8afbb91680dd371f4faff0dddd4b7","src/reader.rs":"3cff2f6aea01188f2d8ea8c6b210c5831b4316fed16ed96b0f3d79da048fb297","src/scanner.rs":"e6c5301c9c4a83d266ec0477e0f7e2522cee6038413b9bd3f50049b5e0491ff4","src/success.rs":"f1fe294ed595c7c5cf82cc113e6debbe970129878794ab1f1a5aab77e08f99f4","src/writer.rs":"9ce5f7fcaeaae73bcde9a7d8022dfbace4e8eb1867461d6b8af1f42688494dcb","src/yaml.rs":"fd8d05d2a23611e071833a9ddf71fcbc8b8cbff038fb326790e4ffa001083227","tests/bin/mod.rs":"8b159a2bcfc7c59e18f1e2378959797384cca307b6a2b6940af79e26b27ea988","tests/ignorelist/libyaml-emitter":"3cdaa69d21c87bb3988536cf95747547793a5875e374cfe91c0b12fb2eaf2c15","tests/ignorelist/libyaml-parser":"60cf936e4e2acfd34ad397fab1c004c79f5bce7778eba2c5e89f1cf2478f6008","tests/ignorelist/libyaml-parser-error":"e57811f1660f02e7a58dd9394d0121b8ba8b8e3ba0553b906b82536bcdb80edf","tests/test_emitter.rs":"f49a1161370571c1ca9ad8a6c0bd21e7086c013a349eae2d121e7612b8d28222","tests/test_parser.rs":"0e33a9d27fb4b9d6c6f854f7bfd54d37cf8f6a049253226edbb2a0e0e674295a","tests/test_parser_error.rs":"bb0db7534704a7317bb1f987eaaac0852633f47e979c0cf00720cac5cea3bdf3"},"package":"673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"}

View File

@@ -0,0 +1,6 @@
{
"git": {
"sha1": "a7b8d1fbd93aefbca3003dcb5fcc6a9c2297e968"
},
"path_in_vcs": ""
}

View File

@@ -0,0 +1 @@
github: dtolnay

View File

@@ -0,0 +1,109 @@
name: CI
on:
push:
pull_request:
workflow_dispatch:
schedule: [cron: "40 1 * * *"]
permissions:
contents: read
env:
RUSTFLAGS: -Dwarnings
jobs:
pre_ci:
uses: dtolnay/.github/.github/workflows/pre_ci.yml@master
test:
name: Rust ${{matrix.rust}}
needs: pre_ci
if: needs.pre_ci.outputs.continue
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
rust: [nightly, beta, stable, 1.63.0]
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{matrix.rust}}
- name: Enable type layout randomization
run: echo RUSTFLAGS=${RUSTFLAGS}\ -Zrandomize-layout >> $GITHUB_ENV
if: matrix.rust == 'nightly'
- run: cargo test
msrv:
name: Rust 1.56.0
needs: pre_ci
if: needs.pre_ci.outputs.continue
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.56.0
- run: cargo check --lib
doc:
name: Documentation
needs: pre_ci
if: needs.pre_ci.outputs.continue
runs-on: ubuntu-latest
timeout-minutes: 45
env:
RUSTDOCFLAGS: -Dwarnings
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: dtolnay/install@cargo-docs-rs
- run: cargo docs-rs
clippy:
name: Clippy
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@clippy
- run: cargo clippy --tests -- -Dclippy::all -Dclippy::pedantic
miri:
name: Miri
needs: pre_ci
if: needs.pre_ci.outputs.continue
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@miri
- run: cargo miri setup
- run: cargo miri test
env:
MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-strict-provenance
fuzz:
name: Fuzz
needs: pre_ci
if: needs.pre_ci.outputs.continue
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: dtolnay/install@cargo-fuzz
- run: cargo fuzz check
outdated:
name: Outdated
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: dtolnay/install@cargo-outdated
- run: cargo outdated --workspace --exit-code 1
- run: cargo outdated --manifest-path fuzz/Cargo.toml --exit-code 1

32
vendor/unsafe-libyaml/Cargo.lock generated vendored Normal file
View File

@@ -0,0 +1,32 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]]
name = "pretty_assertions"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
"diff",
"yansi",
]
[[package]]
name = "unsafe-libyaml"
version = "0.2.11"
dependencies = [
"pretty_assertions",
]
[[package]]
name = "yansi"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"

38
vendor/unsafe-libyaml/Cargo.toml vendored Normal file
View File

@@ -0,0 +1,38 @@
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2021"
rust-version = "1.56"
name = "unsafe-libyaml"
version = "0.2.11"
authors = ["David Tolnay <dtolnay@gmail.com>"]
description = "libyaml transpiled to rust by c2rust"
documentation = "https://docs.rs/unsafe-libyaml"
readme = "README.md"
keywords = ["yaml"]
categories = [
"encoding",
"parser-implementations",
"no-std",
]
license = "MIT"
repository = "https://github.com/dtolnay/unsafe-libyaml"
[package.metadata.docs.rs]
rustdoc-args = ["--generate-link-to-definition"]
targets = ["x86_64-unknown-linux-gnu"]
[lib]
doc-scrape-examples = false
[dev-dependencies.pretty_assertions]
version = "1.0"

23
vendor/unsafe-libyaml/LICENSE-MIT vendored Normal file
View File

@@ -0,0 +1,23 @@
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

24
vendor/unsafe-libyaml/README.md vendored Normal file
View File

@@ -0,0 +1,24 @@
unsafe-libyaml
==============
[<img alt="github" src="https://img.shields.io/badge/github-dtolnay/unsafe--libyaml-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/unsafe-libyaml)
[<img alt="crates.io" src="https://img.shields.io/crates/v/unsafe-libyaml.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/unsafe-libyaml)
[<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-unsafe--libyaml-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs" height="20">](https://docs.rs/unsafe-libyaml)
[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/dtolnay/unsafe-libyaml/ci.yml?branch=master&style=for-the-badge" height="20">](https://github.com/dtolnay/unsafe-libyaml/actions?query=branch%3Amaster)
This library is [libyaml] translated from C to unsafe Rust with the assistance
of [c2rust].
[libyaml]: https://github.com/yaml/libyaml/tree/2c891fc7a770e8ba2fec34fc6b545c672beb37e6
[c2rust]: https://github.com/immunant/c2rust
```toml
[dependencies]
unsafe-libyaml = "0.2"
```
*Compiler support: requires rustc 1.56+*
## License
<a href="LICENSE-MIT">MIT license</a>, same as libyaml.

1549
vendor/unsafe-libyaml/src/api.rs vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
use std::fmt::{self, Display, Write as _};
use std::slice;
use std::str;
#[allow(non_camel_case_types)]
type c_char = i8;
pub struct CStr {
ptr: *const u8,
}
impl CStr {
pub unsafe fn from_ptr(ptr: *const c_char) -> Self {
CStr { ptr: ptr.cast() }
}
}
impl Display for CStr {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let len = unsafe { strlen(self.ptr) };
let mut bytes = unsafe { slice::from_raw_parts(self.ptr, len) };
loop {
match str::from_utf8(bytes) {
Ok(valid) => return formatter.write_str(valid),
Err(utf8_error) => {
let valid_up_to = utf8_error.valid_up_to();
let valid = unsafe { str::from_utf8_unchecked(&bytes[..valid_up_to]) };
formatter.write_str(valid)?;
formatter.write_char(char::REPLACEMENT_CHARACTER)?;
if let Some(error_len) = utf8_error.error_len() {
bytes = &bytes[valid_up_to + error_len..];
} else {
return Ok(());
}
}
}
}
}
}
unsafe fn strlen(s: *const u8) -> usize {
let mut end = s;
while *end != 0 {
end = end.add(1);
}
end.offset_from(s) as usize
}

View File

@@ -0,0 +1,307 @@
#![warn(clippy::pedantic)]
#![allow(
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_sign_loss,
clippy::items_after_statements,
clippy::let_underscore_untyped,
clippy::missing_errors_doc,
clippy::missing_safety_doc,
clippy::ptr_as_ptr,
clippy::single_match_else,
clippy::too_many_lines,
clippy::unreadable_literal
)]
mod cstr;
use self::cstr::CStr;
use std::env;
use std::error::Error;
use std::ffi::c_void;
use std::fs::File;
use std::io::{self, Read, Write};
use std::mem::MaybeUninit;
use std::process::{self, ExitCode};
use std::ptr::{self, addr_of_mut};
use std::slice;
use unsafe_libyaml::{
yaml_alias_event_initialize, yaml_document_end_event_initialize,
yaml_document_start_event_initialize, yaml_emitter_delete, yaml_emitter_emit,
yaml_emitter_initialize, yaml_emitter_set_canonical, yaml_emitter_set_output,
yaml_emitter_set_unicode, yaml_emitter_t, yaml_event_t, yaml_mapping_end_event_initialize,
yaml_mapping_start_event_initialize, yaml_scalar_event_initialize, yaml_scalar_style_t,
yaml_sequence_end_event_initialize, yaml_sequence_start_event_initialize,
yaml_stream_end_event_initialize, yaml_stream_start_event_initialize, yaml_tag_directive_t,
yaml_version_directive_t, YAML_ANY_SCALAR_STYLE, YAML_BLOCK_MAPPING_STYLE,
YAML_BLOCK_SEQUENCE_STYLE, YAML_DOUBLE_QUOTED_SCALAR_STYLE, YAML_EMITTER_ERROR,
YAML_FOLDED_SCALAR_STYLE, YAML_LITERAL_SCALAR_STYLE, YAML_MEMORY_ERROR,
YAML_PLAIN_SCALAR_STYLE, YAML_SINGLE_QUOTED_SCALAR_STYLE, YAML_UTF8_ENCODING,
YAML_WRITER_ERROR,
};
pub(crate) unsafe fn unsafe_main(
stdin: &mut dyn Read,
mut stdout: &mut dyn Write,
) -> Result<(), Box<dyn Error>> {
let mut emitter = MaybeUninit::<yaml_emitter_t>::uninit();
let emitter = emitter.as_mut_ptr();
if yaml_emitter_initialize(emitter).fail {
return Err("Could not initialize the emitter object".into());
}
unsafe fn write_to_stdio(data: *mut c_void, buffer: *mut u8, size: u64) -> i32 {
let stdout: *mut &mut dyn Write = data.cast();
let bytes = slice::from_raw_parts(buffer.cast(), size as usize);
match (*stdout).write(bytes) {
Ok(n) => n as i32,
Err(_) => 0,
}
}
yaml_emitter_set_output(emitter, write_to_stdio, addr_of_mut!(stdout).cast());
yaml_emitter_set_canonical(emitter, false);
yaml_emitter_set_unicode(emitter, false);
let mut buf = ReadBuf::new();
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let result = loop {
let line = match buf.get_line(stdin) {
Some(line) => line,
None => break Ok(()),
};
let mut anchor = [0u8; 256];
let mut tag = [0u8; 256];
let result = if line.starts_with(b"+STR") {
yaml_stream_start_event_initialize(event, YAML_UTF8_ENCODING)
} else if line.starts_with(b"-STR") {
yaml_stream_end_event_initialize(event)
} else if line.starts_with(b"+DOC") {
let implicit = !line[4..].starts_with(b" ---");
yaml_document_start_event_initialize(
event,
ptr::null_mut::<yaml_version_directive_t>(),
ptr::null_mut::<yaml_tag_directive_t>(),
ptr::null_mut::<yaml_tag_directive_t>(),
implicit,
)
} else if line.starts_with(b"-DOC") {
let implicit = !line[4..].starts_with(b" ...");
yaml_document_end_event_initialize(event, implicit)
} else if line.starts_with(b"+MAP") {
yaml_mapping_start_event_initialize(
event,
get_anchor(b'&', line, anchor.as_mut_ptr()),
get_tag(line, tag.as_mut_ptr()),
false,
YAML_BLOCK_MAPPING_STYLE,
)
} else if line.starts_with(b"-MAP") {
yaml_mapping_end_event_initialize(event)
} else if line.starts_with(b"+SEQ") {
yaml_sequence_start_event_initialize(
event,
get_anchor(b'&', line, anchor.as_mut_ptr()),
get_tag(line, tag.as_mut_ptr()),
false,
YAML_BLOCK_SEQUENCE_STYLE,
)
} else if line.starts_with(b"-SEQ") {
yaml_sequence_end_event_initialize(event)
} else if line.starts_with(b"=VAL") {
let mut value = [0i8; 1024];
let mut style = YAML_ANY_SCALAR_STYLE;
get_value(line, value.as_mut_ptr(), &mut style);
let implicit = get_tag(line, tag.as_mut_ptr()).is_null();
yaml_scalar_event_initialize(
event,
get_anchor(b'&', line, anchor.as_mut_ptr()),
get_tag(line, tag.as_mut_ptr()),
value.as_mut_ptr() as *mut u8,
-1,
implicit,
implicit,
style,
)
} else if line.starts_with(b"=ALI") {
yaml_alias_event_initialize(event, get_anchor(b'*', line, anchor.as_mut_ptr()))
} else {
let line = line as *mut [u8] as *mut i8;
break Err(format!("Unknown event: '{}'", CStr::from_ptr(line)).into());
};
if result.fail {
break Err("Memory error: Not enough memory for creating an event".into());
}
if yaml_emitter_emit(emitter, event).fail {
break Err(match (*emitter).error {
YAML_MEMORY_ERROR => "Memory error: Not enough memory for emitting".into(),
YAML_WRITER_ERROR => {
format!("Writer error: {}", CStr::from_ptr((*emitter).problem)).into()
}
YAML_EMITTER_ERROR => {
format!("Emitter error: {}", CStr::from_ptr((*emitter).problem)).into()
}
// Couldn't happen.
_ => "Internal error".into(),
});
}
};
yaml_emitter_delete(emitter);
result
}
struct ReadBuf {
buf: [u8; 1024],
offset: usize,
filled: usize,
}
impl ReadBuf {
fn new() -> Self {
ReadBuf {
buf: [0; 1024],
offset: 0,
filled: 0,
}
}
fn get_line(&mut self, input: &mut dyn Read) -> Option<&mut [u8]> {
loop {
for i in self.offset..self.offset + self.filled {
if self.buf[i] == b'\n' {
self.buf[i] = b'\0';
let line = &mut self.buf[self.offset..=i];
self.offset = i + 1;
self.filled -= line.len();
return Some(line);
}
}
let mut remainder = &mut self.buf[self.offset + self.filled..];
if remainder.is_empty() {
if self.offset == 0 {
let _ = writeln!(
io::stderr(),
"Line too long: '{}'",
String::from_utf8_lossy(&self.buf),
);
process::abort();
}
self.buf.copy_within(self.offset.., 0);
self.offset = 0;
remainder = &mut self.buf;
}
let n = input.read(remainder).ok()?;
self.filled += n;
if n == 0 {
return None;
}
}
}
}
unsafe fn get_anchor(sigil: u8, line: &[u8], anchor: *mut u8) -> *mut u8 {
let start = match line.iter().position(|ch| *ch == sigil) {
Some(offset) => offset + 1,
None => return ptr::null_mut::<u8>(),
};
let end = match line[start..].iter().position(|ch| *ch == b' ') {
Some(offset) => start + offset,
None => line.len(),
};
ptr::copy_nonoverlapping(line[start..end].as_ptr(), anchor, end - start);
*anchor.add(end - start) = b'\0';
anchor
}
unsafe fn get_tag(line: &[u8], tag: *mut u8) -> *mut u8 {
let start = match line.iter().position(|ch| *ch == b'<') {
Some(offset) => offset + 1,
None => return ptr::null_mut::<u8>(),
};
let end = match line[start..].iter().position(|ch| *ch == b'>') {
Some(offset) => start + offset,
None => return ptr::null_mut::<u8>(),
};
ptr::copy_nonoverlapping(line[start..end].as_ptr(), tag, end - start);
*tag.add(end - start) = b'\0';
tag
}
unsafe fn get_value(line: &[u8], value: *mut i8, style: *mut yaml_scalar_style_t) {
let line_len = line.len();
let line = line as *const [u8] as *mut i8;
let mut start = ptr::null_mut::<i8>();
let end = line.add(line_len);
let mut c = line.offset(4);
while c < end {
if *c as u8 == b' ' {
start = c.offset(1);
*style = match *start as u8 {
b':' => YAML_PLAIN_SCALAR_STYLE,
b'\'' => YAML_SINGLE_QUOTED_SCALAR_STYLE,
b'"' => YAML_DOUBLE_QUOTED_SCALAR_STYLE,
b'|' => YAML_LITERAL_SCALAR_STYLE,
b'>' => YAML_FOLDED_SCALAR_STYLE,
_ => {
start = ptr::null_mut::<i8>();
c = c.offset(1);
continue;
}
};
start = start.offset(1);
break;
}
c = c.offset(1);
}
if start.is_null() {
process::abort();
}
let mut i = 0;
c = start;
while c < end {
*value.offset(i) = if *c as u8 == b'\\' {
c = c.offset(1);
match *c as u8 {
b'\\' => b'\\' as i8,
b'0' => b'\0' as i8,
b'b' => b'\x08' as i8,
b'n' => b'\n' as i8,
b'r' => b'\r' as i8,
b't' => b'\t' as i8,
_ => process::abort(),
}
} else {
*c
};
i += 1;
c = c.offset(1);
}
*value.offset(i) = b'\0' as i8;
}
fn main() -> ExitCode {
let args = env::args_os().skip(1);
if args.len() == 0 {
let _ = writeln!(
io::stderr(),
"Usage: run-emitter-test-suite <test.event>...",
);
return ExitCode::FAILURE;
}
for arg in args {
let mut stdin = File::open(arg).unwrap();
let mut stdout = io::stdout();
let result = unsafe { unsafe_main(&mut stdin, &mut stdout) };
if let Err(err) = result {
let _ = writeln!(io::stderr(), "{}", err);
return ExitCode::FAILURE;
}
}
ExitCode::SUCCESS
}

View File

@@ -0,0 +1,222 @@
#![warn(clippy::pedantic)]
#![allow(
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_sign_loss,
clippy::items_after_statements,
clippy::let_underscore_untyped,
clippy::missing_errors_doc,
clippy::missing_safety_doc,
clippy::too_many_lines
)]
mod cstr;
use self::cstr::CStr;
use std::env;
use std::error::Error;
use std::ffi::c_void;
use std::fmt::Write as _;
use std::fs::File;
use std::io::{self, Read, Write};
use std::mem::MaybeUninit;
use std::process::{self, ExitCode};
use std::ptr::addr_of_mut;
use std::slice;
use unsafe_libyaml::{
yaml_event_delete, yaml_event_t, yaml_event_type_t, yaml_parser_delete, yaml_parser_initialize,
yaml_parser_parse, yaml_parser_set_input, yaml_parser_t, YAML_ALIAS_EVENT,
YAML_DOCUMENT_END_EVENT, YAML_DOCUMENT_START_EVENT, YAML_DOUBLE_QUOTED_SCALAR_STYLE,
YAML_FOLDED_SCALAR_STYLE, YAML_LITERAL_SCALAR_STYLE, YAML_MAPPING_END_EVENT,
YAML_MAPPING_START_EVENT, YAML_NO_EVENT, YAML_PLAIN_SCALAR_STYLE, YAML_SCALAR_EVENT,
YAML_SEQUENCE_END_EVENT, YAML_SEQUENCE_START_EVENT, YAML_SINGLE_QUOTED_SCALAR_STYLE,
YAML_STREAM_END_EVENT, YAML_STREAM_START_EVENT,
};
pub(crate) unsafe fn unsafe_main(
mut stdin: &mut dyn Read,
stdout: &mut dyn Write,
) -> Result<(), Box<dyn Error>> {
let mut parser = MaybeUninit::<yaml_parser_t>::uninit();
let parser = parser.as_mut_ptr();
if yaml_parser_initialize(parser).fail {
return Err("Could not initialize the parser object".into());
}
unsafe fn read_from_stdio(
data: *mut c_void,
buffer: *mut u8,
size: u64,
size_read: *mut u64,
) -> i32 {
let stdin: *mut &mut dyn Read = data.cast();
let slice = slice::from_raw_parts_mut(buffer.cast(), size as usize);
match (*stdin).read(slice) {
Ok(n) => {
*size_read = n as u64;
1
}
Err(_) => 0,
}
}
yaml_parser_set_input(parser, read_from_stdio, addr_of_mut!(stdin).cast());
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
loop {
if yaml_parser_parse(parser, event).fail {
let mut error = format!("Parse error: {}", CStr::from_ptr((*parser).problem));
if (*parser).problem_mark.line != 0 || (*parser).problem_mark.column != 0 {
let _ = write!(
error,
"\nLine: {} Column: {}",
((*parser).problem_mark.line).wrapping_add(1_u64),
((*parser).problem_mark.column).wrapping_add(1_u64),
);
}
yaml_parser_delete(parser);
return Err(error.into());
}
let type_: yaml_event_type_t = (*event).type_;
if type_ == YAML_NO_EVENT {
let _ = writeln!(stdout, "???");
} else if type_ == YAML_STREAM_START_EVENT {
let _ = writeln!(stdout, "+STR");
} else if type_ == YAML_STREAM_END_EVENT {
let _ = writeln!(stdout, "-STR");
} else if type_ == YAML_DOCUMENT_START_EVENT {
let _ = write!(stdout, "+DOC");
if !(*event).data.document_start.implicit {
let _ = write!(stdout, " ---");
}
let _ = writeln!(stdout);
} else if type_ == YAML_DOCUMENT_END_EVENT {
let _ = write!(stdout, "-DOC");
if !(*event).data.document_end.implicit {
let _ = write!(stdout, " ...");
}
let _ = writeln!(stdout);
} else if type_ == YAML_MAPPING_START_EVENT {
let _ = write!(stdout, "+MAP");
if !(*event).data.mapping_start.anchor.is_null() {
let _ = write!(
stdout,
" &{}",
CStr::from_ptr((*event).data.mapping_start.anchor as *const i8),
);
}
if !(*event).data.mapping_start.tag.is_null() {
let _ = write!(
stdout,
" <{}>",
CStr::from_ptr((*event).data.mapping_start.tag as *const i8),
);
}
let _ = writeln!(stdout);
} else if type_ == YAML_MAPPING_END_EVENT {
let _ = writeln!(stdout, "-MAP");
} else if type_ == YAML_SEQUENCE_START_EVENT {
let _ = write!(stdout, "+SEQ");
if !(*event).data.sequence_start.anchor.is_null() {
let _ = write!(
stdout,
" &{}",
CStr::from_ptr((*event).data.sequence_start.anchor as *const i8),
);
}
if !(*event).data.sequence_start.tag.is_null() {
let _ = write!(
stdout,
" <{}>",
CStr::from_ptr((*event).data.sequence_start.tag as *const i8),
);
}
let _ = writeln!(stdout);
} else if type_ == YAML_SEQUENCE_END_EVENT {
let _ = writeln!(stdout, "-SEQ");
} else if type_ == YAML_SCALAR_EVENT {
let _ = write!(stdout, "=VAL");
if !(*event).data.scalar.anchor.is_null() {
let _ = write!(
stdout,
" &{}",
CStr::from_ptr((*event).data.scalar.anchor as *const i8),
);
}
if !(*event).data.scalar.tag.is_null() {
let _ = write!(
stdout,
" <{}>",
CStr::from_ptr((*event).data.scalar.tag as *const i8),
);
}
let _ = stdout.write_all(match (*event).data.scalar.style {
YAML_PLAIN_SCALAR_STYLE => b" :",
YAML_SINGLE_QUOTED_SCALAR_STYLE => b" '",
YAML_DOUBLE_QUOTED_SCALAR_STYLE => b" \"",
YAML_LITERAL_SCALAR_STYLE => b" |",
YAML_FOLDED_SCALAR_STYLE => b" >",
_ => process::abort(),
});
print_escaped(
stdout,
(*event).data.scalar.value,
(*event).data.scalar.length,
);
let _ = writeln!(stdout);
} else if type_ == YAML_ALIAS_EVENT {
let _ = writeln!(
stdout,
"=ALI *{}",
CStr::from_ptr((*event).data.alias.anchor as *const i8),
);
} else {
process::abort();
}
yaml_event_delete(event);
if type_ == YAML_STREAM_END_EVENT {
break;
}
}
yaml_parser_delete(parser);
Ok(())
}
unsafe fn print_escaped(stdout: &mut dyn Write, mut str: *mut u8, length: u64) {
let end = str.offset(length as isize);
while str < end {
let repr = match &*str {
b'\\' => b"\\\\",
b'\0' => b"\\0",
b'\x08' => b"\\b",
b'\n' => b"\\n",
b'\r' => b"\\r",
b'\t' => b"\\t",
c => slice::from_ref(c),
};
let _ = stdout.write_all(repr);
str = str.offset(1);
}
}
fn main() -> ExitCode {
let args = env::args_os().skip(1);
if args.len() == 0 {
let _ = writeln!(io::stderr(), "Usage: run-parser-test-suite <in.yaml>...");
return ExitCode::FAILURE;
}
for arg in args {
let mut stdin = File::open(arg).unwrap();
let mut stdout = io::stdout();
let result = unsafe { unsafe_main(&mut stdin, &mut stdout) };
if let Err(err) = result {
let _ = writeln!(io::stderr(), "{}", err);
return ExitCode::FAILURE;
}
}
ExitCode::SUCCESS
}

450
vendor/unsafe-libyaml/src/dumper.rs vendored Normal file
View File

@@ -0,0 +1,450 @@
use crate::api::{yaml_free, yaml_malloc};
use crate::externs::{memset, strcmp};
use crate::fmt::WriteToPtr;
use crate::ops::ForceMul as _;
use crate::success::{Success, FAIL, OK};
use crate::yaml::{
yaml_anchors_t, yaml_char_t, yaml_document_t, yaml_emitter_t, yaml_event_t, yaml_mark_t,
yaml_node_item_t, yaml_node_pair_t, yaml_node_t, YAML_ALIAS_EVENT, YAML_ANY_ENCODING,
YAML_DOCUMENT_END_EVENT, YAML_DOCUMENT_START_EVENT, YAML_MAPPING_END_EVENT, YAML_MAPPING_NODE,
YAML_MAPPING_START_EVENT, YAML_SCALAR_EVENT, YAML_SCALAR_NODE, YAML_SEQUENCE_END_EVENT,
YAML_SEQUENCE_NODE, YAML_SEQUENCE_START_EVENT, YAML_STREAM_END_EVENT, YAML_STREAM_START_EVENT,
};
use crate::{libc, yaml_document_delete, yaml_emitter_emit, PointerExt};
use core::mem::{size_of, MaybeUninit};
use core::ptr::{self, addr_of_mut};
/// Start a YAML stream.
///
/// This function should be used before yaml_emitter_dump() is called.
pub unsafe fn yaml_emitter_open(emitter: *mut yaml_emitter_t) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
__assert!(!emitter.is_null());
__assert!(!(*emitter).opened);
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_STREAM_START_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.stream_start.encoding = YAML_ANY_ENCODING;
if yaml_emitter_emit(emitter, event).fail {
return FAIL;
}
(*emitter).opened = true;
OK
}
/// Finish a YAML stream.
///
/// This function should be used after yaml_emitter_dump() is called.
pub unsafe fn yaml_emitter_close(emitter: *mut yaml_emitter_t) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
__assert!(!emitter.is_null());
__assert!((*emitter).opened);
if (*emitter).closed {
return OK;
}
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_STREAM_END_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
if yaml_emitter_emit(emitter, event).fail {
return FAIL;
}
(*emitter).closed = true;
OK
}
/// Emit a YAML document.
///
/// The document object may be generated using the yaml_parser_load() function or
/// the yaml_document_initialize() function. The emitter takes the
/// responsibility for the document object and destroys its content after it is
/// emitted. The document object is destroyed even if the function fails.
pub unsafe fn yaml_emitter_dump(
emitter: *mut yaml_emitter_t,
document: *mut yaml_document_t,
) -> Success {
let current_block: u64;
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
__assert!(!emitter.is_null());
__assert!(!document.is_null());
let fresh0 = addr_of_mut!((*emitter).document);
*fresh0 = document;
if !(*emitter).opened {
if yaml_emitter_open(emitter).fail {
current_block = 5018439318894558507;
} else {
current_block = 15619007995458559411;
}
} else {
current_block = 15619007995458559411;
}
match current_block {
15619007995458559411 => {
if STACK_EMPTY!((*document).nodes) {
if yaml_emitter_close(emitter).ok {
yaml_emitter_delete_document_and_anchors(emitter);
return OK;
}
} else {
__assert!((*emitter).opened);
let fresh1 = addr_of_mut!((*emitter).anchors);
*fresh1 = yaml_malloc(
(size_of::<yaml_anchors_t>() as libc::c_ulong)
.force_mul((*document).nodes.top.c_offset_from((*document).nodes.start)
as libc::c_ulong),
) as *mut yaml_anchors_t;
memset(
(*emitter).anchors as *mut libc::c_void,
0,
(size_of::<yaml_anchors_t>() as libc::c_ulong)
.force_mul((*document).nodes.top.c_offset_from((*document).nodes.start)
as libc::c_ulong),
);
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_DOCUMENT_START_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.document_start.version_directive = (*document).version_directive;
(*event).data.document_start.tag_directives.start =
(*document).tag_directives.start;
(*event).data.document_start.tag_directives.end = (*document).tag_directives.end;
(*event).data.document_start.implicit = (*document).start_implicit;
if yaml_emitter_emit(emitter, event).ok {
yaml_emitter_anchor_node(emitter, 1);
if yaml_emitter_dump_node(emitter, 1).ok {
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_DOCUMENT_END_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.document_end.implicit = (*document).end_implicit;
if yaml_emitter_emit(emitter, event).ok {
yaml_emitter_delete_document_and_anchors(emitter);
return OK;
}
}
}
}
}
_ => {}
}
yaml_emitter_delete_document_and_anchors(emitter);
FAIL
}
unsafe fn yaml_emitter_delete_document_and_anchors(emitter: *mut yaml_emitter_t) {
let mut index: libc::c_int;
if (*emitter).anchors.is_null() {
yaml_document_delete((*emitter).document);
let fresh2 = addr_of_mut!((*emitter).document);
*fresh2 = ptr::null_mut::<yaml_document_t>();
return;
}
index = 0;
while (*(*emitter).document)
.nodes
.start
.wrapping_offset(index as isize)
< (*(*emitter).document).nodes.top
{
let mut node: yaml_node_t = *(*(*emitter).document)
.nodes
.start
.wrapping_offset(index as isize);
if !(*(*emitter).anchors.wrapping_offset(index as isize)).serialized {
yaml_free(node.tag as *mut libc::c_void);
if node.type_ == YAML_SCALAR_NODE {
yaml_free(node.data.scalar.value as *mut libc::c_void);
}
}
if node.type_ == YAML_SEQUENCE_NODE {
STACK_DEL!(node.data.sequence.items);
}
if node.type_ == YAML_MAPPING_NODE {
STACK_DEL!(node.data.mapping.pairs);
}
index += 1;
}
STACK_DEL!((*(*emitter).document).nodes);
yaml_free((*emitter).anchors as *mut libc::c_void);
let fresh6 = addr_of_mut!((*emitter).anchors);
*fresh6 = ptr::null_mut::<yaml_anchors_t>();
(*emitter).last_anchor_id = 0;
let fresh7 = addr_of_mut!((*emitter).document);
*fresh7 = ptr::null_mut::<yaml_document_t>();
}
unsafe fn yaml_emitter_anchor_node_sub(emitter: *mut yaml_emitter_t, index: libc::c_int) {
(*((*emitter).anchors).offset((index - 1) as isize)).references += 1;
if (*(*emitter).anchors.offset((index - 1) as isize)).references == 2 {
(*emitter).last_anchor_id += 1;
(*(*emitter).anchors.offset((index - 1) as isize)).anchor = (*emitter).last_anchor_id;
}
}
unsafe fn yaml_emitter_anchor_node(emitter: *mut yaml_emitter_t, index: libc::c_int) {
let node: *mut yaml_node_t = (*(*emitter).document)
.nodes
.start
.wrapping_offset(index as isize)
.wrapping_offset(-1_isize);
let mut item: *mut yaml_node_item_t;
let mut pair: *mut yaml_node_pair_t;
let fresh8 =
addr_of_mut!((*((*emitter).anchors).wrapping_offset((index - 1) as isize)).references);
*fresh8 += 1;
if (*(*emitter).anchors.wrapping_offset((index - 1) as isize)).references == 1 {
match (*node).type_ {
YAML_SEQUENCE_NODE => {
item = (*node).data.sequence.items.start;
while item < (*node).data.sequence.items.top {
yaml_emitter_anchor_node_sub(emitter, *item);
item = item.wrapping_offset(1);
}
}
YAML_MAPPING_NODE => {
pair = (*node).data.mapping.pairs.start;
while pair < (*node).data.mapping.pairs.top {
yaml_emitter_anchor_node_sub(emitter, (*pair).key);
yaml_emitter_anchor_node_sub(emitter, (*pair).value);
pair = pair.wrapping_offset(1);
}
}
_ => {}
}
} else if (*(*emitter).anchors.wrapping_offset((index - 1) as isize)).references == 2 {
let fresh9 = addr_of_mut!((*emitter).last_anchor_id);
*fresh9 += 1;
(*(*emitter).anchors.wrapping_offset((index - 1) as isize)).anchor = *fresh9;
}
}
unsafe fn yaml_emitter_generate_anchor(
_emitter: *mut yaml_emitter_t,
anchor_id: libc::c_int,
) -> *mut yaml_char_t {
let anchor: *mut yaml_char_t = yaml_malloc(16_u64) as *mut yaml_char_t;
write!(WriteToPtr::new(anchor), "id{:03}\0", anchor_id);
anchor
}
unsafe fn yaml_emitter_dump_node(emitter: *mut yaml_emitter_t, index: libc::c_int) -> Success {
let node: *mut yaml_node_t = (*(*emitter).document)
.nodes
.start
.wrapping_offset(index as isize)
.wrapping_offset(-1_isize);
let anchor_id: libc::c_int = (*(*emitter).anchors.wrapping_offset((index - 1) as isize)).anchor;
let mut anchor: *mut yaml_char_t = ptr::null_mut::<yaml_char_t>();
if anchor_id != 0 {
anchor = yaml_emitter_generate_anchor(emitter, anchor_id);
}
if (*(*emitter).anchors.wrapping_offset((index - 1) as isize)).serialized {
return yaml_emitter_dump_alias(emitter, anchor);
}
(*(*emitter).anchors.wrapping_offset((index - 1) as isize)).serialized = true;
match (*node).type_ {
YAML_SCALAR_NODE => yaml_emitter_dump_scalar(emitter, node, anchor),
YAML_SEQUENCE_NODE => yaml_emitter_dump_sequence(emitter, node, anchor),
YAML_MAPPING_NODE => yaml_emitter_dump_mapping(emitter, node, anchor),
_ => __assert!(false),
}
}
unsafe fn yaml_emitter_dump_alias(
emitter: *mut yaml_emitter_t,
anchor: *mut yaml_char_t,
) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_ALIAS_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.alias.anchor = anchor;
yaml_emitter_emit(emitter, event)
}
unsafe fn yaml_emitter_dump_scalar(
emitter: *mut yaml_emitter_t,
node: *mut yaml_node_t,
anchor: *mut yaml_char_t,
) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
let plain_implicit = strcmp(
(*node).tag as *mut libc::c_char,
b"tag:yaml.org,2002:str\0" as *const u8 as *const libc::c_char,
) == 0;
let quoted_implicit = strcmp(
(*node).tag as *mut libc::c_char,
b"tag:yaml.org,2002:str\0" as *const u8 as *const libc::c_char,
) == 0;
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_SCALAR_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.scalar.anchor = anchor;
(*event).data.scalar.tag = (*node).tag;
(*event).data.scalar.value = (*node).data.scalar.value;
(*event).data.scalar.length = (*node).data.scalar.length;
(*event).data.scalar.plain_implicit = plain_implicit;
(*event).data.scalar.quoted_implicit = quoted_implicit;
(*event).data.scalar.style = (*node).data.scalar.style;
yaml_emitter_emit(emitter, event)
}
unsafe fn yaml_emitter_dump_sequence(
emitter: *mut yaml_emitter_t,
node: *mut yaml_node_t,
anchor: *mut yaml_char_t,
) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
let implicit = strcmp(
(*node).tag as *mut libc::c_char,
b"tag:yaml.org,2002:seq\0" as *const u8 as *const libc::c_char,
) == 0;
let mut item: *mut yaml_node_item_t;
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_SEQUENCE_START_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.sequence_start.anchor = anchor;
(*event).data.sequence_start.tag = (*node).tag;
(*event).data.sequence_start.implicit = implicit;
(*event).data.sequence_start.style = (*node).data.sequence.style;
if yaml_emitter_emit(emitter, event).fail {
return FAIL;
}
item = (*node).data.sequence.items.start;
while item < (*node).data.sequence.items.top {
if yaml_emitter_dump_node(emitter, *item).fail {
return FAIL;
}
item = item.wrapping_offset(1);
}
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_SEQUENCE_END_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
yaml_emitter_emit(emitter, event)
}
unsafe fn yaml_emitter_dump_mapping(
emitter: *mut yaml_emitter_t,
node: *mut yaml_node_t,
anchor: *mut yaml_char_t,
) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
let mark = yaml_mark_t {
index: 0_u64,
line: 0_u64,
column: 0_u64,
};
let implicit = strcmp(
(*node).tag as *mut libc::c_char,
b"tag:yaml.org,2002:map\0" as *const u8 as *const libc::c_char,
) == 0;
let mut pair: *mut yaml_node_pair_t;
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_MAPPING_START_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
(*event).data.mapping_start.anchor = anchor;
(*event).data.mapping_start.tag = (*node).tag;
(*event).data.mapping_start.implicit = implicit;
(*event).data.mapping_start.style = (*node).data.mapping.style;
if yaml_emitter_emit(emitter, event).fail {
return FAIL;
}
pair = (*node).data.mapping.pairs.start;
while pair < (*node).data.mapping.pairs.top {
if yaml_emitter_dump_node(emitter, (*pair).key).fail {
return FAIL;
}
if yaml_emitter_dump_node(emitter, (*pair).value).fail {
return FAIL;
}
pair = pair.wrapping_offset(1);
}
memset(
event as *mut libc::c_void,
0,
size_of::<yaml_event_t>() as libc::c_ulong,
);
(*event).type_ = YAML_MAPPING_END_EVENT;
(*event).start_mark = mark;
(*event).end_mark = mark;
yaml_emitter_emit(emitter, event)
}

2376
vendor/unsafe-libyaml/src/emitter.rs vendored Normal file

File diff suppressed because it is too large Load Diff

324
vendor/unsafe-libyaml/src/lib.rs vendored Normal file
View File

@@ -0,0 +1,324 @@
//! [![github]](https://github.com/dtolnay/unsafe-libyaml)&ensp;[![crates-io]](https://crates.io/crates/unsafe-libyaml)&ensp;[![docs-rs]](https://docs.rs/unsafe-libyaml)
//!
//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust
//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs
#![no_std]
#![doc(html_root_url = "https://docs.rs/unsafe-libyaml/0.2.11")]
#![allow(non_camel_case_types, non_snake_case, unsafe_op_in_unsafe_fn)]
#![warn(clippy::pedantic)]
#![allow(
clippy::bool_to_int_with_if,
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_ptr_alignment,
clippy::cast_sign_loss,
clippy::collapsible_if,
clippy::doc_markdown,
clippy::fn_params_excessive_bools,
clippy::if_not_else,
clippy::items_after_statements,
clippy::let_underscore_untyped,
clippy::manual_range_contains,
clippy::manual_swap,
clippy::missing_panics_doc,
clippy::missing_safety_doc,
clippy::module_name_repetitions,
clippy::must_use_candidate,
clippy::nonminimal_bool,
clippy::ptr_as_ptr,
clippy::redundant_else,
clippy::similar_names,
clippy::single_match,
clippy::single_match_else,
clippy::too_many_arguments,
clippy::too_many_lines,
clippy::unnecessary_cast,
clippy::unreadable_literal,
clippy::while_immutable_condition, // https://github.com/rust-lang/rust-clippy/issues/3548
)]
extern crate alloc;
use core::mem::size_of;
mod libc {
pub use core::ffi::c_void;
pub use core::primitive::{
i32 as c_int, i64 as c_long, i8 as c_char, u32 as c_uint, u64 as c_ulong, u8 as c_uchar,
};
}
#[macro_use]
mod externs {
use crate::libc;
use crate::ops::{die, ForceAdd as _, ForceInto as _};
use alloc::alloc::{self as rust, Layout};
use core::mem::{self, MaybeUninit};
use core::ptr;
use core::slice;
const HEADER: usize = {
let need_len = mem::size_of::<usize>();
// Round up to multiple of MALLOC_ALIGN.
(need_len + MALLOC_ALIGN - 1) & !(MALLOC_ALIGN - 1)
};
// `max_align_t` may be bigger than this, but libyaml does not use `long
// double` or u128.
const MALLOC_ALIGN: usize = {
let int_align = mem::align_of::<libc::c_ulong>();
let ptr_align = mem::align_of::<usize>();
if int_align >= ptr_align {
int_align
} else {
ptr_align
}
};
pub unsafe fn malloc(size: libc::c_ulong) -> *mut libc::c_void {
let size = HEADER.force_add(size.force_into());
let layout = Layout::from_size_align(size, MALLOC_ALIGN)
.ok()
.unwrap_or_else(die);
let memory = rust::alloc(layout);
if memory.is_null() {
rust::handle_alloc_error(layout);
}
memory.cast::<usize>().write(size);
memory.add(HEADER).cast()
}
pub unsafe fn realloc(ptr: *mut libc::c_void, new_size: libc::c_ulong) -> *mut libc::c_void {
let mut memory = ptr.cast::<u8>().sub(HEADER);
let size = memory.cast::<usize>().read();
let layout = Layout::from_size_align_unchecked(size, MALLOC_ALIGN);
let new_size = HEADER.force_add(new_size.force_into());
let new_layout = Layout::from_size_align(new_size, MALLOC_ALIGN)
.ok()
.unwrap_or_else(die);
memory = rust::realloc(memory, layout, new_size);
if memory.is_null() {
rust::handle_alloc_error(new_layout);
}
memory.cast::<usize>().write(new_size);
memory.add(HEADER).cast()
}
pub unsafe fn free(ptr: *mut libc::c_void) {
let memory = ptr.cast::<u8>().sub(HEADER);
let size = memory.cast::<usize>().read();
let layout = Layout::from_size_align_unchecked(size, MALLOC_ALIGN);
rust::dealloc(memory, layout);
}
pub unsafe fn memcmp(
lhs: *const libc::c_void,
rhs: *const libc::c_void,
count: libc::c_ulong,
) -> libc::c_int {
let lhs = slice::from_raw_parts(lhs.cast::<u8>(), count as usize);
let rhs = slice::from_raw_parts(rhs.cast::<u8>(), count as usize);
lhs.cmp(rhs) as libc::c_int
}
pub unsafe fn memcpy(
dest: *mut libc::c_void,
src: *const libc::c_void,
count: libc::c_ulong,
) -> *mut libc::c_void {
ptr::copy_nonoverlapping(
src.cast::<MaybeUninit<u8>>(),
dest.cast::<MaybeUninit<u8>>(),
count as usize,
);
dest
}
pub unsafe fn memmove(
dest: *mut libc::c_void,
src: *const libc::c_void,
count: libc::c_ulong,
) -> *mut libc::c_void {
ptr::copy(
src.cast::<MaybeUninit<u8>>(),
dest.cast::<MaybeUninit<u8>>(),
count as usize,
);
dest
}
pub unsafe fn memset(
dest: *mut libc::c_void,
ch: libc::c_int,
count: libc::c_ulong,
) -> *mut libc::c_void {
ptr::write_bytes(dest.cast::<u8>(), ch as u8, count as usize);
dest
}
pub unsafe fn strcmp(lhs: *const libc::c_char, rhs: *const libc::c_char) -> libc::c_int {
let lhs = slice::from_raw_parts(lhs.cast::<u8>(), strlen(lhs) as usize);
let rhs = slice::from_raw_parts(rhs.cast::<u8>(), strlen(rhs) as usize);
lhs.cmp(rhs) as libc::c_int
}
pub unsafe fn strdup(src: *const libc::c_char) -> *mut libc::c_char {
let len = strlen(src);
let dest = malloc(len + 1);
memcpy(dest, src.cast(), len + 1);
dest.cast()
}
pub unsafe fn strlen(str: *const libc::c_char) -> libc::c_ulong {
let mut end = str;
while *end != 0 {
end = end.add(1);
}
end.offset_from(str) as libc::c_ulong
}
pub unsafe fn strncmp(
lhs: *const libc::c_char,
rhs: *const libc::c_char,
mut count: libc::c_ulong,
) -> libc::c_int {
let mut lhs = lhs.cast::<u8>();
let mut rhs = rhs.cast::<u8>();
while count > 0 && *lhs != 0 && *lhs == *rhs {
lhs = lhs.add(1);
rhs = rhs.add(1);
count -= 1;
}
if count == 0 {
0
} else {
(*lhs).cmp(&*rhs) as libc::c_int
}
}
macro_rules! __assert {
(false $(,)?) => {
$crate::externs::__assert_fail(stringify!(false), file!(), line!())
};
($assertion:expr $(,)?) => {
if !$assertion {
$crate::externs::__assert_fail(stringify!($assertion), file!(), line!());
}
};
}
pub(crate) unsafe fn __assert_fail(
__assertion: &'static str,
__file: &'static str,
__line: u32,
) -> ! {
struct Abort;
impl Drop for Abort {
fn drop(&mut self) {
panic!();
}
}
let _abort_on_panic = Abort;
panic!("{}:{}: Assertion `{}` failed.", __file, __line, __assertion);
}
}
mod fmt {
use crate::yaml::yaml_char_t;
use core::fmt::{self, Write};
use core::ptr;
pub struct WriteToPtr {
ptr: *mut yaml_char_t,
}
impl WriteToPtr {
pub unsafe fn new(ptr: *mut yaml_char_t) -> Self {
WriteToPtr { ptr }
}
pub fn write_fmt(&mut self, args: fmt::Arguments) {
let _ = Write::write_fmt(self, args);
}
}
impl Write for WriteToPtr {
fn write_str(&mut self, s: &str) -> fmt::Result {
unsafe {
ptr::copy_nonoverlapping(s.as_ptr(), self.ptr, s.len());
self.ptr = self.ptr.add(s.len());
}
Ok(())
}
}
}
trait PointerExt: Sized {
fn c_offset_from(self, origin: Self) -> isize;
}
impl<T> PointerExt for *const T {
fn c_offset_from(self, origin: *const T) -> isize {
(self as isize - origin as isize) / size_of::<T>() as isize
}
}
impl<T> PointerExt for *mut T {
fn c_offset_from(self, origin: *mut T) -> isize {
(self as isize - origin as isize) / size_of::<T>() as isize
}
}
#[macro_use]
mod macros;
mod api;
mod dumper;
mod emitter;
mod loader;
mod ops;
mod parser;
mod reader;
mod scanner;
mod success;
mod writer;
mod yaml;
pub use crate::api::{
yaml_alias_event_initialize, yaml_document_add_mapping, yaml_document_add_scalar,
yaml_document_add_sequence, yaml_document_append_mapping_pair,
yaml_document_append_sequence_item, yaml_document_delete, yaml_document_end_event_initialize,
yaml_document_get_node, yaml_document_get_root_node, yaml_document_initialize,
yaml_document_start_event_initialize, yaml_emitter_delete, yaml_emitter_initialize,
yaml_emitter_set_break, yaml_emitter_set_canonical, yaml_emitter_set_encoding,
yaml_emitter_set_indent, yaml_emitter_set_output, yaml_emitter_set_output_string,
yaml_emitter_set_unicode, yaml_emitter_set_width, yaml_event_delete,
yaml_mapping_end_event_initialize, yaml_mapping_start_event_initialize, yaml_parser_delete,
yaml_parser_initialize, yaml_parser_set_encoding, yaml_parser_set_input,
yaml_parser_set_input_string, yaml_scalar_event_initialize, yaml_sequence_end_event_initialize,
yaml_sequence_start_event_initialize, yaml_stream_end_event_initialize,
yaml_stream_start_event_initialize, yaml_token_delete,
};
pub use crate::dumper::{yaml_emitter_close, yaml_emitter_dump, yaml_emitter_open};
pub use crate::emitter::yaml_emitter_emit;
pub use crate::loader::yaml_parser_load;
pub use crate::parser::yaml_parser_parse;
pub use crate::scanner::yaml_parser_scan;
pub use crate::writer::yaml_emitter_flush;
pub use crate::yaml::{
yaml_alias_data_t, yaml_break_t, yaml_document_t, yaml_emitter_state_t, yaml_emitter_t,
yaml_encoding_t, yaml_error_type_t, yaml_event_t, yaml_event_type_t, yaml_mapping_style_t,
yaml_mark_t, yaml_node_item_t, yaml_node_pair_t, yaml_node_t, yaml_node_type_t,
yaml_parser_state_t, yaml_parser_t, yaml_read_handler_t, yaml_scalar_style_t,
yaml_sequence_style_t, yaml_simple_key_t, yaml_stack_t, yaml_tag_directive_t, yaml_token_t,
yaml_token_type_t, yaml_version_directive_t, yaml_write_handler_t,
};
#[doc(hidden)]
pub use crate::yaml::{
yaml_break_t::*, yaml_emitter_state_t::*, yaml_encoding_t::*, yaml_error_type_t::*,
yaml_event_type_t::*, yaml_mapping_style_t::*, yaml_node_type_t::*, yaml_parser_state_t::*,
yaml_scalar_style_t::*, yaml_sequence_style_t::*, yaml_token_type_t::*,
};

579
vendor/unsafe-libyaml/src/loader.rs vendored Normal file
View File

@@ -0,0 +1,579 @@
use crate::api::{yaml_free, yaml_malloc, yaml_stack_extend, yaml_strdup};
use crate::externs::{memset, strcmp};
use crate::success::{Success, FAIL, OK};
use crate::yaml::yaml_char_t;
use crate::{
libc, yaml_alias_data_t, yaml_document_delete, yaml_document_t, yaml_event_t, yaml_mark_t,
yaml_node_item_t, yaml_node_pair_t, yaml_node_t, yaml_parser_parse, yaml_parser_t, PointerExt,
YAML_ALIAS_EVENT, YAML_COMPOSER_ERROR, YAML_DOCUMENT_END_EVENT, YAML_DOCUMENT_START_EVENT,
YAML_MAPPING_END_EVENT, YAML_MAPPING_NODE, YAML_MAPPING_START_EVENT, YAML_MEMORY_ERROR,
YAML_SCALAR_EVENT, YAML_SCALAR_NODE, YAML_SEQUENCE_END_EVENT, YAML_SEQUENCE_NODE,
YAML_SEQUENCE_START_EVENT, YAML_STREAM_END_EVENT, YAML_STREAM_START_EVENT,
};
use core::mem::{size_of, MaybeUninit};
use core::ptr::{self, addr_of_mut};
#[repr(C)]
struct loader_ctx {
start: *mut libc::c_int,
end: *mut libc::c_int,
top: *mut libc::c_int,
}
/// Parse the input stream and produce the next YAML document.
///
/// Call this function subsequently to produce a sequence of documents
/// constituting the input stream.
///
/// If the produced document has no root node, it means that the document end
/// has been reached.
///
/// An application is responsible for freeing any data associated with the
/// produced document object using the yaml_document_delete() function.
///
/// An application must not alternate the calls of yaml_parser_load() with the
/// calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break
/// the parser.
pub unsafe fn yaml_parser_load(
parser: *mut yaml_parser_t,
document: *mut yaml_document_t,
) -> Success {
let current_block: u64;
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
__assert!(!parser.is_null());
__assert!(!document.is_null());
memset(
document as *mut libc::c_void,
0,
size_of::<yaml_document_t>() as libc::c_ulong,
);
STACK_INIT!((*document).nodes, yaml_node_t);
if !(*parser).stream_start_produced {
if yaml_parser_parse(parser, event).fail {
current_block = 6234624449317607669;
} else {
__assert!((*event).type_ == YAML_STREAM_START_EVENT);
current_block = 7815301370352969686;
}
} else {
current_block = 7815301370352969686;
}
if current_block != 6234624449317607669 {
if (*parser).stream_end_produced {
return OK;
}
if yaml_parser_parse(parser, event).ok {
if (*event).type_ == YAML_STREAM_END_EVENT {
return OK;
}
STACK_INIT!((*parser).aliases, yaml_alias_data_t);
let fresh6 = addr_of_mut!((*parser).document);
*fresh6 = document;
if yaml_parser_load_document(parser, event).ok {
yaml_parser_delete_aliases(parser);
let fresh7 = addr_of_mut!((*parser).document);
*fresh7 = ptr::null_mut::<yaml_document_t>();
return OK;
}
}
}
yaml_parser_delete_aliases(parser);
yaml_document_delete(document);
let fresh8 = addr_of_mut!((*parser).document);
*fresh8 = ptr::null_mut::<yaml_document_t>();
FAIL
}
unsafe fn yaml_parser_set_composer_error(
parser: *mut yaml_parser_t,
problem: *const libc::c_char,
problem_mark: yaml_mark_t,
) -> Success {
(*parser).error = YAML_COMPOSER_ERROR;
let fresh9 = addr_of_mut!((*parser).problem);
*fresh9 = problem;
(*parser).problem_mark = problem_mark;
FAIL
}
unsafe fn yaml_parser_set_composer_error_context(
parser: *mut yaml_parser_t,
context: *const libc::c_char,
context_mark: yaml_mark_t,
problem: *const libc::c_char,
problem_mark: yaml_mark_t,
) -> Success {
(*parser).error = YAML_COMPOSER_ERROR;
let fresh10 = addr_of_mut!((*parser).context);
*fresh10 = context;
(*parser).context_mark = context_mark;
let fresh11 = addr_of_mut!((*parser).problem);
*fresh11 = problem;
(*parser).problem_mark = problem_mark;
FAIL
}
unsafe fn yaml_parser_delete_aliases(parser: *mut yaml_parser_t) {
while !STACK_EMPTY!((*parser).aliases) {
yaml_free(POP!((*parser).aliases).anchor as *mut libc::c_void);
}
STACK_DEL!((*parser).aliases);
}
unsafe fn yaml_parser_load_document(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
) -> Success {
let mut ctx = loader_ctx {
start: ptr::null_mut::<libc::c_int>(),
end: ptr::null_mut::<libc::c_int>(),
top: ptr::null_mut::<libc::c_int>(),
};
__assert!((*event).type_ == YAML_DOCUMENT_START_EVENT);
let fresh16 = addr_of_mut!((*(*parser).document).version_directive);
*fresh16 = (*event).data.document_start.version_directive;
let fresh17 = addr_of_mut!((*(*parser).document).tag_directives.start);
*fresh17 = (*event).data.document_start.tag_directives.start;
let fresh18 = addr_of_mut!((*(*parser).document).tag_directives.end);
*fresh18 = (*event).data.document_start.tag_directives.end;
(*(*parser).document).start_implicit = (*event).data.document_start.implicit;
(*(*parser).document).start_mark = (*event).start_mark;
STACK_INIT!(ctx, libc::c_int);
if yaml_parser_load_nodes(parser, addr_of_mut!(ctx)).fail {
STACK_DEL!(ctx);
return FAIL;
}
STACK_DEL!(ctx);
OK
}
unsafe fn yaml_parser_load_nodes(parser: *mut yaml_parser_t, ctx: *mut loader_ctx) -> Success {
let mut event = MaybeUninit::<yaml_event_t>::uninit();
let event = event.as_mut_ptr();
loop {
if yaml_parser_parse(parser, event).fail {
return FAIL;
}
match (*event).type_ {
YAML_ALIAS_EVENT => {
if yaml_parser_load_alias(parser, event, ctx).fail {
return FAIL;
}
}
YAML_SCALAR_EVENT => {
if yaml_parser_load_scalar(parser, event, ctx).fail {
return FAIL;
}
}
YAML_SEQUENCE_START_EVENT => {
if yaml_parser_load_sequence(parser, event, ctx).fail {
return FAIL;
}
}
YAML_SEQUENCE_END_EVENT => {
if yaml_parser_load_sequence_end(parser, event, ctx).fail {
return FAIL;
}
}
YAML_MAPPING_START_EVENT => {
if yaml_parser_load_mapping(parser, event, ctx).fail {
return FAIL;
}
}
YAML_MAPPING_END_EVENT => {
if yaml_parser_load_mapping_end(parser, event, ctx).fail {
return FAIL;
}
}
YAML_DOCUMENT_END_EVENT => {}
_ => {
__assert!(false);
}
}
if (*event).type_ == YAML_DOCUMENT_END_EVENT {
break;
}
}
(*(*parser).document).end_implicit = (*event).data.document_end.implicit;
(*(*parser).document).end_mark = (*event).end_mark;
OK
}
unsafe fn yaml_parser_register_anchor(
parser: *mut yaml_parser_t,
index: libc::c_int,
anchor: *mut yaml_char_t,
) -> Success {
let mut data = MaybeUninit::<yaml_alias_data_t>::uninit();
let data = data.as_mut_ptr();
let mut alias_data: *mut yaml_alias_data_t;
if anchor.is_null() {
return OK;
}
(*data).anchor = anchor;
(*data).index = index;
(*data).mark = (*(*(*parser).document)
.nodes
.start
.wrapping_offset((index - 1) as isize))
.start_mark;
alias_data = (*parser).aliases.start;
while alias_data != (*parser).aliases.top {
if strcmp(
(*alias_data).anchor as *mut libc::c_char,
anchor as *mut libc::c_char,
) == 0
{
yaml_free(anchor as *mut libc::c_void);
return yaml_parser_set_composer_error_context(
parser,
b"found duplicate anchor; first occurrence\0" as *const u8 as *const libc::c_char,
(*alias_data).mark,
b"second occurrence\0" as *const u8 as *const libc::c_char,
(*data).mark,
);
}
alias_data = alias_data.wrapping_offset(1);
}
PUSH!((*parser).aliases, *data);
OK
}
unsafe fn yaml_parser_load_node_add(
parser: *mut yaml_parser_t,
ctx: *mut loader_ctx,
index: libc::c_int,
) -> Success {
if STACK_EMPTY!(*ctx) {
return OK;
}
let parent_index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
let parent: *mut yaml_node_t = addr_of_mut!(
*((*(*parser).document).nodes.start).wrapping_offset((parent_index - 1) as isize)
);
let current_block_17: u64;
match (*parent).type_ {
YAML_SEQUENCE_NODE => {
if STACK_LIMIT!(parser, (*parent).data.sequence.items).fail {
return FAIL;
}
PUSH!((*parent).data.sequence.items, index);
}
YAML_MAPPING_NODE => {
let mut pair = MaybeUninit::<yaml_node_pair_t>::uninit();
let pair = pair.as_mut_ptr();
if !STACK_EMPTY!((*parent).data.mapping.pairs) {
let p: *mut yaml_node_pair_t =
(*parent).data.mapping.pairs.top.wrapping_offset(-1_isize);
if (*p).key != 0 && (*p).value == 0 {
(*p).value = index;
current_block_17 = 11307063007268554308;
} else {
current_block_17 = 17407779659766490442;
}
} else {
current_block_17 = 17407779659766490442;
}
match current_block_17 {
11307063007268554308 => {}
_ => {
(*pair).key = index;
(*pair).value = 0;
if STACK_LIMIT!(parser, (*parent).data.mapping.pairs).fail {
return FAIL;
}
PUSH!((*parent).data.mapping.pairs, *pair);
}
}
}
_ => {
__assert!(false);
}
}
OK
}
unsafe fn yaml_parser_load_alias(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
let anchor: *mut yaml_char_t = (*event).data.alias.anchor;
let mut alias_data: *mut yaml_alias_data_t;
alias_data = (*parser).aliases.start;
while alias_data != (*parser).aliases.top {
if strcmp(
(*alias_data).anchor as *mut libc::c_char,
anchor as *mut libc::c_char,
) == 0
{
yaml_free(anchor as *mut libc::c_void);
return yaml_parser_load_node_add(parser, ctx, (*alias_data).index);
}
alias_data = alias_data.wrapping_offset(1);
}
yaml_free(anchor as *mut libc::c_void);
yaml_parser_set_composer_error(
parser,
b"found undefined alias\0" as *const u8 as *const libc::c_char,
(*event).start_mark,
)
}
unsafe fn yaml_parser_load_scalar(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
let current_block: u64;
let mut node = MaybeUninit::<yaml_node_t>::uninit();
let node = node.as_mut_ptr();
let index: libc::c_int;
let mut tag: *mut yaml_char_t = (*event).data.scalar.tag;
if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
if tag.is_null()
|| strcmp(
tag as *mut libc::c_char,
b"!\0" as *const u8 as *const libc::c_char,
) == 0
{
yaml_free(tag as *mut libc::c_void);
tag = yaml_strdup(
b"tag:yaml.org,2002:str\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
);
if tag.is_null() {
current_block = 10579931339944277179;
} else {
current_block = 11006700562992250127;
}
} else {
current_block = 11006700562992250127;
}
if current_block != 10579931339944277179 {
memset(
node as *mut libc::c_void,
0,
size_of::<yaml_node_t>() as libc::c_ulong,
);
(*node).type_ = YAML_SCALAR_NODE;
(*node).tag = tag;
(*node).start_mark = (*event).start_mark;
(*node).end_mark = (*event).end_mark;
(*node).data.scalar.value = (*event).data.scalar.value;
(*node).data.scalar.length = (*event).data.scalar.length;
(*node).data.scalar.style = (*event).data.scalar.style;
PUSH!((*(*parser).document).nodes, *node);
index = (*(*parser).document)
.nodes
.top
.c_offset_from((*(*parser).document).nodes.start)
as libc::c_int;
if yaml_parser_register_anchor(parser, index, (*event).data.scalar.anchor).fail {
return FAIL;
}
return yaml_parser_load_node_add(parser, ctx, index);
}
}
yaml_free(tag as *mut libc::c_void);
yaml_free((*event).data.scalar.anchor as *mut libc::c_void);
yaml_free((*event).data.scalar.value as *mut libc::c_void);
FAIL
}
unsafe fn yaml_parser_load_sequence(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
let current_block: u64;
let mut node = MaybeUninit::<yaml_node_t>::uninit();
let node = node.as_mut_ptr();
struct Items {
start: *mut yaml_node_item_t,
end: *mut yaml_node_item_t,
top: *mut yaml_node_item_t,
}
let mut items = Items {
start: ptr::null_mut::<yaml_node_item_t>(),
end: ptr::null_mut::<yaml_node_item_t>(),
top: ptr::null_mut::<yaml_node_item_t>(),
};
let index: libc::c_int;
let mut tag: *mut yaml_char_t = (*event).data.sequence_start.tag;
if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
if tag.is_null()
|| strcmp(
tag as *mut libc::c_char,
b"!\0" as *const u8 as *const libc::c_char,
) == 0
{
yaml_free(tag as *mut libc::c_void);
tag = yaml_strdup(
b"tag:yaml.org,2002:seq\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
);
if tag.is_null() {
current_block = 13474536459355229096;
} else {
current_block = 6937071982253665452;
}
} else {
current_block = 6937071982253665452;
}
if current_block != 13474536459355229096 {
STACK_INIT!(items, yaml_node_item_t);
memset(
node as *mut libc::c_void,
0,
size_of::<yaml_node_t>() as libc::c_ulong,
);
(*node).type_ = YAML_SEQUENCE_NODE;
(*node).tag = tag;
(*node).start_mark = (*event).start_mark;
(*node).end_mark = (*event).end_mark;
(*node).data.sequence.items.start = items.start;
(*node).data.sequence.items.end = items.end;
(*node).data.sequence.items.top = items.start;
(*node).data.sequence.style = (*event).data.sequence_start.style;
PUSH!((*(*parser).document).nodes, *node);
index = (*(*parser).document)
.nodes
.top
.c_offset_from((*(*parser).document).nodes.start)
as libc::c_int;
if yaml_parser_register_anchor(parser, index, (*event).data.sequence_start.anchor).fail
{
return FAIL;
}
if yaml_parser_load_node_add(parser, ctx, index).fail {
return FAIL;
}
if STACK_LIMIT!(parser, *ctx).fail {
return FAIL;
}
PUSH!(*ctx, index);
return OK;
}
}
yaml_free(tag as *mut libc::c_void);
yaml_free((*event).data.sequence_start.anchor as *mut libc::c_void);
FAIL
}
unsafe fn yaml_parser_load_sequence_end(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
__assert!(((*ctx).top).c_offset_from((*ctx).start) as libc::c_long > 0_i64);
let index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
__assert!(
(*((*(*parser).document).nodes.start).wrapping_offset((index - 1) as isize)).type_
== YAML_SEQUENCE_NODE
);
(*(*(*parser).document)
.nodes
.start
.wrapping_offset((index - 1) as isize))
.end_mark = (*event).end_mark;
let _ = POP!(*ctx);
OK
}
unsafe fn yaml_parser_load_mapping(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
let current_block: u64;
let mut node = MaybeUninit::<yaml_node_t>::uninit();
let node = node.as_mut_ptr();
struct Pairs {
start: *mut yaml_node_pair_t,
end: *mut yaml_node_pair_t,
top: *mut yaml_node_pair_t,
}
let mut pairs = Pairs {
start: ptr::null_mut::<yaml_node_pair_t>(),
end: ptr::null_mut::<yaml_node_pair_t>(),
top: ptr::null_mut::<yaml_node_pair_t>(),
};
let index: libc::c_int;
let mut tag: *mut yaml_char_t = (*event).data.mapping_start.tag;
if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
if tag.is_null()
|| strcmp(
tag as *mut libc::c_char,
b"!\0" as *const u8 as *const libc::c_char,
) == 0
{
yaml_free(tag as *mut libc::c_void);
tag = yaml_strdup(
b"tag:yaml.org,2002:map\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
);
if tag.is_null() {
current_block = 13635467803606088781;
} else {
current_block = 6937071982253665452;
}
} else {
current_block = 6937071982253665452;
}
if current_block != 13635467803606088781 {
STACK_INIT!(pairs, yaml_node_pair_t);
memset(
node as *mut libc::c_void,
0,
size_of::<yaml_node_t>() as libc::c_ulong,
);
(*node).type_ = YAML_MAPPING_NODE;
(*node).tag = tag;
(*node).start_mark = (*event).start_mark;
(*node).end_mark = (*event).end_mark;
(*node).data.mapping.pairs.start = pairs.start;
(*node).data.mapping.pairs.end = pairs.end;
(*node).data.mapping.pairs.top = pairs.start;
(*node).data.mapping.style = (*event).data.mapping_start.style;
PUSH!((*(*parser).document).nodes, *node);
index = (*(*parser).document)
.nodes
.top
.c_offset_from((*(*parser).document).nodes.start)
as libc::c_int;
if yaml_parser_register_anchor(parser, index, (*event).data.mapping_start.anchor).fail {
return FAIL;
}
if yaml_parser_load_node_add(parser, ctx, index).fail {
return FAIL;
}
if STACK_LIMIT!(parser, *ctx).fail {
return FAIL;
}
PUSH!(*ctx, index);
return OK;
}
}
yaml_free(tag as *mut libc::c_void);
yaml_free((*event).data.mapping_start.anchor as *mut libc::c_void);
FAIL
}
unsafe fn yaml_parser_load_mapping_end(
parser: *mut yaml_parser_t,
event: *mut yaml_event_t,
ctx: *mut loader_ctx,
) -> Success {
__assert!(((*ctx).top).c_offset_from((*ctx).start) as libc::c_long > 0_i64);
let index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
__assert!(
(*((*(*parser).document).nodes.start).wrapping_offset((index - 1) as isize)).type_
== YAML_MAPPING_NODE
);
(*(*(*parser).document)
.nodes
.start
.wrapping_offset((index - 1) as isize))
.end_mark = (*event).end_mark;
let _ = POP!(*ctx);
OK
}

514
vendor/unsafe-libyaml/src/macros.rs vendored Normal file
View File

@@ -0,0 +1,514 @@
macro_rules! BUFFER_INIT {
($buffer:expr, $size:expr) => {{
let start = addr_of_mut!($buffer.start);
*start = yaml_malloc($size as size_t) as *mut yaml_char_t;
let pointer = addr_of_mut!($buffer.pointer);
*pointer = $buffer.start;
let last = addr_of_mut!($buffer.last);
*last = *pointer;
let end = addr_of_mut!($buffer.end);
*end = $buffer.start.wrapping_add($size as usize);
}};
}
macro_rules! BUFFER_DEL {
($buffer:expr) => {{
yaml_free($buffer.start as *mut libc::c_void);
let end = addr_of_mut!($buffer.end);
*end = ptr::null_mut::<yaml_char_t>();
let pointer = addr_of_mut!($buffer.pointer);
*pointer = *end;
let start = addr_of_mut!($buffer.start);
*start = *pointer;
}};
}
macro_rules! STRING_ASSIGN {
($string:expr, $length:expr) => {
yaml_string_t {
start: $string,
end: $string.wrapping_offset($length as isize),
pointer: $string,
}
};
}
macro_rules! STRING_INIT {
($string:expr) => {{
$string.start = yaml_malloc(16) as *mut yaml_char_t;
$string.pointer = $string.start;
$string.end = $string.start.wrapping_add(16);
memset($string.start as *mut libc::c_void, 0, 16);
}};
}
macro_rules! STRING_DEL {
($string:expr) => {{
yaml_free($string.start as *mut libc::c_void);
$string.end = ptr::null_mut::<yaml_char_t>();
$string.pointer = $string.end;
$string.start = $string.pointer;
}};
}
macro_rules! STRING_EXTEND {
($string:expr) => {
if $string.pointer.wrapping_add(5) >= $string.end {
yaml_string_extend(
addr_of_mut!($string.start),
addr_of_mut!($string.pointer),
addr_of_mut!($string.end),
);
}
};
}
macro_rules! CLEAR {
($string:expr) => {{
$string.pointer = $string.start;
memset(
$string.start as *mut libc::c_void,
0,
$string.end.c_offset_from($string.start) as libc::c_ulong,
);
}};
}
macro_rules! JOIN {
($string_a:expr, $string_b:expr) => {{
yaml_string_join(
addr_of_mut!($string_a.start),
addr_of_mut!($string_a.pointer),
addr_of_mut!($string_a.end),
addr_of_mut!($string_b.start),
addr_of_mut!($string_b.pointer),
addr_of_mut!($string_b.end),
);
$string_b.pointer = $string_b.start;
}};
}
macro_rules! CHECK_AT {
($string:expr, $octet:expr, $offset:expr) => {
*$string.pointer.offset($offset as isize) == $octet
};
}
macro_rules! CHECK {
($string:expr, $octet:expr) => {
*$string.pointer == $octet
};
}
macro_rules! IS_ALPHA {
($string:expr) => {
*$string.pointer >= b'0' && *$string.pointer <= b'9'
|| *$string.pointer >= b'A' && *$string.pointer <= b'Z'
|| *$string.pointer >= b'a' && *$string.pointer <= b'z'
|| *$string.pointer == b'_'
|| *$string.pointer == b'-'
};
}
macro_rules! IS_DIGIT {
($string:expr) => {
*$string.pointer >= b'0' && *$string.pointer <= b'9'
};
}
macro_rules! AS_DIGIT {
($string:expr) => {
(*$string.pointer - b'0') as libc::c_int
};
}
macro_rules! IS_HEX_AT {
($string:expr, $offset:expr) => {
*$string.pointer.wrapping_offset($offset) >= b'0'
&& *$string.pointer.wrapping_offset($offset) <= b'9'
|| *$string.pointer.wrapping_offset($offset) >= b'A'
&& *$string.pointer.wrapping_offset($offset) <= b'F'
|| *$string.pointer.wrapping_offset($offset) >= b'a'
&& *$string.pointer.wrapping_offset($offset) <= b'f'
};
}
macro_rules! AS_HEX_AT {
($string:expr, $offset:expr) => {
if *$string.pointer.wrapping_offset($offset) >= b'A'
&& *$string.pointer.wrapping_offset($offset) <= b'F'
{
*$string.pointer.wrapping_offset($offset) - b'A' + 10
} else if *$string.pointer.wrapping_offset($offset) >= b'a'
&& *$string.pointer.wrapping_offset($offset) <= b'f'
{
*$string.pointer.wrapping_offset($offset) - b'a' + 10
} else {
*$string.pointer.wrapping_offset($offset) - b'0'
} as libc::c_int
};
}
macro_rules! IS_ASCII {
($string:expr) => {
*$string.pointer <= b'\x7F'
};
}
macro_rules! IS_PRINTABLE {
($string:expr) => {
match *$string.pointer {
// ASCII
0x0A | 0x20..=0x7E => true,
// U+A0 ... U+BF
0xC2 => match *$string.pointer.wrapping_offset(1) {
0xA0..=0xBF => true,
_ => false,
},
// U+C0 ... U+CFFF
0xC3..=0xEC => true,
// U+D000 ... U+D7FF
0xED => match *$string.pointer.wrapping_offset(1) {
0x00..=0x9F => true,
_ => false,
},
// U+E000 ... U+EFFF
0xEE => true,
// U+F000 ... U+FFFD
0xEF => match *$string.pointer.wrapping_offset(1) {
0xBB => match *$string.pointer.wrapping_offset(2) {
// except U+FEFF
0xBF => false,
_ => true,
},
0xBF => match *$string.pointer.wrapping_offset(2) {
0xBE | 0xBF => false,
_ => true,
},
_ => true,
},
// U+10000 ... U+10FFFF
0xF0..=0xF4 => true,
_ => false,
}
};
}
macro_rules! IS_Z_AT {
($string:expr, $offset:expr) => {
CHECK_AT!($string, b'\0', $offset)
};
}
macro_rules! IS_Z {
($string:expr) => {
IS_Z_AT!($string, 0)
};
}
macro_rules! IS_BOM {
($string:expr) => {
CHECK_AT!($string, b'\xEF', 0)
&& CHECK_AT!($string, b'\xBB', 1)
&& CHECK_AT!($string, b'\xBF', 2)
};
}
macro_rules! IS_SPACE_AT {
($string:expr, $offset:expr) => {
CHECK_AT!($string, b' ', $offset)
};
}
macro_rules! IS_SPACE {
($string:expr) => {
IS_SPACE_AT!($string, 0)
};
}
macro_rules! IS_TAB_AT {
($string:expr, $offset:expr) => {
CHECK_AT!($string, b'\t', $offset)
};
}
macro_rules! IS_TAB {
($string:expr) => {
IS_TAB_AT!($string, 0)
};
}
macro_rules! IS_BLANK_AT {
($string:expr, $offset:expr) => {
IS_SPACE_AT!($string, $offset) || IS_TAB_AT!($string, $offset)
};
}
macro_rules! IS_BLANK {
($string:expr) => {
IS_BLANK_AT!($string, 0)
};
}
macro_rules! IS_BREAK_AT {
($string:expr, $offset:expr) => {
CHECK_AT!($string, b'\r', $offset)
|| CHECK_AT!($string, b'\n', $offset)
|| CHECK_AT!($string, b'\xC2', $offset) && CHECK_AT!($string, b'\x85', $offset + 1)
|| CHECK_AT!($string, b'\xE2', $offset)
&& CHECK_AT!($string, b'\x80', $offset + 1)
&& CHECK_AT!($string, b'\xA8', $offset + 2)
|| CHECK_AT!($string, b'\xE2', $offset)
&& CHECK_AT!($string, b'\x80', $offset + 1)
&& CHECK_AT!($string, b'\xA9', $offset + 2)
};
}
macro_rules! IS_BREAK {
($string:expr) => {
IS_BREAK_AT!($string, 0)
};
}
macro_rules! IS_CRLF {
($string:expr) => {
CHECK_AT!($string, b'\r', 0) && CHECK_AT!($string, b'\n', 1)
};
}
macro_rules! IS_BREAKZ_AT {
($string:expr, $offset:expr) => {
IS_BREAK_AT!($string, $offset) || IS_Z_AT!($string, $offset)
};
}
macro_rules! IS_BREAKZ {
($string:expr) => {
IS_BREAKZ_AT!($string, 0)
};
}
macro_rules! IS_BLANKZ_AT {
($string:expr, $offset:expr) => {
IS_BLANK_AT!($string, $offset) || IS_BREAKZ_AT!($string, $offset)
};
}
macro_rules! IS_BLANKZ {
($string:expr) => {
IS_BLANKZ_AT!($string, 0)
};
}
macro_rules! WIDTH_AT {
($string:expr, $offset:expr) => {
if *$string.pointer.wrapping_offset($offset as isize) & 0x80 == 0x00 {
1
} else if *$string.pointer.wrapping_offset($offset as isize) & 0xE0 == 0xC0 {
2
} else if *$string.pointer.wrapping_offset($offset as isize) & 0xF0 == 0xE0 {
3
} else if *$string.pointer.wrapping_offset($offset as isize) & 0xF8 == 0xF0 {
4
} else {
0
}
};
}
macro_rules! WIDTH {
($string:expr) => {
WIDTH_AT!($string, 0)
};
}
macro_rules! MOVE {
($string:expr) => {
$string.pointer = $string.pointer.wrapping_offset(WIDTH!($string) as isize)
};
}
macro_rules! COPY {
($string_a:expr, $string_b:expr) => {
if *$string_b.pointer & 0x80 == 0x00 {
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
} else if *$string_b.pointer & 0xE0 == 0xC0 {
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
} else if *$string_b.pointer & 0xF0 == 0xE0 {
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
} else if *$string_b.pointer & 0xF8 == 0xF0 {
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
*$string_a.pointer = *$string_b.pointer;
$string_a.pointer = $string_a.pointer.wrapping_offset(1);
$string_b.pointer = $string_b.pointer.wrapping_offset(1);
}
};
}
macro_rules! STACK_INIT {
($stack:expr, $type:ty) => {{
$stack.start = yaml_malloc(16 * size_of::<$type>() as libc::c_ulong) as *mut $type;
$stack.top = $stack.start;
$stack.end = $stack.start.offset(16_isize);
}};
}
macro_rules! STACK_DEL {
($stack:expr) => {
yaml_free($stack.start as *mut libc::c_void);
$stack.end = ptr::null_mut();
$stack.top = ptr::null_mut();
$stack.start = ptr::null_mut();
};
}
macro_rules! STACK_EMPTY {
($stack:expr) => {
$stack.start == $stack.top
};
}
macro_rules! STACK_LIMIT {
($context:expr, $stack:expr) => {
if $stack.top.c_offset_from($stack.start) < libc::c_int::MAX as isize - 1 {
OK
} else {
(*$context).error = YAML_MEMORY_ERROR;
FAIL
}
};
}
macro_rules! PUSH {
(do $stack:expr, $push:expr) => {{
if $stack.top == $stack.end {
yaml_stack_extend(
addr_of_mut!($stack.start) as *mut *mut libc::c_void,
addr_of_mut!($stack.top) as *mut *mut libc::c_void,
addr_of_mut!($stack.end) as *mut *mut libc::c_void,
);
}
$push;
$stack.top = $stack.top.wrapping_offset(1);
}};
($stack:expr, *$value:expr) => {
PUSH!(do $stack, ptr::copy_nonoverlapping($value, $stack.top, 1))
};
($stack:expr, $value:expr) => {
PUSH!(do $stack, ptr::write($stack.top, $value))
};
}
macro_rules! POP {
($stack:expr) => {
*{
$stack.top = $stack.top.offset(-1);
$stack.top
}
};
}
macro_rules! QUEUE_INIT {
($queue:expr, $type:ty) => {{
$queue.start = yaml_malloc(16 * size_of::<$type>() as libc::c_ulong) as *mut $type;
$queue.tail = $queue.start;
$queue.head = $queue.tail;
$queue.end = $queue.start.offset(16_isize);
}};
}
macro_rules! QUEUE_DEL {
($queue:expr) => {
yaml_free($queue.start as *mut libc::c_void);
$queue.end = ptr::null_mut();
$queue.tail = ptr::null_mut();
$queue.head = ptr::null_mut();
$queue.start = ptr::null_mut();
};
}
macro_rules! QUEUE_EMPTY {
($queue:expr) => {
$queue.head == $queue.tail
};
}
macro_rules! ENQUEUE {
(do $queue:expr, $enqueue:expr) => {{
if $queue.tail == $queue.end {
yaml_queue_extend(
addr_of_mut!($queue.start) as *mut *mut libc::c_void,
addr_of_mut!($queue.head) as *mut *mut libc::c_void,
addr_of_mut!($queue.tail) as *mut *mut libc::c_void,
addr_of_mut!($queue.end) as *mut *mut libc::c_void,
);
}
$enqueue;
$queue.tail = $queue.tail.wrapping_offset(1);
}};
($queue:expr, *$value:expr) => {
ENQUEUE!(do $queue, ptr::copy_nonoverlapping($value, $queue.tail, 1))
};
($queue:expr, $value:expr) => {
ENQUEUE!(do $queue, ptr::write($queue.tail, $value))
};
}
macro_rules! DEQUEUE {
($queue:expr) => {
*{
let head = $queue.head;
$queue.head = $queue.head.wrapping_offset(1);
head
}
};
}
macro_rules! QUEUE_INSERT {
($queue:expr, $index:expr, $value:expr) => {{
if $queue.tail == $queue.end {
yaml_queue_extend(
addr_of_mut!($queue.start) as *mut *mut libc::c_void,
addr_of_mut!($queue.head) as *mut *mut libc::c_void,
addr_of_mut!($queue.tail) as *mut *mut libc::c_void,
addr_of_mut!($queue.end) as *mut *mut libc::c_void,
);
}
memmove(
$queue
.head
.wrapping_offset($index as isize)
.wrapping_offset(1_isize) as *mut libc::c_void,
$queue.head.wrapping_offset($index as isize) as *const libc::c_void,
($queue.tail.c_offset_from($queue.head) as libc::c_ulong)
.wrapping_sub($index)
.wrapping_mul(size_of::<yaml_token_t>() as libc::c_ulong),
);
*$queue.head.wrapping_offset($index as isize) = $value;
let fresh14 = addr_of_mut!($queue.tail);
*fresh14 = (*fresh14).wrapping_offset(1);
}};
}

111
vendor/unsafe-libyaml/src/ops.rs vendored Normal file
View File

@@ -0,0 +1,111 @@
pub(crate) trait ForceAdd: Sized {
fn force_add(self, rhs: Self) -> Self;
}
impl ForceAdd for u8 {
fn force_add(self, rhs: Self) -> Self {
self.checked_add(rhs).unwrap_or_else(die)
}
}
impl ForceAdd for i32 {
fn force_add(self, rhs: Self) -> Self {
self.checked_add(rhs).unwrap_or_else(die)
}
}
impl ForceAdd for u32 {
fn force_add(self, rhs: Self) -> Self {
self.checked_add(rhs).unwrap_or_else(die)
}
}
impl ForceAdd for u64 {
fn force_add(self, rhs: Self) -> Self {
self.checked_add(rhs).unwrap_or_else(die)
}
}
impl ForceAdd for usize {
fn force_add(self, rhs: Self) -> Self {
self.checked_add(rhs).unwrap_or_else(die)
}
}
pub(crate) trait ForceMul: Sized {
fn force_mul(self, rhs: Self) -> Self;
}
impl ForceMul for i32 {
fn force_mul(self, rhs: Self) -> Self {
self.checked_mul(rhs).unwrap_or_else(die)
}
}
impl ForceMul for i64 {
fn force_mul(self, rhs: Self) -> Self {
self.checked_mul(rhs).unwrap_or_else(die)
}
}
impl ForceMul for u64 {
fn force_mul(self, rhs: Self) -> Self {
self.checked_mul(rhs).unwrap_or_else(die)
}
}
pub(crate) trait ForceInto {
fn force_into<U>(self) -> U
where
Self: TryInto<U>;
}
impl<T> ForceInto for T {
fn force_into<U>(self) -> U
where
Self: TryInto<U>,
{
<Self as TryInto<U>>::try_into(self)
.ok()
.unwrap_or_else(die)
}
}
// Deterministically abort on arithmetic overflow, instead of wrapping and
// continuing with invalid behavior.
//
// This is impossible or nearly impossible to hit as the arithmetic computations
// in libyaml are all related to either:
//
// - small integer processing (ascii, hex digits)
// - allocation sizing
//
// and the only allocations in libyaml are for fixed-sized objects and
// geometrically growing buffers with a growth factor of 2. So in order for an
// allocation computation to overflow usize, the previous allocation for that
// container must have been filled to a size of usize::MAX/2, which is an
// allocation that would have failed in the allocator. But we check for this to
// be pedantic and to find out if it ever does happen.
//
// No-std abort is implemented using a double panic. On most platforms the
// current mechanism for this is for core::intrinsics::abort to invoke an
// invalid instruction. On Unix, the process will probably terminate with a
// signal like SIGABRT, SIGILL, SIGTRAP, SIGSEGV or SIGBUS. The precise
// behaviour is not guaranteed and not stable, but is safe.
#[cold]
pub(crate) fn die<T>() -> T {
struct PanicAgain;
impl Drop for PanicAgain {
fn drop(&mut self) {
panic!("arithmetic overflow");
}
}
fn do_die() -> ! {
let _panic_again = PanicAgain;
panic!("arithmetic overflow");
}
do_die();
}

1352
vendor/unsafe-libyaml/src/parser.rs vendored Normal file

File diff suppressed because it is too large Load Diff

468
vendor/unsafe-libyaml/src/reader.rs vendored Normal file
View File

@@ -0,0 +1,468 @@
use crate::externs::{memcmp, memmove};
use crate::ops::ForceAdd as _;
use crate::success::{Success, FAIL, OK};
use crate::yaml::{size_t, yaml_char_t};
use crate::{
libc, yaml_parser_t, PointerExt, YAML_ANY_ENCODING, YAML_READER_ERROR, YAML_UTF16BE_ENCODING,
YAML_UTF16LE_ENCODING, YAML_UTF8_ENCODING,
};
use core::ptr::addr_of_mut;
unsafe fn yaml_parser_set_reader_error(
parser: *mut yaml_parser_t,
problem: *const libc::c_char,
offset: size_t,
value: libc::c_int,
) -> Success {
(*parser).error = YAML_READER_ERROR;
let fresh0 = addr_of_mut!((*parser).problem);
*fresh0 = problem;
(*parser).problem_offset = offset;
(*parser).problem_value = value;
FAIL
}
const BOM_UTF8: *const libc::c_char = b"\xEF\xBB\xBF\0" as *const u8 as *const libc::c_char;
const BOM_UTF16LE: *const libc::c_char = b"\xFF\xFE\0" as *const u8 as *const libc::c_char;
const BOM_UTF16BE: *const libc::c_char = b"\xFE\xFF\0" as *const u8 as *const libc::c_char;
unsafe fn yaml_parser_determine_encoding(parser: *mut yaml_parser_t) -> Success {
while !(*parser).eof
&& ((*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer) as libc::c_long)
< 3_i64
{
if yaml_parser_update_raw_buffer(parser).fail {
return FAIL;
}
}
if (*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer) as libc::c_long
>= 2_i64
&& memcmp(
(*parser).raw_buffer.pointer as *const libc::c_void,
BOM_UTF16LE as *const libc::c_void,
2_u64,
) == 0
{
(*parser).encoding = YAML_UTF16LE_ENCODING;
let fresh1 = addr_of_mut!((*parser).raw_buffer.pointer);
*fresh1 = (*fresh1).wrapping_offset(2_isize);
let fresh2 = addr_of_mut!((*parser).offset);
*fresh2 = (*fresh2 as libc::c_ulong).force_add(2_u64) as size_t;
} else if (*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer) as libc::c_long
>= 2_i64
&& memcmp(
(*parser).raw_buffer.pointer as *const libc::c_void,
BOM_UTF16BE as *const libc::c_void,
2_u64,
) == 0
{
(*parser).encoding = YAML_UTF16BE_ENCODING;
let fresh3 = addr_of_mut!((*parser).raw_buffer.pointer);
*fresh3 = (*fresh3).wrapping_offset(2_isize);
let fresh4 = addr_of_mut!((*parser).offset);
*fresh4 = (*fresh4 as libc::c_ulong).force_add(2_u64) as size_t;
} else if (*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer) as libc::c_long
>= 3_i64
&& memcmp(
(*parser).raw_buffer.pointer as *const libc::c_void,
BOM_UTF8 as *const libc::c_void,
3_u64,
) == 0
{
(*parser).encoding = YAML_UTF8_ENCODING;
let fresh5 = addr_of_mut!((*parser).raw_buffer.pointer);
*fresh5 = (*fresh5).wrapping_offset(3_isize);
let fresh6 = addr_of_mut!((*parser).offset);
*fresh6 = (*fresh6 as libc::c_ulong).force_add(3_u64) as size_t;
} else {
(*parser).encoding = YAML_UTF8_ENCODING;
}
OK
}
unsafe fn yaml_parser_update_raw_buffer(parser: *mut yaml_parser_t) -> Success {
let mut size_read: size_t = 0_u64;
if (*parser).raw_buffer.start == (*parser).raw_buffer.pointer
&& (*parser).raw_buffer.last == (*parser).raw_buffer.end
{
return OK;
}
if (*parser).eof {
return OK;
}
if (*parser).raw_buffer.start < (*parser).raw_buffer.pointer
&& (*parser).raw_buffer.pointer < (*parser).raw_buffer.last
{
memmove(
(*parser).raw_buffer.start as *mut libc::c_void,
(*parser).raw_buffer.pointer as *const libc::c_void,
(*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer) as libc::c_long
as libc::c_ulong,
);
}
let fresh7 = addr_of_mut!((*parser).raw_buffer.last);
*fresh7 = (*fresh7).wrapping_offset(
-((*parser)
.raw_buffer
.pointer
.c_offset_from((*parser).raw_buffer.start) as libc::c_long as isize),
);
let fresh8 = addr_of_mut!((*parser).raw_buffer.pointer);
*fresh8 = (*parser).raw_buffer.start;
if (*parser).read_handler.expect("non-null function pointer")(
(*parser).read_handler_data,
(*parser).raw_buffer.last,
(*parser)
.raw_buffer
.end
.c_offset_from((*parser).raw_buffer.last) as size_t,
addr_of_mut!(size_read),
) == 0
{
return yaml_parser_set_reader_error(
parser,
b"input error\0" as *const u8 as *const libc::c_char,
(*parser).offset,
-1,
);
}
let fresh9 = addr_of_mut!((*parser).raw_buffer.last);
*fresh9 = (*fresh9).wrapping_offset(size_read as isize);
if size_read == 0 {
(*parser).eof = true;
}
OK
}
pub(crate) unsafe fn yaml_parser_update_buffer(
parser: *mut yaml_parser_t,
length: size_t,
) -> Success {
let mut first = true;
__assert!(((*parser).read_handler).is_some());
if (*parser).eof && (*parser).raw_buffer.pointer == (*parser).raw_buffer.last {
return OK;
}
if (*parser).unread >= length {
return OK;
}
if (*parser).encoding == YAML_ANY_ENCODING {
if yaml_parser_determine_encoding(parser).fail {
return FAIL;
}
}
if (*parser).buffer.start < (*parser).buffer.pointer
&& (*parser).buffer.pointer < (*parser).buffer.last
{
let size: size_t = (*parser)
.buffer
.last
.c_offset_from((*parser).buffer.pointer) as size_t;
memmove(
(*parser).buffer.start as *mut libc::c_void,
(*parser).buffer.pointer as *const libc::c_void,
size,
);
let fresh10 = addr_of_mut!((*parser).buffer.pointer);
*fresh10 = (*parser).buffer.start;
let fresh11 = addr_of_mut!((*parser).buffer.last);
*fresh11 = (*parser).buffer.start.wrapping_offset(size as isize);
} else if (*parser).buffer.pointer == (*parser).buffer.last {
let fresh12 = addr_of_mut!((*parser).buffer.pointer);
*fresh12 = (*parser).buffer.start;
let fresh13 = addr_of_mut!((*parser).buffer.last);
*fresh13 = (*parser).buffer.start;
}
while (*parser).unread < length {
if !first || (*parser).raw_buffer.pointer == (*parser).raw_buffer.last {
if yaml_parser_update_raw_buffer(parser).fail {
return FAIL;
}
}
first = false;
while (*parser).raw_buffer.pointer != (*parser).raw_buffer.last {
let mut value: libc::c_uint = 0;
let value2: libc::c_uint;
let mut incomplete = false;
let mut octet: libc::c_uchar;
let mut width: libc::c_uint = 0;
let low: libc::c_int;
let high: libc::c_int;
let mut k: size_t;
let raw_unread: size_t = (*parser)
.raw_buffer
.last
.c_offset_from((*parser).raw_buffer.pointer)
as size_t;
match (*parser).encoding {
YAML_UTF8_ENCODING => {
octet = *(*parser).raw_buffer.pointer;
width = if octet & 0x80 == 0 {
1
} else if octet & 0xE0 == 0xC0 {
2
} else if octet & 0xF0 == 0xE0 {
3
} else if octet & 0xF8 == 0xF0 {
4
} else {
0
} as libc::c_uint;
if width == 0 {
return yaml_parser_set_reader_error(
parser,
b"invalid leading UTF-8 octet\0" as *const u8 as *const libc::c_char,
(*parser).offset,
octet as libc::c_int,
);
}
if width as libc::c_ulong > raw_unread {
if (*parser).eof {
return yaml_parser_set_reader_error(
parser,
b"incomplete UTF-8 octet sequence\0" as *const u8
as *const libc::c_char,
(*parser).offset,
-1,
);
}
incomplete = true;
} else {
value = if octet & 0x80 == 0 {
octet & 0x7F
} else if octet & 0xE0 == 0xC0 {
octet & 0x1F
} else if octet & 0xF0 == 0xE0 {
octet & 0xF
} else if octet & 0xF8 == 0xF0 {
octet & 0x7
} else {
0
} as libc::c_uint;
k = 1_u64;
while k < width as libc::c_ulong {
octet = *(*parser).raw_buffer.pointer.wrapping_offset(k as isize);
if octet & 0xC0 != 0x80 {
return yaml_parser_set_reader_error(
parser,
b"invalid trailing UTF-8 octet\0" as *const u8
as *const libc::c_char,
(*parser).offset.force_add(k),
octet as libc::c_int,
);
}
value = (value << 6).force_add((octet & 0x3F) as libc::c_uint);
k = k.force_add(1);
}
if !(width == 1
|| width == 2 && value >= 0x80
|| width == 3 && value >= 0x800
|| width == 4 && value >= 0x10000)
{
return yaml_parser_set_reader_error(
parser,
b"invalid length of a UTF-8 sequence\0" as *const u8
as *const libc::c_char,
(*parser).offset,
-1,
);
}
if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
return yaml_parser_set_reader_error(
parser,
b"invalid Unicode character\0" as *const u8 as *const libc::c_char,
(*parser).offset,
value as libc::c_int,
);
}
}
}
YAML_UTF16LE_ENCODING | YAML_UTF16BE_ENCODING => {
low = if (*parser).encoding == YAML_UTF16LE_ENCODING {
0
} else {
1
};
high = if (*parser).encoding == YAML_UTF16LE_ENCODING {
1
} else {
0
};
if raw_unread < 2_u64 {
if (*parser).eof {
return yaml_parser_set_reader_error(
parser,
b"incomplete UTF-16 character\0" as *const u8
as *const libc::c_char,
(*parser).offset,
-1,
);
}
incomplete = true;
} else {
value = (*(*parser).raw_buffer.pointer.wrapping_offset(low as isize)
as libc::c_int
+ ((*(*parser).raw_buffer.pointer.wrapping_offset(high as isize)
as libc::c_int)
<< 8)) as libc::c_uint;
if value & 0xFC00 == 0xDC00 {
return yaml_parser_set_reader_error(
parser,
b"unexpected low surrogate area\0" as *const u8
as *const libc::c_char,
(*parser).offset,
value as libc::c_int,
);
}
if value & 0xFC00 == 0xD800 {
width = 4;
if raw_unread < 4_u64 {
if (*parser).eof {
return yaml_parser_set_reader_error(
parser,
b"incomplete UTF-16 surrogate pair\0" as *const u8
as *const libc::c_char,
(*parser).offset,
-1,
);
}
incomplete = true;
} else {
value2 = (*(*parser)
.raw_buffer
.pointer
.wrapping_offset((low + 2) as isize)
as libc::c_int
+ ((*(*parser)
.raw_buffer
.pointer
.wrapping_offset((high + 2) as isize)
as libc::c_int)
<< 8))
as libc::c_uint;
if value2 & 0xFC00 != 0xDC00 {
return yaml_parser_set_reader_error(
parser,
b"expected low surrogate area\0" as *const u8
as *const libc::c_char,
(*parser).offset.force_add(2_u64),
value2 as libc::c_int,
);
}
value = 0x10000_u32
.force_add((value & 0x3FF) << 10)
.force_add(value2 & 0x3FF);
}
} else {
width = 2;
}
}
}
_ => {}
}
if incomplete {
break;
}
if !(value == 0x9
|| value == 0xA
|| value == 0xD
|| value >= 0x20 && value <= 0x7E
|| value == 0x85
|| value >= 0xA0 && value <= 0xD7FF
|| value >= 0xE000 && value <= 0xFFFD
|| value >= 0x10000 && value <= 0x10FFFF)
{
return yaml_parser_set_reader_error(
parser,
b"control characters are not allowed\0" as *const u8 as *const libc::c_char,
(*parser).offset,
value as libc::c_int,
);
}
let fresh14 = addr_of_mut!((*parser).raw_buffer.pointer);
*fresh14 = (*fresh14).wrapping_offset(width as isize);
let fresh15 = addr_of_mut!((*parser).offset);
*fresh15 = (*fresh15 as libc::c_ulong).force_add(width as libc::c_ulong) as size_t;
if value <= 0x7F {
let fresh16 = addr_of_mut!((*parser).buffer.last);
let fresh17 = *fresh16;
*fresh16 = (*fresh16).wrapping_offset(1);
*fresh17 = value as yaml_char_t;
} else if value <= 0x7FF {
let fresh18 = addr_of_mut!((*parser).buffer.last);
let fresh19 = *fresh18;
*fresh18 = (*fresh18).wrapping_offset(1);
*fresh19 = 0xC0_u32.force_add(value >> 6) as yaml_char_t;
let fresh20 = addr_of_mut!((*parser).buffer.last);
let fresh21 = *fresh20;
*fresh20 = (*fresh20).wrapping_offset(1);
*fresh21 = 0x80_u32.force_add(value & 0x3F) as yaml_char_t;
} else if value <= 0xFFFF {
let fresh22 = addr_of_mut!((*parser).buffer.last);
let fresh23 = *fresh22;
*fresh22 = (*fresh22).wrapping_offset(1);
*fresh23 = 0xE0_u32.force_add(value >> 12) as yaml_char_t;
let fresh24 = addr_of_mut!((*parser).buffer.last);
let fresh25 = *fresh24;
*fresh24 = (*fresh24).wrapping_offset(1);
*fresh25 = 0x80_u32.force_add(value >> 6 & 0x3F) as yaml_char_t;
let fresh26 = addr_of_mut!((*parser).buffer.last);
let fresh27 = *fresh26;
*fresh26 = (*fresh26).wrapping_offset(1);
*fresh27 = 0x80_u32.force_add(value & 0x3F) as yaml_char_t;
} else {
let fresh28 = addr_of_mut!((*parser).buffer.last);
let fresh29 = *fresh28;
*fresh28 = (*fresh28).wrapping_offset(1);
*fresh29 = 0xF0_u32.force_add(value >> 18) as yaml_char_t;
let fresh30 = addr_of_mut!((*parser).buffer.last);
let fresh31 = *fresh30;
*fresh30 = (*fresh30).wrapping_offset(1);
*fresh31 = 0x80_u32.force_add(value >> 12 & 0x3F) as yaml_char_t;
let fresh32 = addr_of_mut!((*parser).buffer.last);
let fresh33 = *fresh32;
*fresh32 = (*fresh32).wrapping_offset(1);
*fresh33 = 0x80_u32.force_add(value >> 6 & 0x3F) as yaml_char_t;
let fresh34 = addr_of_mut!((*parser).buffer.last);
let fresh35 = *fresh34;
*fresh34 = (*fresh34).wrapping_offset(1);
*fresh35 = 0x80_u32.force_add(value & 0x3F) as yaml_char_t;
}
let fresh36 = addr_of_mut!((*parser).unread);
*fresh36 = (*fresh36).force_add(1);
}
if (*parser).eof {
let fresh37 = addr_of_mut!((*parser).buffer.last);
let fresh38 = *fresh37;
*fresh37 = (*fresh37).wrapping_offset(1);
*fresh38 = b'\0';
let fresh39 = addr_of_mut!((*parser).unread);
*fresh39 = (*fresh39).force_add(1);
return OK;
}
}
if (*parser).offset >= (!0_u64).wrapping_div(2_u64) {
return yaml_parser_set_reader_error(
parser,
b"input is too long\0" as *const u8 as *const libc::c_char,
(*parser).offset,
-1,
);
}
OK
}

2691
vendor/unsafe-libyaml/src/scanner.rs vendored Normal file

File diff suppressed because it is too large Load Diff

25
vendor/unsafe-libyaml/src/success.rs vendored Normal file
View File

@@ -0,0 +1,25 @@
use core::ops::Deref;
pub const OK: Success = Success { ok: true };
pub const FAIL: Success = Success { ok: false };
#[must_use]
pub struct Success {
pub ok: bool,
}
pub struct Failure {
pub fail: bool,
}
impl Deref for Success {
type Target = Failure;
fn deref(&self) -> &Self::Target {
if self.ok {
&Failure { fail: false }
} else {
&Failure { fail: true }
}
}
}

149
vendor/unsafe-libyaml/src/writer.rs vendored Normal file
View File

@@ -0,0 +1,149 @@
use crate::ops::ForceAdd as _;
use crate::success::{Success, FAIL, OK};
use crate::yaml::size_t;
use crate::{
libc, yaml_emitter_t, PointerExt, YAML_ANY_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF8_ENCODING,
YAML_WRITER_ERROR,
};
use core::ptr::addr_of_mut;
unsafe fn yaml_emitter_set_writer_error(
emitter: *mut yaml_emitter_t,
problem: *const libc::c_char,
) -> Success {
(*emitter).error = YAML_WRITER_ERROR;
let fresh0 = addr_of_mut!((*emitter).problem);
*fresh0 = problem;
FAIL
}
/// Flush the accumulated characters to the output.
pub unsafe fn yaml_emitter_flush(emitter: *mut yaml_emitter_t) -> Success {
__assert!(!emitter.is_null());
__assert!(((*emitter).write_handler).is_some());
__assert!((*emitter).encoding != YAML_ANY_ENCODING);
let fresh1 = addr_of_mut!((*emitter).buffer.last);
*fresh1 = (*emitter).buffer.pointer;
let fresh2 = addr_of_mut!((*emitter).buffer.pointer);
*fresh2 = (*emitter).buffer.start;
if (*emitter).buffer.start == (*emitter).buffer.last {
return OK;
}
if (*emitter).encoding == YAML_UTF8_ENCODING {
if (*emitter).write_handler.expect("non-null function pointer")(
(*emitter).write_handler_data,
(*emitter).buffer.start,
(*emitter)
.buffer
.last
.c_offset_from((*emitter).buffer.start) as size_t,
) != 0
{
let fresh3 = addr_of_mut!((*emitter).buffer.last);
*fresh3 = (*emitter).buffer.start;
let fresh4 = addr_of_mut!((*emitter).buffer.pointer);
*fresh4 = (*emitter).buffer.start;
return OK;
} else {
return yaml_emitter_set_writer_error(
emitter,
b"write error\0" as *const u8 as *const libc::c_char,
);
}
}
let low: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING {
0
} else {
1
};
let high: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING {
1
} else {
0
};
while (*emitter).buffer.pointer != (*emitter).buffer.last {
let mut octet: libc::c_uchar;
let mut value: libc::c_uint;
let mut k: size_t;
octet = *(*emitter).buffer.pointer;
let width: libc::c_uint = if octet & 0x80 == 0 {
1
} else if octet & 0xE0 == 0xC0 {
2
} else if octet & 0xF0 == 0xE0 {
3
} else if octet & 0xF8 == 0xF0 {
4
} else {
0
} as libc::c_uint;
value = if octet & 0x80 == 0 {
octet & 0x7F
} else if octet & 0xE0 == 0xC0 {
octet & 0x1F
} else if octet & 0xF0 == 0xE0 {
octet & 0xF
} else if octet & 0xF8 == 0xF0 {
octet & 0x7
} else {
0
} as libc::c_uint;
k = 1_u64;
while k < width as libc::c_ulong {
octet = *(*emitter).buffer.pointer.wrapping_offset(k as isize);
value = (value << 6).force_add((octet & 0x3F) as libc::c_uint);
k = k.force_add(1);
}
let fresh5 = addr_of_mut!((*emitter).buffer.pointer);
*fresh5 = (*fresh5).wrapping_offset(width as isize);
if value < 0x10000 {
*(*emitter).raw_buffer.last.wrapping_offset(high as isize) =
(value >> 8) as libc::c_uchar;
*(*emitter).raw_buffer.last.wrapping_offset(low as isize) =
(value & 0xFF) as libc::c_uchar;
let fresh6 = addr_of_mut!((*emitter).raw_buffer.last);
*fresh6 = (*fresh6).wrapping_offset(2_isize);
} else {
value = value.wrapping_sub(0x10000);
*(*emitter).raw_buffer.last.wrapping_offset(high as isize) =
0xD8_u32.force_add(value >> 18) as libc::c_uchar;
*(*emitter).raw_buffer.last.wrapping_offset(low as isize) =
(value >> 10 & 0xFF) as libc::c_uchar;
*(*emitter)
.raw_buffer
.last
.wrapping_offset((high + 2) as isize) =
0xDC_u32.force_add(value >> 8 & 0xFF) as libc::c_uchar;
*(*emitter)
.raw_buffer
.last
.wrapping_offset((low + 2) as isize) = (value & 0xFF) as libc::c_uchar;
let fresh7 = addr_of_mut!((*emitter).raw_buffer.last);
*fresh7 = (*fresh7).wrapping_offset(4_isize);
}
}
if (*emitter).write_handler.expect("non-null function pointer")(
(*emitter).write_handler_data,
(*emitter).raw_buffer.start,
(*emitter)
.raw_buffer
.last
.c_offset_from((*emitter).raw_buffer.start) as size_t,
) != 0
{
let fresh8 = addr_of_mut!((*emitter).buffer.last);
*fresh8 = (*emitter).buffer.start;
let fresh9 = addr_of_mut!((*emitter).buffer.pointer);
*fresh9 = (*emitter).buffer.start;
let fresh10 = addr_of_mut!((*emitter).raw_buffer.last);
*fresh10 = (*emitter).raw_buffer.start;
let fresh11 = addr_of_mut!((*emitter).raw_buffer.pointer);
*fresh11 = (*emitter).raw_buffer.start;
OK
} else {
yaml_emitter_set_writer_error(
emitter,
b"write error\0" as *const u8 as *const libc::c_char,
)
}
}

1282
vendor/unsafe-libyaml/src/yaml.rs vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
{"name":"unsafe-libyaml","vers":"0.2.11","deps":[{"name":"pretty_assertions","req":"^1.0","features":[],"optional":false,"default_features":true,"target":null,"kind":"dev","registry":"https://github.com/rust-lang/crates.io-index","package":null,"public":null,"artifact":null,"bindep_target":null,"lib":false}],"features":{},"features2":null,"cksum":"4200b618286ebe78b56f91987593c05caebb829bcaec81f01f7bdb2de18e9c5f","yanked":null,"links":null,"rust_version":null,"v":2}

Binary file not shown.

48
vendor/unsafe-libyaml/tests/bin/mod.rs vendored Normal file
View File

@@ -0,0 +1,48 @@
use std::error::Error;
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;
use std::process::{Command, Stdio};
pub struct Output {
pub success: bool,
pub stdout: Vec<u8>,
pub stderr: Vec<u8>,
}
pub fn run(
compiled: &str,
unsafe_main: unsafe fn(
stdin: &mut dyn Read,
stdout: &mut dyn Write,
) -> Result<(), Box<dyn Error>>,
input: &Path,
) -> Output {
if cfg!(miri) {
let mut input = File::open(input).unwrap();
let mut stdout = Vec::new();
let result = unsafe { unsafe_main(&mut input, &mut stdout) };
Output {
success: result.is_ok(),
stdout,
stderr: result
.err()
.as_ref()
.map_or_else(String::new, ToString::to_string)
.into(),
}
} else {
let output = Command::new(compiled)
.arg(input)
.stdin(Stdio::null())
.output()
.unwrap();
Output {
success: output.status.success(),
stdout: output.stdout,
stderr: output.stderr,
}
}
}

View File

@@ -0,0 +1,72 @@
26DV: Whitespace around colon in mappings
2EBW: Allowed characters in keys
2JQS: Block Mapping with Missing Keys
2LFX: Spec Example 6.13. Reserved Directives [1.3]
2SXE: Anchors With Colon in Name
2XXW: Spec Example 2.25. Unordered Sets
3MYT: Plain Scalar looking like key, comment, anchor and tag
4ABK: Spec Example 7.17. Flow Mapping Separate Values
4MUZ: Flow mapping colon on line after key
4QFQ: Spec Example 8.2. Block Indentation Indicator [1.3]
52DL: Explicit Non-Specific Tag [1.3]
565N: Construct Binary
5TYM: Spec Example 6.21. Local Tag Prefix
5WE3: Spec Example 8.17. Explicit Block Mapping Entries
6CK3: Spec Example 6.26. Tag Shorthands
6FWR: Block Scalar Keep
6KGN: Anchor for empty node
6M2F: Aliases in Explicit Block Mapping
6PBE: Zero-indented sequences in explicit mapping keys
6SLA: Allowed characters in quoted mapping key
6WLZ: Spec Example 6.18. Primary Tag Handle [1.3]
6WPF: Spec Example 6.8. Flow Folding [1.3]
6XDY: Two document start markers
6ZKB: Spec Example 9.6. Stream
7T8X: Spec Example 8.10. Folded Lines - 8.13. Final Empty Lines
7W2P: Block Mapping with Missing Values
7Z25: Bare document after document end marker
8KB6: Multiline plain flow mapping key without value
8XYN: Anchor with unicode character
9BXH: Multiline doublequoted flow mapping key without value
8MK2: Explicit Non-Specific Tag
9DXL: Spec Example 9.6. Stream [1.3]
9MMW: Spec Example 7.21. Single Pair Implicit Entries [1.3
9TFX: Spec Example 7.6. Double Quoted Lines [1.3]
B3HG: Spec Example 8.9. Folded Scalar [1.3]
C2DT: Spec Example 7.18. Flow Mapping Adjacent Values
DFF7: Spec Example 7.16. Flow Mapping Entries
E76Z: Aliases in Implicit Block Mapping
EX5H: Multiline Scalar at Top Level [1.3]
EXG3: Three dashes and content without space [1.3]
FBC9: Allowed characters in plain scalars
FH7J: Tags on Empty Scalars
FRK4: Spec Example 7.3. Completely Empty Flow Nodes
J3BT: Spec Example 5.12. Tabs and Spaces
JDH8: Plain Scalar looking like key, comment, anchor and tag [1.3]
JTV5: Block Mapping with Multiline Scalars
K54U: Tab after document header
KK5P: Various combinations of explicit block mappings
KSS4: Scalars on --- line
KZN9: Spec Example 7.21. Single Pair Implicit Entries
LE5A: Spec Example 7.24. Flow Nodes
M7A3: Spec Example 9.3. Bare Documents
M9B4: Spec Example 8.7. Literal Scalar
NAT4: Various empty or newline only quoted strings
NHX8: Empty Lines at End of Document
PUW8: Document start on last line
PW8X: Anchors on Empty Scalars
Q8AD: Spec Example 7.5. Double Quoted Line Breaks [1.3]
S3PD: Spec Example 8.18. Implicit Block Mapping Entries
S4JQ: Spec Example 6.28. Non-Specific Tags
T26H: Spec Example 8.8. Literal Content [1.3]
T4YY: Spec Example 7.9. Single Quoted Lines [1.3]
T5N4: Spec Example 8.7. Literal Scalar [1.3]
UT92: Spec Example 9.4. Explicit Documents
W42U: Spec Example 8.15. Block Sequence Entry Types
W4TN: Spec Example 9.5. Directives Documents
W5VH: Allowed characters in alias
WZ62: Spec Example 7.2. Empty Content
X38W: Aliases in Flow Objects
XLQ9: Multiline scalar that looks like a YAML directive
Y2GN: Anchor with colon in the middle
ZWK4: Key with anchor after missing explicit mapping value

View File

@@ -0,0 +1,34 @@
2JQS: Block Mapping with Missing Keys
2LFX: Spec Example 6.13. Reserved Directives [1.3]
2SXE: Anchors With Colon in Name
4ABK: Spec Example 7.17. Flow Mapping Separate Values
4MUZ: Flow mapping colon on line after key
5MUD: Colon and adjacent value on next line
6BCT: Spec Example 6.3. Separation Spaces
6LVF: Spec Example 6.13. Reserved Directives
6M2F: Aliases in Explicit Block Mapping
7Z25: Bare document after document end marker
8XYN: Anchor with unicode character
9MMW: Spec Example 7.21. Single Pair Implicit Entries [1.3
9SA2: Multiline double quoted flow mapping key
A2M4: Spec Example 6.2. Indentation Indicators
BEC7: Spec Example 6.14. “YAML” directive
DBG4: Spec Example 7.10. Plain Characters
DK3J: Zero indented block scalar with line that looks like a comment
FP8R: Zero indented block scalar
FRK4: Spec Example 7.3. Completely Empty Flow Nodes
HWV9: Document-end marker
K3WX: Colon and adjacent value after comment on next line
KZN9: Spec Example 7.21. Single Pair Implicit Entries
M7A3: Spec Example 9.3. Bare Documents
NHX8: Empty Lines at End of Document
NJ66: Multiline plain flow mapping key
Q5MG: Tab at beginning of line followed by a flow mapping
QT73: Comment and document-end marker
R4YG: Spec Example 8.2. Block Indentation Indicator
S3PD: Spec Example 8.18. Implicit Block Mapping Entries
UT92: Spec Example 9.4. Explicit Documents
W4TN: Spec Example 9.5. Directives Documents
W5VH: Allowed characters in alias
WZ62: Spec Example 7.2. Empty Content
Y2GN: Anchor with colon in the middle

View File

@@ -0,0 +1,10 @@
9C9N: Wrong indented flow sequence
9HCY: Need document footer before directives
9JBA: Invalid comment after end of flow sequence
CVW2: Invalid comment after comma
EB22: Missing document-end marker before directive
QB6E: Wrong indented multiline quoted scalar
RHX7: YAML directive without document end marker
S98Z: Block scalar with more spaces than first content line
SU5Z: Comment without whitespace after doublequoted scalar
X4QW: Comment without whitespace after block scalar indicator

View File

@@ -0,0 +1,37 @@
#![allow(clippy::type_complexity)]
mod bin;
#[path = "../src/bin/run-emitter-test-suite.rs"]
#[allow(dead_code)]
mod run_emitter_test_suite;
use std::fs;
use std::path::Path;
fn test(id: &str) {
let dir = Path::new("tests")
.join("data")
.join("yaml-test-suite")
.join(id);
let output = bin::run(
env!("CARGO_BIN_EXE_run-emitter-test-suite"),
run_emitter_test_suite::unsafe_main,
&dir.join("test.event"),
);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
eprint!("{}", stderr);
let out = if dir.join("out.yaml").exists() {
dir.join("out.yaml")
} else {
dir.join("in.yaml")
};
let expected = fs::read_to_string(out).unwrap();
pretty_assertions::assert_str_eq!(expected, stdout);
assert!(output.success);
}
unsafe_libyaml_test_suite::test_emitter!();

View File

@@ -0,0 +1,32 @@
#![allow(clippy::type_complexity)]
mod bin;
#[path = "../src/bin/run-parser-test-suite.rs"]
#[allow(dead_code)]
mod run_parser_test_suite;
use std::fs;
use std::path::Path;
fn test(id: &str) {
let dir = Path::new("tests")
.join("data")
.join("yaml-test-suite")
.join(id);
let output = bin::run(
env!("CARGO_BIN_EXE_run-parser-test-suite"),
run_parser_test_suite::unsafe_main,
&dir.join("in.yaml"),
);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
eprint!("{}", stderr);
let expected = fs::read_to_string(dir.join("test.event")).unwrap();
pretty_assertions::assert_str_eq!(expected, stdout);
assert!(output.success);
}
unsafe_libyaml_test_suite::test_parser!();

View File

@@ -0,0 +1,31 @@
#![allow(clippy::type_complexity)]
mod bin;
#[path = "../src/bin/run-parser-test-suite.rs"]
#[allow(dead_code)]
mod run_parser_test_suite;
use std::path::Path;
fn test(id: &str) {
let dir = Path::new("tests")
.join("data")
.join("yaml-test-suite")
.join(id);
let output = bin::run(
env!("CARGO_BIN_EXE_run-parser-test-suite"),
run_parser_test_suite::unsafe_main,
&dir.join("in.yaml"),
);
if output.success {
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
eprint!("{}", stdout);
eprint!("{}", stderr);
panic!("expected parse to fail");
}
}
unsafe_libyaml_test_suite::test_parser_error!();