Revision history for Char-Replace 0.007 2026-02-10 11:42:03-07:00 America/Denver - New: code ref (callback) map entries for dynamic replacement in replace() — callback receives the character, return value becomes the replacement — return undef to keep original, empty string to delete — replace_inplace() croaks on code ref entries (use replace() instead) - Fix: memory leak when a code ref callback dies during replace() (reply SV was not freed on exception; now uses G_EVAL + croak_sv) - Fix taint propagation: replace() and trim() now correctly propagate the taint flag from input to output (previously laundered tainted data) - New trim_inplace(): zero-allocation in-place whitespace trimming (modifies string directly, returns count of bytes removed) - UTF-8 safety: multi-byte sequences (>= 0x80) are now copied through unchanged; replacement map is only applied to ASCII bytes (0x00-0x7F) - IV/NV map entries: integer values treated as character ordinals (chr) - Empty string map entries now delete the character from output - Fix off-by-one: map[255] is now reachable (>= vs > boundary) - Fix type safety: unsigned char for byte handling, STRLEN for loop vars - New replace_inplace(): zero-allocation in-place 1:1 byte replacement (up to 3.5x faster than replace() for long strings) - New build_map(): convenience constructor from char => replacement pairs - Perf: replace() writes directly into SV buffer (avoids temp alloc+copy) - Perf: precomputed 256-byte lookup table fast path for 1:1 maps in both replace() and replace_inplace() — eliminates per-byte SV type dispatch; replace() on long strings is now faster than Perl's tr/// - Refactor: extract UTF8_SEQ_LEN macro for shared UTF-8 byte handling 0.006 2025-11-21 16:07:16-07:00 America/Denver - Fix compiling issue with threaded Perl versions - Fix compiling warnings 0.005 2025-05-18 15:27:02-06:00 America/Denver - Fix compiler error due to incorrect pointer type in Newx cal 0.004 2019-01-30 13:04:14-06:00 America/Chicago - fix issue when growing a string containing a '\0' 0.003 2018-12-14 15:30:08-06:00 America/Chicago - add a trim XS helper (and some benchmark) with UTF-8 support - basic UTF-8 support for replace 0.002 2018-12-11 14:55:47-06:00 America/Chicago - fixup for non alphanumeric characters 0.001 2018-12-11 12:03:27-06:00 America/Chicago First version, this is a very alpha state use it at your own risk