From b8d46b0495d00815a699932ced0b43955c949ab9 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 1 Aug 2026 04:52:50 +0900 Subject: feat(php-src): add a BSD-licensed crate for php-src derived code The audit in .ken/php-shim-copying.md judged 14 functions in shirabe-php-shim (plus php_wordwrap in shirabe-external-packages) to be line-by-line transcriptions or structural imitations of php-src. PHP's relicensing to 3-clause BSD makes keeping them legal, but the boundary between BSD-derived and MIT code was invisible in the source tree. Moving them into their own crate puts the license into the build metadata (so NOTICE generation follows the binary), makes a reverse dependency a compile error, and encodes the origin in the module path, which mirrors php-src's ext tree. Each function records its origin in a fixed-format doc comment, and a new php_src_derivation_boundary linter fails if `php-src` appears in any Rust source outside the crate. Public paths under shirabe_php_shim:: are unchanged: functions that are themselves derived are re-exported with `pub use`, and the wrappers that only validate arguments stay on the MIT side. This also resolves the duplicate wordwrap implementation. shirabe_php_shim::wordwrap was todo!(), so SymfonyStyle::block panicked, while shirabe-external-packages carried its own copy. Both now go through the single port, verified against real PHP on 13 cases covering multi-character breaks and cut. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe-php-src/src/lib.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 crates/shirabe-php-src/src/lib.rs (limited to 'crates/shirabe-php-src/src/lib.rs') diff --git a/crates/shirabe-php-src/src/lib.rs b/crates/shirabe-php-src/src/lib.rs new file mode 100644 index 00000000..1e2c2a0f --- /dev/null +++ b/crates/shirabe-php-src/src/lib.rs @@ -0,0 +1,19 @@ +//! Rust port from the original C implementation in php-src. +//! See `LICENSE.md` at the repository root. +//! +//! Rules for this crate: +//! +//! * Any code written while looking at php-src belongs here, and nowhere else. `shirabe-php-shim` +//! must not contain php-src derived code; it depends on this crate instead. +//! * The dependency direction is `shirabe-php-shim` -> `shirabe-php-src` only. This crate must not +//! depend on any other crate in the workspace, so that BSD-derived code cannot pull in +//! MIT-licensed types. +//! * The module layout mirrors php-src's own tree (`src/standard/string.rs` holds code derived +//! from `ext/standard/string.c`), so the origin of a function is visible from its path. +//! * Every item carries a fixed-format origin comment: +//! +//! ```text +//! /// php-src: ext/standard/strnatcmp.c `strnatcmp_ex` (PHP 8.5.2) +//! ``` + +pub mod standard; -- cgit v1.3.1