Revision history for this software.

0.66  2026-07-18 JST (Japan Standard Time)
  - fix t/6101-6106 filetest tests: eliminate the sporadic MSWin32-only FAIL
    reported by CPAN Testers for mb-0.65 (t/6102_filetest.t, exactly 1 of
    4200 subtests, at a different subtest number in every report -- 1257,
    2048, 2150, 2636 on perl 5.16.3 / 5.10.1 / 5.22.2 / 5.8.9, all four on
    the same Windows smoker family; all other perl versions on the same
    machines and every non-Windows platform PASS).  Root cause was in the
    tests, not in lib/mb.pm: every subtest re-created its testee files and
    directories under ONE fixed name ("$tempdir/testee.A" etc.), unlinked
    them, and re-created the same name back-to-back thousands of times with
    the open()/mkdir() return value unchecked.  On MSWin32, unlink() is
    asynchronous (the name stays delete-pending for a moment and a same-name
    open() is rejected with access denied) and on-access virus scanners can
    hold a just-created file open, so once in a few thousand iterations one
    side of the CORE-vs-mb comparison saw a missing file, returned undef
    against a defined value, and that single subtest failed.  Fixed by
    (1) giving every subtest a serial-numbered testee name (no same-name
    re-creation, so a delete-pending name can never collide with the next
    create), (2) routing all creation through new make_testee_file() /
    make_testee_dir() helpers that check the result, retry briefly
    (5 x 0.1s), and on persistent transient failure return 'SKIP' for the
    subtest instead of FAIL, and (3) changing the END cleanup from rmdir()
    to File::Path::rmtree() so a leftover testee from a transient unlink
    failure cannot break the cleanup.  This change by itself leaves the test
    counts and the scalar(@test) plans unchanged (4200/4200/4200/5/4); the
    speed-up item (3) below then reduces the first three to 1134 each.  No
    lib/mb.pm code changed.
  - speed up the slowest tests so slow CPAN smokers (the same Windows
    machines as above) cannot hit the harness timeout:
    (1) t/3023_charclass_hyphen_gb18030.t, t/3026_charclass_hyphen_sjis.t,
    t/3027_charclass_hyphen_utf8_1of2.t, t/3028_charclass_hyphen_utf8_2of2.t
    generated their subtests in an n**3 loop that called mb::parse() and
    eval-compiled the result once PER SUBTEST although the transpiled
    character class depends only on the ($i,$j) range pair, not on the
    probed octet $lk; the transpilation and the eval compilation are now
    hoisted out of the $k loop (n**3 -> n**2 transpilations, one compiled
    closure pair per range).  Every subtest still exercises the same
    transpiled pattern against the same octets with the same expected
    result; the TAP output of all four files is byte-for-byte identical to
    the previous version (verified), the scalar(@test) plans are unchanged
    (18252/8400/33792/56316), and the four files together now run in about
    2 seconds instead of 34 seconds on the reference machine (whole suite:
    55 -> 17 seconds).
    (2) t/9082-examples.t spawned one child perl for every one of the 106
    eg/**/*.pl examples; under AUTOMATED_TESTING / NONINTERACTIVE_TESTING
    it now runs the first (sorted) example of each eg/ subdirectory (22
    children instead of 106) -- still smoke-testing every language
    directory -- and announces the sampling in a TAP comment.  Interactive
    runs and runs with PERL_MB_TEST_ALL_EG=1 keep executing all 106
    examples.  The plan is derived from scalar(@script) as before, so it
    always matches the mode.  No lib/mb.pm code changed.
    (3) t/6101_filetest.t, t/6102_filetest.t and t/6103_filetest.t ran 4200
    subtests each although only 1134 of them were distinct.  @tester listed
    all 27 file test operators of Perl and was then padded with 73 further
    copies of -A to round the subtest count up to 100 x 42 = 4200.  @tester
    is used one element at a time (it is never stacked as -X -Y -Z), so every
    padding copy merely re-ran the 42 subtests of -A -- 73% of the run time
    of each file for no extra coverage.  The padding is dropped: 27 x 42 =
    1134 subtests, every one of them distinct, and the plans follow
    scalar(@test) as before, so they adjust by themselves.  In addition
    t/6101_filetest.t sets $endchar = 'A', which makes "$filename.A" and
    "$filename.$endchar" one and the same file, so every subtest created that
    single testee twice and removed it twice; the second name is now touched
    only when it really is a second name.  Together these cut the testee files
    created by t/6101_filetest.t from 5100 to 729 and the testee directories
    from 2400 to 324, and -- because the duplicate was a same-name
    re-creation -- they also remove from t/6101_filetest.t the very MSWin32
    delete-pending / on-access virus scanner race that the first item of this
    release works around.  The TAP verdict of every retained subtest is
    identical to the previous version (verified subtest by subtest for all
    three files), and the three files together run about 3 times faster on the
    reference machine; the gain is larger on MSWin32, where the testee file
    I/O, not mb::eval(), dominates.  No lib/mb.pm code changed.
  - add encoding 'johab' (Johab, code page 1361 / KS X 1001:1992 annex 3): the
    two-octet DBCS with a DISCONTINUOUS lead [\x81-\xD3\xD8-\xDE\xE0-\xF9]
    (hangul \x81-\xD3, symbols \xD8-\xDE, hanja \xE0-\xF9) plus one trailing
    octet, verified against Microsoft's C run-time cp1361 lead/trail table
    (mbctype.c: lead 81..D3, D8..DE, E0..F9; trail 31..7E, 81..FE) and against
    Perl's Encode 'johab' mapping (which confirms 89 real characters carry the
    trailing octet \x5C).  No johab high byte is a single octet: \x00-\x7F are
    the only one-octet units, and the inter-region gaps \xD4-\xD7 and \xDF
    (plus \x80 and \xFA-\xFF) are not leads.  uhc (the sister two-octet Korean
    encoding) was the first template; every touchpoint that 0.65 added for
    hp15/informixv6als was followed.  $over_ascii, the multibyte anchor (all
    perl-version branches, discontinuous-lead form as hp15), mb::getc (a lead
    reads one more octet), the encoding allow-lists and "use one of" messages,
    and the old-package map (JOHAB::*) all gained johab.  Because the trailing
    octet 31..7E includes \x5C, johab also joined the MSWin32 trailing-\x5C
    filename paths (with its own discontinuous lead set added to mb::_chdir)
    and got a dedicated [A-Z]-hyphen routine list_all_by_hyphen_johab_like that
    intersects ranges with the exact discontinuous lead / US-ASCII single-octet
    sets (the contiguous-lead sjis/big5 helpers would mis-split; hp15 needed a
    dedicated helper for the same reason).  johab is never auto-detected and
    must be selected with -e.  POD: new "=head2 johab (Johab, code page 1361)"
    catalog entry with primary-source URLs; a Char-JOHAB / JOHAB row in the
    "Legacy single-encoding distributions mapped to mb encoding names" table;
    new "=head2 on johab encoding" sections in both the DAMEMOJI-escaping table
    (2nd octet [ \ ] { | } demonstrated on hangul lead \x89) and the
    qr'[[:class:]]' transpilation table; the encoding "supported ..." lists
    gained the name.  New t/1029_johab_structure.t (exercising mb::getc through
    a real filehandle, all three lead regions, buried \x5C and \x41, and
    truncation guards via $SIG{__WARN__}), t/3033_charclass_hyphen_johab.t
    (3600 boundary subtests across the three lead regions, both gaps, and the
    \x5C DAMEMOJI) and t/8114_old_package_johab.t; t/1013_valid_encodings.t
    gained johab accept cases; the 21 doc/mb_cheatsheet.*.txt encoding lists
    gained the name.
  - doc only: UTF8::R2-0.30 feature-parity review found the porting docs
    incomplete/misleading in three ways; all three fixed in lib/mb.pm POD,
    no code changes
    - "Porting from script with UTF8::R2 module": added a "Migration
      checklist" head2 spelling out that the port is mechanical, not
      automatic (mb.pm does not detect a pre-existing "use UTF8::R2" line)
    - same section: documented that "utf8" must be written explicitly in
      "use mb qw( *mb utf8 );" -- UTF8::R2 is always RFC3629(UTF-8) with no
      fallback, whereas "use mb qw( *mb );" without an encoding argument
      falls back to detect_system_encoding(), silently changing behaviour
      on a non-UTF-8 locale. this was the most likely porting mistake and
      was previously undocumented
    - "Using mb.pm Modulino vs. Using UTF8::R2 Module": added a note that
      the listed disadvantages of mb.pm (wrapper command, obtrusive
      *.oo.pl file) apply only to path 2 (modulino); path 1 (filter) and
      path 3 (runtime) carry neither disadvantage and were previously
      unmentioned in that comparison
  - eg only (Track A, no code changes to lib/mb.pm): added a set of runnable
    basic example scripts under eg/en/ (English) and eg/ja/ (Japanese) to
    make the "student -> CPAN contributor" path concrete.  Five scripts per
    language, each demonstrating one core feature against its CORE
    counterpart: mb_length.pl (mb::length/substr/index in character units vs
    CORE byte length), mb_split.pl (mb::split on character boundaries and on
    an MBCS delimiter vs CORE split //), mb_regexp.pl (mb::qr "." / class
    range / capture in whole characters), mb_tr.pl (mb::tr full-width ->
    half-width and DAMEMOJI safety, incl. the /r modifier) and
    mb_practical.pl (fixed-column trimming at a 1:2 half/full-width ratio
    without splitting a double-byte character).  All follow the eg/mb_length.pl
    convention: US-ASCII source with \xHH byte-escaped multibyte data (eg/ja/
    additionally carries Japanese-language POD/comments and is therefore
    UTF-8, like doc/), FindBin-based "use lib" so they run straight from the
    distribution root, and an explicit mb::set_script_encoding('sjis').  New
    t/9082-examples.t runs every eg/**/*.pl under -w in a child perl and
    requires a zero exit status and an empty STDERR (no warnings); its plan
    is derived from the discovered file count, not hardcoded.  MANIFEST gained
    the six new entries and t/9030-distribution.t exempts eg/ja/ from the
    US-ASCII check (eg/en/ stays strictly US-ASCII).
  - eg only (Track A, no code changes to lib/mb.pm): localized the five basic
    example scripts into the first batch of student mother tongues, matching
    the doc/mb_cheatsheet.*.txt language set: eg/ne/ (Nepali), eg/bn/ (Bengali),
    eg/vi/ (Vietnamese), eg/si/ (Sinhala), eg/my/ (Burmese) and eg/zh/ (Chinese,
    simplified).  Each dir carries the same five scripts (mb_length.pl,
    mb_split.pl, mb_regexp.pl, mb_tr.pl, mb_practical.pl).  Only the natural-
    language POD/comments are translated: the code body, the \xHH byte-escaped
    multibyte DATA, the logic and the numeric result annotations are byte-for-
    byte identical to eg/en/ (each script prints exactly the same output as its
    eg/en/ counterpart), so a student reads the explanation in the mother tongue
    while running identical code.  The scripts stay set_script_encoding('sjis')
    with FindBin-based "use lib".  Because the comments use non-Latin scripts,
    these dirs are UTF-8 (a US-ASCII / UTF-8 note is stated in each file header,
    as eg/ja/ already is); the mb source-encoding directive and DATA remain
    \xHH.  t/9082-examples.t needed no change (it already recurses eg/**/*.pl
    and derives its plan from the file count); it now runs all 30 new scripts
    under -w with a zero exit and empty STDERR.  MANIFEST gained the 30 new
    entries and t/9030-distribution.t's $utf8_ok now also exempts eg/ne|bn|vi|
    si|my|zh/ from the US-ASCII check (eg/en/ and eg/mb_length.pl stay strictly
    US-ASCII).  Remaining cheatsheet languages (HI UR TH TL ID KM MN TR UZ FR
    KO TW BM) are planned as follow-up batches of the same shape.
  - eg only (Track A, no code changes to lib/mb.pm): second localization batch
    of the five basic example scripts into the next set of student mother
    tongues from the doc/mb_cheatsheet.*.txt set: eg/hi/ (Hindi), eg/ur/ (Urdu,
    Roman Urdu), eg/th/ (Thai), eg/tl/ (Tagalog), eg/id/ (Indonesian),
    eg/km/ (Khmer) and eg/mn/ (Mongolian, Cyrillic).  Each dir carries the same
    five scripts (mb_length.pl, mb_split.pl, mb_regexp.pl, mb_tr.pl,
    mb_practical.pl).  As before, only the natural-language POD/comments are
    translated: the code body, the \xHH byte-escaped multibyte DATA, the logic
    and the numeric result annotations are byte-for-byte identical to eg/en/
    (each script prints exactly the same output as its eg/en/ counterpart), so
    a student reads the explanation in the mother tongue while running identical
    code.  The scripts stay set_script_encoding('sjis') with FindBin-based
    "use lib".  hi/th/km/mn use a non-Latin native script and are therefore
    UTF-8 (a US-ASCII/UTF-8 note is stated in each file header, as eg/ja/ is);
    id/tl/ur are written in a Latin/romanized form (Roman Urdu for ur) and stay
    strictly US-ASCII, matching the eg/vi/ precedent.  In every file the mb
    source-encoding directive and DATA remain \xHH.  t/9082-examples.t needed
    no change (it already recurses eg/**/*.pl and derives its plan from the
    file count); it now also runs these 35 new scripts under -w with a zero
    exit and empty STDERR.  MANIFEST gained the 35 new entries and
    t/9030-distribution.t's $utf8_ok now also exempts eg/hi|th|km|mn/ from the
    US-ASCII check (the Latin/romanized eg/id|tl|ur/ are intentionally left
    under the strict US-ASCII check).  Remaining cheatsheet languages (TR UZ
    FR KO TW BM) are planned as follow-up batches of the same shape.
  - eg only (Track A, no code changes to lib/mb.pm): third and final
    localization batch of the five basic example scripts, completing the
    doc/mb_cheatsheet.*.txt language set: eg/tr/ (Turkish), eg/uz/ (Uzbek,
    Latin), eg/fr/ (French), eg/ko/ (Korean), eg/tw/ (Chinese, traditional)
    and eg/bm/ (labelled Bamanankan in doc/, whose cheatsheet body text is
    Malay, so eg/bm/ is written in Malay to match what a student reads
    alongside it).  Each dir carries the same five scripts (mb_length.pl,
    mb_split.pl, mb_regexp.pl, mb_tr.pl, mb_practical.pl).  As before, only the
    natural-language POD/comments are translated: the code body, the \xHH
    byte-escaped multibyte DATA, the logic and the numeric result annotations
    are byte-for-byte identical to eg/en/ (each script prints exactly the same
    output as its eg/en/ counterpart), so a student reads the explanation in
    the mother tongue while running identical code.  The scripts stay
    set_script_encoding('sjis') with FindBin-based "use lib".  tr/fr use a
    Latin script whose diacritics are essential (Turkce, francais) and ko/tw
    use a non-Latin native script, so those four dirs are UTF-8 (a US-ASCII/
    UTF-8 note is stated in each file header, as eg/ja/ is); uz (written with
    ASCII o'/g'/sh/ch) and bm (Malay, no diacritics) are plain Latin and stay
    strictly US-ASCII, matching the eg/id|tl|ur/ precedent.  In every file the
    mb source-encoding directive and DATA remain \xHH.  t/9082-examples.t
    needed no change (it already recurses eg/**/*.pl and derives its plan from
    the file count); it now also runs these 30 new scripts under -w with a
    zero exit and empty STDERR.  MANIFEST gained the 30 new entries and
    t/9030-distribution.t's $utf8_ok now also exempts eg/tr|fr|ko|tw/ from the
    US-ASCII check (the ASCII Latin eg/uz|bm/ stay under the strict US-ASCII
    check).  With this batch the eg/ examples cover all 21 cheatsheet
    languages.
  - maintainer tooling: self-verify the regex transpilation catalog in the
    lib/mb.pm POD ("Each elements in regular expressions are transpiled as
    follows") against the live mb::parse() output, so that adding an encoding
    (johab was the trigger) can no longer let the hand-maintained "=head2 on
    every encodings" / "=head2 on <enc> encoding" tables drift out of sync
    without a test noticing.  New t/9070-pod_transpile_parity.t extracts the
    catalog region (anchored on the heading and the following =head1), takes
    the encoding list from the authoritative import allow-list and the pattern
    list from each table's own left column (no second copy kept in the test),
    then re-derives every transpiled column: qr/PATTERN/ for the
    encoding-independent "every" table and qr'PATTERN' with the matching
    script encoding selected for each per-encoding table.  Each of the 660
    rows is compared byte for byte with sprintf("  %-43s%s", input, got) so a
    single changed \\xHH byte, a lost column-alignment space, or a missing/
    extra encoding table fails with an expected-vs-actual diff; the plan count
    is derived from the walk, never hardcoded.  New development helper
    devtool/gen_pod_transpile_catalog.pl regenerates the whole catalog section
    (intro prose and table framing carried through verbatim, transpiled
    columns produced by mb::parse()) to STDOUT for diffing or for bootstrapping
    a new encoding's table; it is a hand-managed tool, not a pmake product.
    MANIFEST gained both entries.  Both files are US-ASCII, run warning-clean
    under -w, and target perl 5.005_03 through the latest.
  - add GitHub Actions CI (.github/workflows/ci.yml, repository-only, not
    shipped to CPAN and not in MANIFEST) with two tiers.  Tier 1 is a runtime
    regression matrix running "perl Makefile.PL && make && make test" on perl
    5.8 through the latest (5.42 included, exercised by t/9025); because
    "make test" already runs t/9020-perl5compat.t and t/9040-style.t, each
    matrix leg doubles as a static-compat check.  Tier 2 is a dedicated
    Perl 5.005_03 static gate that runs "perl -x pmake.bat selfcheck" (the
    embedded checker carried over from Perl500503Syntax::OrDie) plus a
    build-free "prove" of t/9020 + t/9040 over the sources.  Perl 5.005_03 is
    not a matrix leg (no runner ships it); its rules are enforced statically
    instead.  Wiring the separate Perl500503Syntax-OrDie distribution as an
    extra independent gate is left as a documented TODO in the workflow, its
    CLI not being present in this repository.
  - created by INABA Hitoshi

0.65  2026-07-05 JST (Japan Standard Time)
  - add encoding 'hp15' (HP-15, HP-UX Japanese): the two-octet DBCS
    [\x80-\xA0\xE0-\xFE][\x00-\xFF], verified against the legacy Char-HP15 /
    Ehp15 $your_char and %range_tr.  The lead set is the discontinuous
    [\x80-\xA0\xE0-\xFE]; \x80 and \xA0 are leads here (single octets in sjis),
    and the single octets \xA1-\xDF (JIS X 0201 katakana) and \xFF sit outside
    the lead set.  $over_ascii, the multibyte anchor (all perl-version
    branches), mb::getc (lead reads a second octet), the encoding allow-lists
    and "use one of" messages, and the old-package map (HP15::*) all gained
    hp15.  The trailing octet 21..7E includes \x5C, so hp15 also joined the
    MSWin32 trailing-\x5C filename paths (with its own lead set) and got a
    dedicated [A-Z]-hyphen routine list_all_by_hyphen_hp15_like that intersects
    ranges with the exact discontinuous lead / single-octet sets (the
    contiguous-lead sjis/big5 helpers would mis-split).  POD: new "=head2 hp15"
    catalog entry; Char-HP15 moved into the "Legacy single-encoding
    distributions mapped to mb encoding names" table and the now-empty
    partially-subsumed note was removed.  New t/1019_hp15_structure.t,
    t/3031_charclass_hyphen_hp15.t and t/8113_old_package_hp15.t;
    t/1013_valid_encodings.t gained an hp15 accept case; the 21
    doc/mb_cheatsheet.*.txt encoding lists gained the name.
  - add encoding 'informixv6als' (INFORMIX V6 ALS): the Shift_JIS-compatible
    two-octet core ([\x81-\x9F\xE0-\xFC][\x00-\xFF]) plus the \xFD three-octet
    user-defined plane (\xFD[\xA1-\xFE][\x00-\xFF]), verified against the legacy
    Char-INFORMIXV6ALS / Einformixv6als $your_char and %range_tr.  $over_ascii,
    the multibyte anchor (all perl-version branches), mb::getc (\xFD reads three
    octets), the encoding allow-lists and "use one of" messages, the old-package
    map (INFORMIXV6ALS::*), and the MSWin32 trailing-\x5C filename paths
    (sjis-style) all gained informixv6als.  [A-Z]-hyphen ranges get a
    dedicated list_all_by_hyphen_informixv6als_like: the one- and two-octet
    cases are identical to sjis's own routine and are reused verbatim, with
    new cases added for ranges that touch the three-octet \xFD plane -- the
    one-octet-vs-three-octet cases need \xFD treated as ambiguous (a genuine
    one-octet character only when NOT followed by \xA1-\xFE, via a negative
    lookahead, since it is otherwise the plane's lead byte).
    POD: new "=head2 informixv6als" catalog entry; Char-INFORMIXV6ALS moved into
    the "Legacy single-encoding distributions mapped to mb encoding names" table
    and removed from the partially-subsumed note.  New t/1018_informixv6als_
    structure.t (now also exercising mb::getc through a real filehandle),
    t/3032_charclass_hyphen_informixv6als.t and
    t/8112_old_package_informixv6als.t; t/1013_valid_encodings.t
    gained an informixv6als accept case; the 21 doc/mb_cheatsheet.*.txt encoding
    lists gained the name.
  - pre-publication QA pass on 0.65: t/1017_euctw_structure.t and
    t/1019_hp15_structure.t gained mb::getc coverage through a real filehandle
    (previously only sjis was exercised, in t/4006_mb_getc.t).
  - second pre-publication QA pass on 0.65 (documentation and test parity
    for the three encodings added in this release):
    (1) POD: the two "script encoding and subroutines (1 of 2) / (2 of 2)"
        old-package tables gained the missing EUCTW:: / HP15:: /
        INFORMIXV6ALS:: columns (the aliases themselves already existed and
        were already exercised by t/8111-t/8113).
    (2) POD: the per-encoding regular-expression transpilation catalog under
        "Each elements in regular expressions are transpiled as follows"
        gained "on euctw / on hp15 / on informixv6als encoding" sections.
        Every row of every section (13 encodings x 44 patterns = 572 rows,
        including the 440 pre-existing rows) was verified byte-for-byte
        against live mb::parse() output.
    (3) POD: the DAMEMOJI escaping catalog gained an "on informixv6als
        encoding" section; the escape output for the two-octet core was
        verified byte-identical to sjis before copying the sjis table.
        (An "on hp15 encoding" section was initially deferred pending the
        HP-15 byte-to-character table; it has now been added, see below.)
    (4) t/1015_import_args.t: the acceptance block is now generated from the
        @accept list (single source of truth) and @accept, the header
        comment, and the error-message listing checks all gained euctw /
        hp15 / informixv6als, which were valid import arguments since their
        addition but were never exercised by this test.
    (5) the detect_system_encoding() comment now names only the encodings
        the function can actually return (it had over-claimed euctw /
        rfc2279 / wtf8).
  - detect_system_encoding() now returns euctw for the EUC-TW system
    locales of the three commercial UNIXes, each verified against the
    vendor's own documentation before the mapping was added:
    (1) Oracle Solaris: zh_TW and zh_TW.EUC -- "In the zh_TW locale, the
        EUC scheme is used to encode CNS 11643.1992 codeset" (Solaris 7
        International Language Environments Guide,
        docs.oracle.com/cd/E19620-01/805-4123/new-71/index.html); Solaris 9
        onward names it zh_TW.EUC explicitly
        (docs.oracle.com/cd/E19683-01/806-6642/6jfipqu66/index.html).
        zh_TW.BIG5 stays big5.
    (2) IBM AIX: zh_TW with alias zh_TW.IBM-eucTW, code set IBM-eucTW
        ("Supported languages and locales",
        www.ibm.com/docs/en/aix/7.2.0?topic=globalization-supported-languages-locales).
        The capital-Z Zh_TW / Zh_TW.big-5 stay big5; the lookup is
        case-sensitive, as on AIX itself.
    (3) HP-UX: zh_TW.eucTW ("Configuring HP-UX for Different Languages",
        HP part number 5991-5907, Table A-1 Locale Names).
        zh_TW.big5 stays big5.
    The generic "Other Systems" branch is intentionally unchanged: a bare
    zh_TW is Big5 on glibc systems, so euctw must not capture it there.
    New t/1020_detect_system_encoding.t exercises the new euctw entries,
    the unchanged big5 / big5hkscs / sjis / eucjp / gb18030 / gbk / uhc
    neighbours, the utf8 fallback, the LC_ALL-over-LANG priority, and the
    AIX case-sensitivity, via mb::set_OSNAME / mb::get_OSNAME.
  - detect_system_encoding(): every locale-name-to-encoding map was
    rewritten from bare qw() lists into commented entries, each citing the
    vendor document that names the locale and its code set:
    Microsoft Windows code pages -- "Code Page Identifiers"
    (learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers;
    the HKSCS code page 951 is annotated as an update-installed variant of
    950 that is absent from that page); Oracle Solaris -- the Solaris 7 /
    Solaris 9 / Solaris 11.3 International Language Environments Guides;
    HP-UX -- "Configuring HP-UX for Different Languages" (UXL10N-90302)
    Appendix A Table A-1, plus HP-UX 11i patch PHCO_26453 for
    zh_CN.gb18030 and the newly added zh_HK.hkbig5; IBM AIX -- "Supported
    languages and locales" in the AIX documentation; generic branch -- GNU
    libc localedata/SUPPORTED.  Entries with no surviving official manual
    (japanese, japanese.euc, japan, Japanese-EUC, ja_JP.mscode, ja_JP.AJEC,
    ja_JP.EUC, ja_JP.ujis, Jp_JP, and HP-UX zh_HK.big5) are annotated as
    legacy vendor UNIX locale names kept for compatibility.
    The "Other Systems" branch gained the explicit euctw spellings
    zh_TW.eucTW (HP-UX / Tru64 UNIX style) and zh_TW.EUC-TW (glibc), and,
    applying the same verification to the other encodings, the glibc
    SUPPORTED names ja_JP.EUC-JP (eucjp), ko_KR.EUC-KR (uhc), zh_CN,
    zh_CN.GBK, zh_SG, zh_SG.GBK (gbk), zh_CN.GB18030 (gb18030), zh_HK and
    zh_HK.BIG5-HKSCS (big5hkscs).  A bare zh_TW stays intentionally
    unmapped in the generic branch (Big5 on glibc, EUC-encoded CNS 11643 on
    the Solaris lineage), documented in a comment at the map.
    t/1020_detect_system_encoding.t grew from 33 to 48 tests covering
    every new entry, the non-regression of every pre-existing entry it
    already covered, and the deliberate zh_TW-stays-utf8-fallback rule.
  - POD: the DAMEMOJI escaping catalog gained the previously deferred
    "on hp15 encoding" section.  Publicly available primary sources
    settled the question that had deferred it: per Ken Lunde, "CJKV
    Information Processing" 2nd ed. (O'Reilly Media, 2009), Appendix E
    "Vendor Character Set Standards" and Appendix F "Vendor Encoding
    Methods" (both published as free PDFs at
    resources.oreilly.com/examples/9780596514471; the O'Reilly Japan
    translation of the 1st edition carries the same material in printed
    Appendixes C and D), the HP Kanji character set is ASCII/JIS-Roman
    plus JIS X 0201 katakana plus JIS X 0208-1983 with NO vendor-defined
    characters, and the standard two-octet area of HP-15 encodes
    JIS X 0208 with the same octets as Shift-JIS (corroborated by
    Columbia University's Kermit kanji.txt,
    www.columbia.edu/kermit/ftp/e/kanji.txt); only the user-defined area
    (up to 5,366 code points on the extra lead octets such as \x80, \xA0,
    and \xF0-\xFE) is unique to HP-15 and has no character shapes by
    definition.  Therefore the hp15 DAMEMOJI table is byte- and
    glyph-identical to the sjis table; this was additionally verified at
    build time by comparing live escape output of sjis and hp15 for all
    nine metacharacter trailing octets (40 5B 5C 5D 5E 60 7B 7C 7D) under
    lead \x83 -- zero differences.  The "=head2 hp15" catalog entry and
    the $over_ascii source comment now carry these findings and the
    reference URLs, including the Unicode Consortium JIS X 0208 /
    Shift-JIS mapping tables
    (www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/) from which
    the complete HP-15 standard-area code table can be derived
    mechanically.
  - doc lib/mb.pm + README: fold three lineage elements from the ancestral Sjis
    / Char-Sjis distributions into mb's documentation.
    (1) JRE-style stack diagram: the "Runtime multibyte interface ..." section
        gains a new "=head2 The runtime stack (a JRE-style view)" that redraws
        the old Sjis JRE (JPerl Runtime Environment) layer diagram -- script on
        top, mb.pm middle layer, byte-oriented perl (PVM) at the bottom -- but
        updated to mb's three paths (filter / modulino / runtime) and noting
        that the lineage's three files (Sjis.pm + Esjis.pm + Char.pm) have
        collapsed into the single mb.pm.
    (2) malformed final octet: the "strict vs lenient" section gains a new
        "=head3 a malformed final octet is kept, not silently dropped
        (encoding-dependent)" documenting that on the Shift_JIS family a lead
        byte ending a string with no trail is kept as a one-octet unit (not
        deleted, not merged), so mb::chop returns exactly that octet and leaves
        the prefix intact -- the long-standing Esjis::chop behaviour -- while
        under utf8 a dangling lead is reported invalid by mb::valid().  README
        STRICT VS LENIENT gains a matching short note.
    (3) 1998/1999 provenance: the "From 1998 To You" section now records the
        Tokyo.pm 1999-September source-filter seed (the minimal "package SJIS;
        use Filter::Util::Call; sub multibyte_filter" posting, with its URL) and
        the first appearance of the Esjis run-time engine in ActivePerl Build
        522 under MSWin32, compiled Nov 2 1999.
    (4) encoding-name map: add "=head1 Legacy single-encoding distributions
        mapped to mb encoding names" (placed right after the encoding catalog).
        A table maps the 18 previously released single-encoding CPAN distributions
        that mb fully subsumes -- Sjis/Char-Sjis, Char-EUCJP, Big5/Char-Big5Plus,
        Big5HKSCS/Char-Big5HKSCS, GBK/Char-GBK, Char-GB18030, Char-UHC,
        Char-KPS9566/KPS9566, KSC5601, Char-UTF2/UTF2/UTF8-R2, Char-OldUTF8 -- to
        their mb encoding name (sjis, eucjp, big5, big5hkscs, gbk, gb18030, uhc,
        utf8, rfc2279), showing the multibyte lead/trail byte ranges of BOTH sides
        so the equivalence is visible ("==" identical, "<=" legacy is a subset).
        The UTF-8 family ranges (utf8 strict RFC 3629, rfc2279 permissive) are
        listed in full; KSC5601 (<= uhc) and Char-OldUTF8 (<= rfc2279, minus
        overlong C0/C1) get subset notes; the three only-partially-subsumed
        distributions (Char-EUCTW SS2 plane, Char-INFORMIXV6ALS 0xFD area,
        Char-HP15 lead structure) are named as not in the table.  Byte ranges
        were verified against the actual $your_char definitions of the legacy
        modules.
  - test t/4022_mb_chop_malformed.t (new): regression test pinning the malformed
    final octet rule above.  Under sjis, mb::chop("\x82\xA0\x82") returns "\x82"
    and leaves "\x82\xA0"; a lone lead byte, a clean full DBCS char, and a
    single-octet half-width kana each chop as expected; mb::length counts the
    stray octet as its own unit (length 2); mb::valid tolerates the dangling
    lead under sjis (1) but rejects it under utf8 (0).  US-ASCII source, loaded
    with require so it runs on perl 5.005_03 and later; closure-array TAP plan.
  - $VERSION 0.64 -> 0.65.  lib/mb.pm code is unchanged (the diff is POD-only);
    behaviour described by the new test was already present and is now pinned.
  - add EUC-TW (euctw) script encoding, ported from the legacy Char-EUCTW /
    Eeuctw engine.  This is the first mb encoding with an \x8E (SS2) four-octet
    structure: CNS 11643 plane 1 is [\xA1-\xFE][\xA1-\xFE] (2 octets) and the
    SS2 planes 2..16 are \x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] (4 octets).
    Touched in lib/mb.pm: $over_ascii, the multibyte anchor (5.038+/5.030+/
    5.010001+ branches), mb::getc, the import / set_script_encoding allow-lists
    and "use one of" messages, mb::get_old_package (euctw -> EUCTW::), the
    qr/[A-Z]/ hyphen helper (list_all_by_hyphen_euctw_like, modelled on the
    gb18030/utf8 helpers and covering every octet-length endpoint pair
    (1-1),(1-2),(1-4),(2-2),(2-4),(4-4) under the legacy length-first ordering,
    skipping the non-existent 3-octet length) and its dispatch,
    and POD (=head2 euctw catalog entry; Char-EUCTW moved into the legacy
    mapping table and removed from the "partially subsumed" note).  Like eucjp,
    euctw is a Unix encoding and is intentionally NOT added to the MSWin32
    trailing-\x5C DAMEMOJI groups even though the 4-octet final octet can be
    \x5C, because EUC-TW is not a Windows ANSI code page.  Stray high octets
    follow mb's strict model (non-characters), matching how eucjp treats them.
    New tests: t/1017_euctw_structure.t (4/2-octet length/substr/index/rindex/
    reverse/chop, the transpiled anchor, and SS2 four-octet hyphen-range cases
    including a char whose trailing octet is \x5C), t/3030_charclass_hyphen_euctw.t
    (now exercising all six length-combination endpoint pairs via 1/2/4-octet
    limits), t/8111_old_package_euctw.t; t/1013_valid_encodings.t gains a euctw
    get/set round trip; euctw added to the supported-encoding list in all 21
    doc/mb_cheatsheet.*.txt.

0.64  2026-06-29 JST (Japan Standard Time)
  - doc lib/mb.pm + README (step 8 doc sub-step): expand the usage documentation
    of the three ways to run (filter / modulino / runtime).  The POD "=head1
    Runtime multibyte interface ..." section now opens with a path comparison
    table (how to invoke, what gets codepoint semantics, supported perl
    versions) and rules of thumb for choosing a path, and gains a detailed
    "=head2 strict vs lenient" subsection: mb's character unit is STRICT (a
    well-formed multi-byte sequence of the current encoding OR a US-ASCII byte
    [\x00-\x7F]); the codepoint walk (mb::length / mb::substr / mb::index) halts
    at the first stray octet; what is "stray" is encoding-dependent (the same
    "A\x85B" is length 1 under utf8 but length 2 under sjis); codepoint
    character classes (\S etc.) are strict; the single deliberate lenient
    exception is the transpiled dot "." on the filter / modulino paths
    ("(?>$over_ascii|.)"), while the runtime interface (mb::qr) keeps even "."
    strict; mb::valid() is the explicit strict predicate; and a "how to choose"
    guide contrasts the codepoint (strict) and octet (lenient) models.  README
    gains matching "THREE WAYS TO RUN" and "STRICT VS LENIENT" sections.  POD/
    README only; lib/mb.pm code is unchanged (diff is POD-only), $VERSION stays
    0.64, Pod::Checker still 0/0, and the full direct-run tally is unchanged at
    ok 465,965 / not ok 0 (zero regression).
  - doc lib/mb.pm (step 8): add a new "=head1 Runtime multibyte interface
    (mb::qr / mb::valid / mb::split) and the three transpile paths" POD section
    (POD-only, US-ASCII, Pod::Checker clean: 0 errors / 0 warnings).  It
    documents (1) the three ways a script reaches codepoint semantics -- the
    path-1 opportunistic source filter ("use mb;" on perl 5.8+), the modulino
    ("perl mb.pm script.pl", in-process eval or *.oo child), and the path-3
    runtime interface ("use mb qw(*mb utf8);") -- and (2) the three runtime
    subroutines ported in steps 1/5: mb::qr() (the functional form of
    $mb{qr/.../}, returning a codepoint regex STRING not a qr// object, which
    matters on perl 5.005_03), mb::valid() (the strict, opt-in well-formedness
    predicate that uses the STRICT unit, not the lenient everyday $x, and whose
    verdict varies by script encoding: utf8 strict / rfc2279 permissive / wtf8
    surrogate-tolerant), and mb::split() (the UTF8::R2-compatible runtime
    split).  No code change to lib/mb.pm (diff is POD-only); $VERSION stays 0.64.
  - doc (step 8): extend all 21 doc/mb_cheatsheet.*.txt with four new sections,
    "Runtime codepoint regex (mb::qr)", "Validate well-formed bytes (mb::valid)",
    "Split on codepoint boundaries (mb::split)" and "Three ways to run (filter /
    modulino / runtime)", localized in each language and numbered consecutively
    after the existing sections so t/9080-cheatsheets.t (S2 consecutive
    numbering) still passes.  The mb::split section completes the cheatsheet
    coverage of all three runtime subroutines (mb::qr / mb::valid / mb::split)
    required by step 8, matching the POD section above.
  - test (step 8): test-asset integration.  The curated mb-native runtime tests
    added in steps 1-7 -- t/1007_runtime_qr.t, t/1010_filter.t,
    t/1011_modulino.t, t/1012_valid.t, t/1013_valid_encodings.t, t/1014_split.t,
    t/1015_import_args.t, t/1016_source_encoding.t -- are confirmed as the
    integrated, deduplicated runtime test set, numbered to mb's existing 1xxx
    convention.  A blanket inheritance of UTF8::R2's ur2_* qr suite was
    EVALUATED and DECLINED: it is not additive.  ur2_* encodes mb8's
    octet-lenient \S/\H/\V semantics (a lone \x85 / \xA0 matches \S), whereas
    mb's documented codepoint \S matches only "a well-formed multi-byte
    sequence OR a US-ASCII byte [\x00-\x7F]", so a lone stray octet matches
    neither and a direct port produces 6 not-ok per qr file (e.g. assertions
    317/318/327/328/337/338 in ur2_1020_qr1).  This is mb-0.63's long-standing
    behaviour, not a port regression, so per the zero-regression rule the bulk
    inheritance is withdrawn; selective inheritance of non-diverging ur2_* cases
    remains possible as a future per-file-vetted additive sub-step.
  - QA (step 8): final release-candidate QA.  Full direct-run tally is
    ok 465,965 / not ok 0 (unchanged from step 7; zero regression).  All meta
    tests green: 9001-load=32, 9010-encoding=54, 9020-perl5compat=160,
    9025-perl542compat=11, 9030-distribution=620, 9040-style=31, 9050-pod=6
    (Pod::Checker still 0/0 after the new POD), 9060-readme=10,
    9080-cheatsheets=63 (after the new cheatsheet sections).  Verified on perl
    5.38.2 only; old-perl real-machine confirmation (5.005_03 / 5.6 / 5.8) and
    perl 5.41+ source::encoding firing remain on the maintainer's pre-release
    checklist.
  - verify lib/mb.pm (step 7): re-confirm the Perl 5.41+ "no source::encoding;"
    injection.  All five script-level transpile paths route their mb::parse()
    output through mb::_insert_source_encoding_unimport(): the path-1 source
    filter, the modulino *.oo writer, the modulino in-process eval, and the two
    require-time prefix *.oo writers.  The runtime mb::eval() (a string eval)
    intentionally does NOT inject, exactly as in the mb8-0.01 source it was
    ported from.  The injection regex is byte-for-byte identical to mb8-0.01,
    so the port is exact.  No code change was needed (verification only);
    "use v5.41", "use v5.42", "use 5.041", "use 5.042" and higher all receive
    "; no source::encoding;" on the SAME physical line (before any trailing
    comment, no line-number shift), while "use v5.40" / "use 5.040" and earlier,
    and "require VERSION", are correctly left alone.
  - test (step 7): add t/1016_source_encoding.t (34 assertions) locking in the
    injection behaviour by inspecting the transpiled text directly, so it needs
    no Perl 5.41+ interpreter and runs on every perl from 5.005_03 up (no source
    filter, no version-specific feature; pure US-ASCII body).  It checks the
    accepted version notations, the below-threshold non-matches, same-line
    placement / line-number preservation, trailing-comment handling, CRLF and CR
    line endings, multiple version statements, and the require/no non-matches.
    MANIFEST gains the new test file.  All prior assertions still pass unchanged;
    total is 465,965 (zero regressions, +38 = +34 new test assertions +4 added
    MANIFEST-integrity checks in 9030-distribution).  Verified on perl 5.38.2
    only; real execution under perl 5.41+ is deferred to the maintainer.
  - feature lib/mb.pm (step 6): clarify the import() / main() argument errors.
    The argument acceptance is unchanged -- import() still accepts the runtime
    tokens *mb and %mb plus every encoding name (big5 / big5hkscs / eucjp /
    gb18030 / gbk / rfc2279 / sjis / uhc / utf8 / wtf8), and the modulino
    main() -e still accepts every encoding name (NOT narrowed to the UTF-8
    family like mb8).  Only the three die messages for an unsupported argument
    were made explicit: import() now dies with "import argument '...' not
    supported (use one of: *mb, %mb, big5, big5hkscs, eucjp, gb18030, gbk,
    rfc2279, sjis, uhc, utf8, wtf8)." and both main() -e branches now die with
    "script_encoding '...' not supported (use one of: big5, big5hkscs, eucjp,
    gb18030, gbk, rfc2279, sjis, uhc, utf8, wtf8)." (the runtime tokens *mb /
    %mb are import-only and are not advertised by the modulino).  This is a
    message-text-only change; the die-firing condition is identical, so no
    existing behaviour changes (additive only).
  - test (step 6): add t/1015_import_args.t (46 assertions: unsupported import
    argument dies with an explicit listing message naming *mb / %mb and the
    encodings; both main() -e forms (-eXXX and -e XXX) die the same way and the
    modulino listing omits *mb / %mb; every supported token *mb / %mb and all
    ten encodings is still accepted by use mb '...').  The test loads mb with
    require, exercises the rejection paths through eval (they die in the
    argument scan before any side effect) and the acceptance paths in a child
    perl, so it runs on every perl from 5.005_03 up.  MANIFEST gains the new
    test file.  All prior assertions still pass unchanged; total is 465,927
    (zero regressions, +50 = +46 new test assertions +4 added MANIFEST-integrity
    checks in 9030-distribution).  Verified on perl 5.38.2 only.
  - feature lib/mb.pm (step 5): port two runtime functions from mb8-0.01.
    sub mb::valid(;$) (about 13 lines) is inserted right before
    sub mb::require(); it is a non-destructive predicate that whole-matches
    its argument (or $_) against the STRICT unit ($over_ascii or a US-ASCII
    byte, NOT the lenient $x), returning 1 for well-formed input and 0 when
    any stray octet is present.  The string is never modified.  sub
    mb::split(;$$$) (about 40 lines) is inserted right before sub mb::_split();
    it is the UTF8::R2-compatible runtime split for path-3 callers (the
    transpiler still uses mb::_split, untouched).  When the first argument is
    '' or an empty (?^...:) group it splits on $x codepoints; otherwise it
    delegates to CORE::split via qr{@{[mb::qr($_[0])]}} (mb::qr returns a
    string, so it is interpolated into a fresh qr{}).  The $] < 5.012
    implicit-split-to-@_ deprecation warning under $^W is carried over as is.
    Both subs depend only on pre-existing mb internals ($over_ascii, $x,
    mb::qr); no existing behaviour is changed (additive only).
  - test (step 5): add t/1012_valid.t (20 assertions: well-formed and
    malformed octet cases, $_ default, non-destructiveness, strict-walk
    relation), t/1013_valid_encodings.t (18 assertions: utf8 / rfc2279 / wtf8
    well-formedness differences and set/get round trip), and t/1014_split.t
    (80 assertions: argument counts 0..3, positive/negative/exceeding LIMIT,
    scalar and list context, ASCII and full-width multibyte).  Tests load mb
    with require and set the encoding explicitly, so they exercise the runtime
    functions without the source filter and run on every perl from 5.005_03
    up.  MANIFEST gains the three new test files.  All 465,747 prior
    assertions still pass unchanged; total is 465,877 (zero regressions,
    +130 = +118 new test assertions +12 added MANIFEST-integrity checks in
    9030-distribution).  Verified on perl 5.38.2 only; the 5.005_03 /
    5.6 / 5.8 confirmation of mb::split's $] < 5.012 path remains for ina to
    run on a real old perl.
  - audit lib/mb.pm (step 4): perl 5.005_03 read-only-value audit of every
    destructive s/// and tr/// in the code region.  Result: no new code change
    is required.  No destructive s///|tr/// is applied to $_[n], to a string
    literal, or to a bare read-only $_; every such target is a fresh writable
    lexical (copy-first idioms (my $c = $src) =~ s///, my($c) = @_, and
    my $c = $_[n]).  The one runtime sub that may receive a qr// argument and
    substitutes on it, _r2_qr(), already copies first via my $source = "$_[0]"
    (mitigation A, added in an earlier 0.64 step).  The tr/x// occurrences are
    count-only (no /d, empty replacement) and never modify their operand.
  - decision lib/mb.pm (step 4): mitigation B (re-expressing the file-scoped
    transpile-path $x as a plain string instead of a qr// object) is NOT
    applied; the file-scoped $x stays qr/(?>$over_ascii|[\x00-\x7F])/ and stays
    STRICT.  Reason, measured empirically: a qr// object interpolates into a
    larger pattern as a modifier-isolated subpattern ((?^...:...)), and the
    transpile path depends on that isolation where $x sits inside /x and escape
    contexts; the bare-string form drops the wrapper and regressed the
    qr-as-q / s-as-q escape transpilation (406 assertions failed on perl 5.38 in
    t/2023_basic_escape_qr_as_q.t and t/2025_basic_escape_s_as_q.t), so the
    change was reverted.  The file-scoped $x is never the target of a
    destructive s///, only ever interpolated into search patterns, so it has no
    read-only hazard to fix.  A short comment recording this was added at the $x
    definition; this is the only edit to lib/mb.pm in step 4 and is comment-only
    (behaviour unchanged).
  - test (step 4): all 465,747 assertions from the previous 0.64 step still
    pass unchanged on perl 5.38.2 (zero regressions); no test was added or
    removed.  The read-only failures this audit targets only reproduce on perl
    5.005_03 / 5.6, which is not available in this environment, so the
    5.005_03-specific behaviour remains to be confirmed on a real old perl.
  - feature lib/mb.pm: port the runtime UTF-8 codepoint regex engine from
    mb8-0.01.  sub _r2_qr() (about 188 lines) and sub mb::qr() (3 lines)
    are inserted right after sub list_all_by_hyphen_utf8_like() (same
    package mb context).  _r2_qr() builds a multibyte-aware regular
    expression string from the body of a qr/.../ token at run time and is
    the engine behind the UTF8::R2-compatible $mb{qr/.../} interface.
    Dependencies ($over_ascii, the $bare_* classes, mb::chr, and
    list_all_by_hyphen_utf8_like) are all pre-existing in mb and unchanged;
    list_all_by_hyphen_utf8_like is byte-identical between mb and mb8.
  - robustness lib/mb.pm: _r2_qr() now builds a *local* strict STRING form of
    the one-codepoint matcher, my $x = "(?>$over_ascii|[\x00-\x7F])", and uses
    it throughout in place of the file-scoped qr// object $x.  The file-scoped
    $x is a qr// object; on perl 5.005_03 a qr// object loses its body when
    interpolated into another pattern ("$qr" -> "(?-xism:)"), so an embedded
    $x silently degraded to a match-anything sub-pattern on old perl, causing
    negative codepoint classes, hyphen-range boundaries, quantifier shortfall
    and "." (without /s) to over-match.  A plain string interpolates losslessly
    from 5.005_03 onward.  The local form is kept STRICT ([\x00-\x7F]); the
    file-scoped qr// $x is left untouched for mb's transpile path.
  - change lib/mb.pm: the %mb tie FETCH is changed from { $_[1] } (a no-op
    pass-through) to { _r2_qr($_[1]) } so that $mb{qr/.../} now builds a
    UTF-8 codepoint regex at run time.  This is additive: import() exports
    an *untied* snapshot copy of %mb, so no existing code or test reaches
    FETCH; the change therefore cannot alter existing behaviour.  $x is
    deliberately kept strict (qr/(?>$over_ascii|[\x00-\x7F])/); leniency is
    not introduced here.
  - add t/1007_runtime_qr.t: 27 assertions exercising $mb{qr/.../} via a
    direct tie my %mb, 'mb' (UTF-8 character classes, hyphen ranges,
    negation, quantifiers, POSIX classes, alternation, mixed ASCII and
    multibyte ranges, and the /i and /s modifiers).  This file is encoded
    in UTF-8 by design (an explicit-UTF-8 test).
  - test: 465,697 existing assertions all pass unchanged; total is now
    465,724 (+27) with zero failures.
  - feature lib/mb.pm: port "path 1", the opportunistic source code filter,
    from mb8-0.01 into import(), made ADDITIVE for mb.  On perl 5.8 or later,
    "use mb;" (or "use mb 'utf8';" etc.) installs a Filter::Util::Call source
    filter that reads the whole remaining source in one pass and, for a genuine
    path-1 script, runs it through mb::parse() followed by
    mb::_insert_source_encoding_unimport() -- so such a script needs only
    "use mb;" to be auto-transpiled and the modulino (perl mb.pm script.pl) is
    no longer required on 5.8+.  CRUCIAL GUARD: if the buffered source itself
    calls mb::set_script_encoding(), the script is treated as octet-oriented /
    runtime-managed (mb's long-standing "use mb; then call mb::* on octet data"
    convention) and is passed through UNCHANGED.  This is what makes the change
    additive: every pre-existing "use mb;" caller -- which was never
    source-filtered, because mb-0.63 had no filter, and which sets its own
    encoding at run time -- behaves exactly as before, so the existing 465,697
    assertions are all unchanged.  Filter::Util::Call has been a core module
    since perl 5.8.0 and is require()d only at run time, so no new dependency is
    declared; if it is somehow unavailable, "use mb;" silently loads as the
    plain runtime import (no die, to preserve the legacy convention).
  - feature lib/mb.pm: import() now also recognises the *mb / %mb tokens and,
    when present, suppresses the source filter (runtime-interface request,
    reserved for a later step).  Existing single-argument encoding invocations
    are unchanged; no shipped code or test passes these tokens.
  - change lib/mb.pm: on perl 5.005_03 / 5.6 the source filter is unavailable;
    "use mb;" loads as the plain runtime import exactly as before (it does NOT
    die), and source transpilation there is via the modulino as always.
  - change lib/mb.pm: sub main() sets PERL_MB_OCTET=1 in the environment of the
    child interpreter it spawns to run the transpiled *.oo script.  The child
    loads -Mmb=ver,enc, so without this flag the new path-1 filter could
    transpile the already transpiled *.oo a second time.  import() honours
    PERL_MB_OCTET by skipping the filter, preventing double transpilation.
  - add t/1010_filter.t: 5 assertions that drive "use mb 'utf8';" scripts (with
    no mb::set_script_encoding call, i.e. genuine path-1) through a child perl
    and confirm auto-transpilation (length, character-class match, substitution,
    global capture count, negated class).  On perl < 5.8 the cases self-skip.
    This file is encoded in UTF-8 by design (an explicit-UTF-8 test).
  - feature lib/mb.pm: sub main() (the modulino) now splits the execution path
    on whether the target script contains a __DATA__/__END__ section, mirroring
    mb8-0.01.  A script with no __DATA__/__END__ is transpiled and run in
    process by CORE::eval with no temporary file: the *.oo companion script,
    the $script.lock directory, and the child interpreter are all skipped.  A
    "package main;\n#line 1 \"$script\"\n" prefix is prepended so that run-time
    error messages report the original script name and correct line numbers.
    A script that does contain __DATA__/__END__ keeps the previous behaviour
    (write *.oo only when stale, then run it through a child interpreter),
    because an in-process string eval cannot provide a working <DATA> handle.
    The source is now read once, up front, for the __DATA__/__END__ test; the
    poor-make staleness check and MSWin32 @ARGV globbing are unchanged.
  - change lib/mb.pm: the in-process branch also sets PERL_MB_OCTET=1 (local)
    around the CORE::eval, so that a "use mb;" / "use mb 'utf8';" inside the
    transpiled source does not re-install the path-1 source filter and
    transpile a second time.
  - change lib/mb.pm: when run as a modulino ($0 eq __FILE__), $INC{'mb.pm'} is
    registered (if not already set) before main() is called.  This makes a
    "use mb;" / "require mb" inside an in-process transpiled script resolve to
    the already loaded modulino instead of reloading mb.pm, which would
    otherwise emit many "Subroutine ... redefined" warnings.  This mirrors the
    child-interpreter path, where -Mmb=ver,enc already populates $INC{'mb.pm'}.
  - add t/1011_modulino.t: 6 assertions covering the modulino split -- a
    no-__DATA__ script runs in process (codepoint length, character-class
    match, and absence of any *.oo file), a __DATA__ script reads <DATA> via a
    child interpreter (and a *.oo file IS created), and an in-process run-time
    error reports the original line number.  This file is encoded in UTF-8 by
    design (an explicit-UTF-8 test).

0.63  2026-06-14 JST (Japan Standard Time)
  - fix t/lib/INA_CPAN_Check.pm: ok() now has prototype ($;$) so that a
    failing regex match passed inline (e.g. ok($text =~ /pat/, "label"))
    is evaluated in scalar context.  Without the prototype, a no-capture
    regex failure returns an empty list in list context, causing the label
    string to land in the first argument and the test to silently pass.
    This masked all P10 failures for t/9xxx test files (9 false passes
    per run).
  - fix t/lib/INA_CPAN_Check.pm: add BEGIN { pop @INC if $INC[-1] eq '.' }
    CVE-2016-1238 mitigation (P12 guard was missing from the file).
  - fix t/lib/INA_CPAN_Check.pm: add $VERSION = $VERSION self-assign
    (P10 guard was missing from the file).
  - fix t/lib/INA_CPAN_Check.pm: check_B() B4 regex now also matches
    'VERSION' => q{x.xx} and "VERSION" => q{x.xx} forms used in
    ina@CPAN Makefile.PL files (the old pattern matched only single- or
    double-quoted values, so B4 always failed for this distribution).
  - fix t/9001-load.t, t/9010-encoding.t, t/9020-perl5compat.t,
    t/9025-perl542compat.t, t/9030-distribution.t, t/9040-style.t,
    t/9050-pod.t, t/9060-readme.t, t/9080-cheatsheets.t: add
    use vars qw($VERSION); $VERSION = $VERSION; to each file so that
    P10 ($VERSION self-assign) is satisfied when t/9020-perl5compat.t
    scans the t/9xxx test files themselves.
  - fix lib/mb.pm: _open_r() now prepends "< " read-mode prefix, matching
    _open_w()/_open_a(). The old 2-arg open($fh,$_[0]) misparsed filenames
    ending in '|' (a legal MBCS trail byte 0x7C in Shift_JIS/EUC/GBK etc.)
    as a pipe/command open. Works on Perl 5.005_03 and all later versions.
  - fix pmake.bat: _dist_check_sources() now scopes selfcheck targets to
    match t/9020-perl5compat.t and t/9040-style.t. The multibyte transpiler
    core (lib/mb.pm) and the t/NNNN fixtures (non-t/9xxx) are excluded from
    the P1-P12 / C1 / K1-K3 house-style scans (they intentionally carry
    post-5.005_03 tokens and non-US-ASCII bytes as transformation data);
    t/lib/*.pm added to targets. Fixes 212 spurious 'pmake dist' FAILs.
  - fix t/lib/INA_CPAN_Check.pm: check_C() again honours the caller's
    utf8_ok option (the 0.63 rewrite dropped it, so lib/mb.pm and the
    t/[1-8]xxx MBCS fixtures all false-failed C1 -- 106 spurious FAILs in
    t/9030). _find_pm_t() now returns a list instead of taking a \@out-param,
    so the module no longer violates its own K2 rule (1 FAIL in t/9040).
  - add eg/mb_length.pl: minimal US-ASCII, 5.005_03-clean usage example
    (satisfies the new check_F F1 "eg/*.pl exists"); registered in MANIFEST.

0.62  2026-05-17 JST (Japan Standard Time)
  - fix lib/mb.pm: _open_a(), _open_r(), _open_w() rewritten to use a
    unique numbered package glob (mb::FH::H<n>) instead of \do{local *_}.
    The old implementation always resolved to *main::_ causing IO-slot
    collisions on Perl 5.005_03.  New design: each function increments
    $mb::_fh_seq and returns the glob-name string; callers use
    no strict 'refs' with readline(*{$fh}) / print {*{$fh}} / close($fh).
    Function signatures changed from ($$) to ($): the filehandle argument
    is no longer passed in; callers now assign the return value instead.
  - fix lib/mb.pm: all six call sites of _open_r() and _open_w() updated
    to the new calling convention.
  - fix t/4006_mb_getc.t: replace six open(my $fh,...) with SKIP-guard
    with bareword filehandle form (FILE41-FILE43, FILE51-FILE53).

0.61  2026-04-03 JST (Japan Standard Time)
  - fix t/9050-pod.t: skip G11 Pod::Checker errors check when
    Pod::Checker < 1.51 to avoid false FAILs caused by mis-reported
    errors for valid L</section>, L</"section">, and L<URL> syntax
    on older Perl installations (CPAN Testers FAIL fix)
  - fix lib/mb.pm: update =head1 Perl 5.42 and source::encoding POD
    to accurately describe that no source::encoding; is appended on
    the same line as qualifying use VERSION statements (not in a
    BEGIN block), and clarify that only DAMEMOJI inside string and
    regexp literals are escaped; comments and POD are left untouched

0.60  2026-03-31 JST (Japan Standard Time)
  - fix lib/mb.pm: =encoding utf8 -> utf-8 (Pod::Checker 1.45 compat)
  - fix t/9025-perl542compat.t: avoid "implicit split to @_" deprecation
    warning on Perl 5.8.x in T7 (use explicit array variable instead of
    scalar(split ...))
  - fix t/9050-pod.t: skip G12 Pod::Checker warnings check when
    Pod::Checker < 1.60 to avoid false FAILs caused by mis-reported
    warnings for valid L<> link syntax on older Perl installations

0.59  2026-03-29 JST (Japan Standard Time)
  - add t/lib/INA_CPAN_Check.pm: shared test library aligned with
    DB-Handy 1.07, HTTP-Handy 1.03, LTSV-LINQ 1.07, mb-JSON 0.04
  - add t/9001-load.t: module load, $VERSION, public API (mb::*) (32 tests)
  - add t/9010-encoding.t: US-ASCII, trailing whitespace, newline checks
  - add t/9020-perl5compat.t: Perl 5.005_03 compatibility; P1-P14 for
    lib/*.pm and t/9xxx, M1-M7 for Makefile.PL (160 tests)
  - add t/9025-perl542compat.t: unit tests for
    _insert_source_encoding_unimport() (11 tests)
  - add t/9030-distribution.t: MANIFEST, version, META, Changes checks
  - add t/9040-style.t: ina@CPAN coding style E and K checks
  - add t/9050-pod.t: POD structure G1-G12 including Pod::Checker (6 tests)
  - add t/9060-readme.t: README required sections R1-R5 check (10 tests)
  - add t/9080-cheatsheets.t: doc/ cheat sheet quality checks
  - add doc/mb_cheatsheet.*.txt: mb quick reference in 21 languages
  - add SECURITY.md
  - fix lib/mb.pm: warnings stub now guards with
    !defined(&warnings::import) to suppress "import redefined" warnings
  - fix lib/mb.pm: supports Perl 5.42 source::encoding pragma;
    add _insert_source_encoding_unimport() helper that appends
    "no source::encoding;" on the same line as "use v5.41" or later
    statements (before any trailing comment) so that line numbers in
    error messages are not shifted between original and transpiled script
  - fix lib/mb.pm: add =head2 Perl 5.42 and source::encoding in POD
  - fix lib/mb.pm: remove whitespace-only lines in POD verbatim blocks
    (Pod::Checker warnings=0 achieved)
  - fix lib/mb.pm: update "newest perl" to "perl 5.42" in SYNOPSIS POD
  - fix README: add INSTALLATION, AUTHOR, LICENSE AND COPYRIGHT,
    PERL 5.42 AND source::encoding sections;
    update "newest perl" to "perl 5.42"
  - fix t/lib/INA_CPAN_Check.pm: _slurp and _slurp_lines strip CR (\r)
    to handle CRLF line endings on Windows
  - fix pmake.bat: add CVE-2016-1238 mitigation (pop @INC) to
    generated Makefile.PL
  - created by INABA Hitoshi

0.58  2024-07-07 00:00:00
  - supports ^^ logical xor operator
  - created by INABA Hitoshi

0.57  2023-07-07 00:00:00
  - supports finally { block }
  - supports mb::finally { block }
  - supports CORE::finally { block }
  - supports REG_INF has been raised from 65,536 to 2,147,483,647
  - created by INABA Hitoshi

0.56  2023-03-23 00:00:00
  - add t/8101_old_package_big5.t
  - add t/8102_old_package_big5hkscs.t
  - add t/8103_old_package_eucjp.t
  - add t/8104_old_package_gb18030.t
  - add t/8105_old_package_gbk.t
  - add t/8106_old_package_rfc2279.t
  - add t/8107_old_package_sjis.t
  - add t/8108_old_package_uhc.t
  - add t/8109_old_package_utf2.t
  - add t/8110_old_package_wtf8.t
  - created by INABA Hitoshi

0.55  2023-03-23 00:00:00
  - fix ver.0.54
  - created by INABA Hitoshi

0.54  2023-03-20 00:00:00
  - fix transpiling Sjis::do { block } --> do { block }
  - fix transpiling Sjis::eval { block } --> eval { block }
  - fix transpiling Sjis::split --> mb::_split
  - update POD
  - created by INABA Hitoshi

0.53  2023-03-17 00:00:00
  - supports Sjis::* subroutines when sjis encoding
  - supports GBK::* subroutines when gbk encoding
  - supports UHC::* subroutines when uhc encoding
  - supports Big5::* subroutines when big5 encoding
  - supports Big5HKSCS::* subroutines when big5hkscs encoding
  - supports EUCJP::* subroutines when eucjp encoding
  - supports GB18030::* subroutines when gb18030 encoding
  - supports RFC2279::* subroutines when rfc2279 encoding
  - supports UTF2::* subroutines when utf2 encoding
  - supports WTF8::* subroutines when wtf8 encoding
  - update POD
  - created by INABA Hitoshi

0.52  2022-12-08 00:00:00
  - supports %mb for compatibility with UTF8::R2 script
  - update POD
  - created by INABA Hitoshi

0.51  2022-10-15 00:00:00
  - update POD
  - created by INABA Hitoshi

0.50  2022-10-08 00:00:00
  - update POD
  - created by INABA Hitoshi

0.49  2022-09-14 00:00:00
  - supports RFC2279 encoding by command line option "-e rfc2279"
  - created by INABA Hitoshi

0.48  2022-09-02 00:00:00
  - update POD
  - created by INABA Hitoshi

0.47  2022-08-20 00:00:00
  - update POD
  - remove /o from regexp
  - created by INABA Hitoshi

0.46  2022-08-06 00:00:00
  - update POD
  - created by INABA Hitoshi

0.45  2022-07-14 00:00:00
  - update POD
  - created by INABA Hitoshi

0.44  2022-06-12 00:00:00
  - update POD
  - created by INABA Hitoshi

0.43  2022-05-10 00:00:00
  - update POD
  - created by INABA Hitoshi

0.42  2022-04-19 00:00:00
  - update POD
  - created by INABA Hitoshi

0.41  2022-03-18 00:00:00
  - fix eratta of comments
  - update POD
  - created by INABA Hitoshi

0.40  2022-02-19 00:00:00
  - updated for safety and long life
  - add MOJIBAKE samples
  - created by INABA Hitoshi

0.39  2022-02-05 00:00:00
  - supports try/catch syntax
  - add DAMEMOJI samples
  - created by INABA Hitoshi

0.38  2022-01-25 00:00:00
  - remove some documents
  - created by INABA Hitoshi

0.37  2022-01-18 00:00:00
  - supports iterating over multiple values at a time: for my ($key, $value) (%hash) { ... }
  - supports iterating over multiple values at a time: for my ($left, $right, $gripping) (@moties) { ... }
  - supports defer { block }
  - created by INABA Hitoshi

0.36  2021-10-30 00:00:00
  - supports /[]/xx, m/[]/xx, qr/[]/xx, s/[]//xx, split /[]/xx, and split m/[]/xx
  - created by INABA Hitoshi

0.35  2021-10-20 00:00:00
  - supports signatures
  - created by INABA Hitoshi

0.34  2021-10-19 00:00:00
  - supports opendir(my $dir, ...)
  - created by INABA Hitoshi

0.33  2021-10-15 00:00:00
  - allow 07, 0o7 and 0O7
  - allow 0b1 and 0B1
  - allow 123.4e5,  123.4E5,  123.e5,  123.E5,  .4e5,  and .4E5
  - allow 123.4e+5, 123.4E+5, 123.e+5, 123.E+5, .4e+5, and .4E+5
  - allow 123.4e-5, 123.4E-5, 123.e-5, 123.E-5, .4e-5, and .4E-5
  - allow 0xFF, 0XFF, 0xff, and 0Xff
  - allow 0xFF.Ep5,  0xFF.EP5,  0xFF.p5,  and 0xFF.P5
  - allow 0xFF.Ep+5, 0xFF.EP+5, 0xFF.p+5, and 0xFF.P+5
  - allow 0xFF.Ep-5, 0xFF.EP-5, 0xFF.p-5, and 0xFF.P-5
  - allow 0Xff.Ep5,  0Xff.EP5,  0Xff.p5,  and 0Xff.P5
  - allow 0Xff.Ep+5, 0Xff.EP+5, 0Xff.p+5, and 0Xff.P+5
  - allow 0Xff.Ep-5, 0Xff.EP-5, 0Xff.p-5, and 0Xff.P-5
  - created by INABA Hitoshi

0.32  2021-10-03 00:00:00
  - expands wildcard arguments of command line on Microsoft Windows
  - created by INABA Hitoshi

0.31  2021-08-26 00:00:00
  - escape "@{^CAPTURE}" to "@{[mb::_CAPTURE()]}", not "@{[join $", mb::_CAPTURE()]}"
  - created by INABA Hitoshi

0.30  2021-06-28 00:00:00
  - fix POD
  - created by INABA Hitoshi

0.29  2021-06-16 00:00:00
  - fix print lc $_;
  - created by INABA Hitoshi

0.28  2021-05-25 00:00:00
  - supports die <<HEREDOC, and more
  - add SEE ALSO of POD
  - created by INABA Hitoshi

0.27  2021-04-24 00:00:00
  - fix confess() and cluck() messages
  - created by INABA Hitoshi

0.26  2021-04-13 00:00:00
  - fix return then /regexp/
  - fix $any->split, etc
  - created by INABA Hitoshi

0.25  2021-03-15 00:00:00
  - fix mb::_ignorecase()
  - created by INABA Hitoshi

0.24  2021-03-14 00:00:00
  - supports print FILEHANDLE <<HEREDOC
  - fix tr/A-Z/a-z/
  - use subroutine prototype
  - sorts POD document
  - created by INABA Hitoshi

0.23  2021-02-27 00:00:00
  - fix parse_expr_balanced()
  - fix cluck()
  - removed package name from some variables
  - created by INABA Hitoshi

0.22  2021-02-21 00:00:00
  - supports version strings
  - removed package name from some variables
  - created by INABA Hitoshi

0.21  2021-02-14 00:00:00
  - fix mb::reverse() with no parameters on scalar context
  - local $_ in mb::chr, mb::_lstat, mb::_stat
  - created by INABA Hitoshi

0.20  2021-01-27 00:00:00
  - removes $term and introduce parse_ambiguous_char()
  - removes mb::PERL package
  - CORE::split() acts as mb::split()
  - supports stacking filetest with no space like -r-w-x
  - created by INABA Hitoshi

0.19  2021-01-10 00:00:00
  - supports free format of mb::use, mb::no
  - created by INABA Hitoshi

0.18  2021-01-06 00:00:00
  - tried to CPAN Test id=116942340, 116942329, 116879165, 116879164, 116879048, 116879043, 116837347
  - created by INABA Hitoshi

0.17  2021-01-02 00:00:00
  - supports mb::use, mb::no
  - created by INABA Hitoshi

0.16  2020-12-29 00:00:00
  - supports mb::PERL (use Perl module in MBCS encoding)
  - created by INABA Hitoshi

0.15  2020-12-27 00:00:00
  - supports codepoint range of codepoint class of regular expression by hyphen
  - supports new octal syntax 0oddddd
  - created by INABA Hitoshi

0.14  2020-12-13 00:00:00
  - supports WTF-8
  - created by INABA Hitoshi

0.13  2020-12-12 00:00:00
  - supports range of ASCII by hyphen for tr///
  - created by INABA Hitoshi

0.12  2020-11-28 00:00:00
  - was changed interface of mb::_open_w()
  - supports mb::get_OSNAME()
  - supports mb::get_script_encoding()
  - supports autovivification of file handle only on perl 5.005
  - supports mb::_chdir() with no parameters
  - created by INABA Hitoshi

0.11  2020-09-05 00:00:00
  - INCOMPATIBLE CHANGE: transpiles eval 'string' to eval 'string' (NOT mb::eval 'string')
  - INCOMPATIBLE CHANGE: transpiles do 'file' to do 'file' (NOT mb::do 'string')
  - INCOMPATIBLE CHANGE: transpiles require 'file' to require 'file' (NOT mb::require 'string')
  - created by INABA Hitoshi

0.10  2020-08-30 00:00:00
  - supports also opendir, not only opendir()
  - removed "use Symbol;"
  - fix from \*qq{...} to qq{...}, transpiling filetest -X qq{...}
  - avoid syntax error: Can't coerce array into hash at ..., transpiling regexp /[ABC]{3}/
  - created by INABA Hitoshi

0.09  2020-08-28 00:00:00
  - supports also lstat, not only lstat()
  - supports also stat, not only stat()
  - supports also filetest -X testee, not only -X (testee)
  - supports stackable file test operators
  - created by INABA Hitoshi

0.08  2020-07-28 00:00:00
  - supports also mb::getc, not only mb::getc()
  - created by INABA Hitoshi

0.07  2020-07-25 00:00:00
  - add cluck() subroutine
  - fix qq-like here document (remove unnecessary \n)
  - supports $mb::PERL as $^X($EXECUTABLE_NAME) for execute MBCS Perl script
  - supports $mb::ORIG_PROGRAM_NAME as original $0($PROGRAM_NAME) before transpile
  - created by INABA Hitoshi

0.06  2020-07-16 00:00:00
  - supports absolute path of mb::do()
  - supports absolute path of mb::require()
  - created by INABA Hitoshi

0.05  2020-07-15 00:00:00
  - removed some tests to avoid FAIL on MSWin32(I beg better idea).
  - created by INABA Hitoshi

0.04  2020-07-14 00:00:00
  - allows calling subroutines without parentheses, chop, chr, do, dosglob, eval, index, index_byte, lc, lcfirst, length, ord, require, reverse, rindex, rindex_byte, substr, tr, uc, ucfirst, split, chdir, and unlink
  - self support confess() for MBCS encoding
  - created by INABA Hitoshi

0.03  2020-07-13 00:00:00
  - support s###
  - fix (?:@{mb::_dot}) to (?:@{[@mb::_dot]}), and so on
  - created by INABA Hitoshi

0.02  2020-07-12 00:00:00
  - fix test scripts on MSWin32 but not MBCS
  - fix running on Microsoft Windows of detect_system_encoding
  - created by INABA Hitoshi

0.01  2020-07-07 00:00:00
  - mb.pm modulino original version
  - created by INABA Hitoshi

Sjis/1.22  2019-08-29 00:00:00
  - remove unnecessary logic from e_string
  - support KSC5601
  - support Big5
  - created by INABA Hitoshi

Sjis/1.21  2019-08-25 00:00:00
  - rename dist name Char-Sjis-ver.sion.tar.gz to Sjis-ver.sion.tar.gz
  - remove lib/Char/Sjis.pm
  - move t/Sjis/*.t to t/*.t
  - created by INABA Hitoshi

Sjis/1.20  2019-07-22 00:00:00
  - unfix Experimental Issue: meta_yml_has_provides
  - created by INABA Hitoshi

Sjis/1.19  2019-07-21 00:00:00
  - fix Kwalitee Issues: main_module_version_matches_dist_version, again
  - created by INABA Hitoshi

Sjis/1.18  2019-07-20 00:00:00
  - fix Kwalitee Issues: main_module_version_matches_dist_version
  - fix Extra Issues: meta_yml_declares_perl_version
  - created by INABA Hitoshi

Sjis/1.17  2019-07-19 00:00:00
  - fix Experimental Issue: meta_yml_has_provides
  - created by INABA Hitoshi

Sjis/1.16  2019-07-14 00:00:00
  - fix Kwalitee Issue: distname_matches_name_in_meta
  - try fixing Kwalitee Issue: meta_json_conforms_to_known_spec
  - try fixing Kwalitee Issue: meta_yml_conforms_to_known_spec
  - fix Extra Issue: has_tests_in_t_dir
  - fix Extra Issue: use_warnings
  - fix Experimental Issue: has_separate_license_file
  - remove makealldists.pl, makeallt.pl, and make_CaseFolding.pl
  - fix tr//xyz/c --> 'x' to 'z'
  - created by INABA Hitoshi

Sjis/1.15  2019-05-02 00:00:00
  - fix Kwalitee Issue: main_module_version_matches_dist_version
  - fix Extra Issue: has_meta_json
  - fix Experimental Issue: meta_yml_has_repository_resource
  - convert some documents to UTF-8
  - created by INABA Hitoshi

Sjis/1.14  2019-04-30 00:00:00
  - try https://rt.cpan.org/Public/Bug/Display.html?id=129343
  - created by INABA Hitoshi

Sjis/1.13  2019-04-28 00:00:00
  - avoid Kwalitee Issue no_pod_errors
  - avoid Kwalitee Issue use_strict
  - add 403_podtest.t
  - rename Sjis/JA.pm to Sjis/JA.pod
  - created by INABA Hitoshi

Sjis/1.12  2019-04-15 00:00:00
  - 098_jperlprint.t covers cygwin
  - 213_do.t covers perl 5.26 or later
  - 355_substr_perldoc.t with script header avoids FAIL of test
  - add 402_regexp_xx.t
  - skip test t/Sjis/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/Big5HKSCS/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/Big5Plus/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/GB18030/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/GBK/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/HP15/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/INFORMIXV6ALS/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/KPS9566/212_dbmopen.t on perl 5.028 on MSWin32
  - skip test xt/UHC/212_dbmopen.t on perl 5.028 on MSWin32
  - support CaseFolding-12.0.0.txt
  - created by INABA Hitoshi

Sjis/1.11  2018-09-22 00:00:00
  - support indented here-documents
  - created by INABA Hitoshi

Sjis/1.10  2018-09-20 00:00:00
  - support CaseFolding-11.0.0.txt
  - created by INABA Hitoshi

Sjis/1.09  2018-09-18 00:00:00
  - exit with actual exit value
  - change META.yml version 1.3 to 1.4
  - remove pMakefile.PL
  - add pmake.bat
  - add LICENSE
  - skip test t/Sjis/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/Big5HKSCS/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/Big5Plus/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/GB18030/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/GBK/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/HP15/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/INFORMIXV6ALS/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/KPS9566/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - skip test xt/UHC/212_dbmopen.t on perl 5.028 on MSWin32 AMD64
  - created by INABA Hitoshi

Sjis/1.08  2016-07-29 00:00:00
  - support Windows 10
  - remove SjisTk module support
  - created by INABA Hitoshi

Sjis/1.07  2016-07-10 00:00:00
  - fc() supports CaseFolding-9.0.0.txt
  - support StrawberryPerl 5.24.0
  - support ActivePerl 5.24.0
  - created by INABA Hitoshi

Sjis/1.06  2015-05-29 00:00:00
  - remove 181_jperlre.t
  - add README2ND
  - created by INABA Hitoshi

Sjis/1.05  2015-06-15 00:00:00
  - performance enhancements by (?>possessive groups)
  - support StrawberryPerl 5.20.2
  - support ActivePerl 5.20.2
  - support Perl 5.22.0
  - support StrawberryPerl 5.22.0
  - support (~. |. &. ^. &.= |.= ^.=) bitwise operators
  - support <<>> double-diamond operator
  - support /n non-capturing regular expression flag
  - support fc() Unicode 7.0 case folding
  - change qr/[[:^lower:]]/i and qr/[[:^upper:]]/i to Perl 5.16 compatible
  - support -i switch on command line on use Char, use Sjis
  - support -w switch on command line on use Char
  - not support \b{...} and \B{...}
  - yada yada operator document
  - add make_CaseFolding.pl
  - created by INABA Hitoshi

Sjis/1.04  2015-03-01 00:00:00
  - boring version numbers
  - fix broken POD documents on CPAN
  - add documents
  - fix _open_a to _open_r in Esjis::do
  - flushing output at make file
  - add test scripts to all encoding distributions
  - cope with "Parse errors: No plan found in TAP output" on FreeBSD and NetBSD
  - cope with "/bin/sh: /bin/perl: Argument list too long" on Mac OS X
  - changed two pass filter to one pass
  - created by INABA Hitoshi

Sjis/1.03  2015-02-01 00:00:00
  - support Char::eval
  - support # encoding: OldUTF8
  - integrated the Sjis software family
  - add makealldists.pl
  - add makeallt.pl
  - add Sjis/JA.pm
  - add Sjis/The_moment_of_birth_of_ShiftJIS_aka_MSKanji.txt
  - add Sjis/escapelist.txt
  - add t/dist/*.t
  - created by INABA Hitoshi

Sjis/1.02  2015-01-01 00:00:00
  - support Sjis::eval
  - support StrawberryPerl 5.20.1
  - support ActivePerl 5.20.1
  - optimize LONG_STRING_FOR_RE
  - created by INABA Hitoshi

Sjis/1.01  2014-09-08 00:00:00
  - avoid "Octal number in vector unsupported" on perl 5.6
  - fix broken t/243_filetest.t of Big5Plus
  - created by INABA Hitoshi

Sjis/1.00  2014-09-01 00:00:00
  - support EUC-TW
  - support yada-yada or triple-dot operator
  - created by INABA Hitoshi

Sjis/0.99  2014-08-03 00:00:00
  - fix fix name: in META.yml Char::Sjis to Char-Sjis
  - fix sub e_capture() on SBCS
  - created by INABA Hitoshi

Sjis/0.98  2014-08-02 00:00:00
  - experimental release
  - created by INABA Hitoshi

Sjis/0.97  2014-07-28 00:00:00
  - fix name: in META.yml
  - support Perl 5.20.0
  - support StrawberryPerl 5.20.0
  - support perl on Raspberry Pi
  - created by INABA Hitoshi

Sjis/0.96  2014-04-26 00:00:00
  - fix m/[ABC]/i
  - created by INABA Hitoshi

Sjis/0.95  2014-01-21 00:00:00
  - fix using "use 5.00503;"
  - created by INABA Hitoshi

Sjis/0.94  2014-01-13 00:00:00
  - support CaseFolding-6.3.0.txt
  - support Perl 5.18.2
  - created by INABA Hitoshi

Sjis/0.93  2013-12-29 00:00:00
  - fix quoting after filetest operators
  - Esjis::unlink() deletes read only file too
  - remove PERL5.BATes
  - remove strict.pm_, warnings.pm_, warnings/register.pm_, and feature.pm_
  - truncate(), getpwnam(), and getpwuid() into eval q{}
  - consider Win95Cmd.exe by PERL5SHELL
  - remove $ENV{'COMSPEC'}
  - changed condition for escaping script
  - support ActivePerl 5.18.1.1800 Windows (x86)
  - support ActivePerl 5.18.1.1800 Windows (64-bit, x64)
  - created by INABA Hitoshi

Sjis/0.92  2013-07-18 00:00:00
  - support JIS8
  - support Arabic
  - support Hebrew
  - support TIS-620
  - created by INABA Hitoshi

Sjis/0.91  2013-07-07 00:00:00
  - improve split() for over 32766 octet string
  - add short README
  - use Esjis ver.sion; --> use Esjis ver.sion.0;
  - undo BEGIN { unshift @INC, '/Perl/site/lib/Sjis'; } in Esjis.pm
  - created by INABA Hitoshi

Sjis/0.90  2013-06-08 00:00:00
  - support Perl 5.18.0
  - support StrawberryPerl 5.18.0
  - \s in a regex matches a vertical tab on perl 5.18.0 or later
  - support lvalue Sjis::substr()
  - follow File::HomeDir 1.00
  - support DWIM Perl
  - add dperl.bat
  - created by INABA Hitoshi

Sjis/0.89  2013-05-12 00:00:00
  - cancel improving multi-byte anchoring for over 32766 octet string on perl 5.10.0
  - add perl518.bat, perl64518.bat, aperl518.bat, aperl64518.bat, sperl518.bat, and sperl64518.bat
  - support Cygwin's Perl
  - add cperl.bat
  - created by INABA Hitoshi

Sjis/0.88  2013-05-01 00:00:00
  - improve multi-byte anchoring for over 32766 octet string
  - remove multi-byte anchoring of UTF2 and OldUTF8
  - support ActivePerl 5.16.3
  - support ActivePerl 5.14.4
  - fix errata
  - created by INABA Hitoshi

Sjis/0.87  2013-03-22 00:00:00
  - support Strawberry Perl 5.16.3
  - support Perl 5.16.3
  - support Strawberry Perl 5.14.4
  - support Perl 5.14.4
  - fix errata
  - remove module (Win32.pm)
  - created by INABA Hitoshi

Sjis/0.86  2013-01-27 00:00:00
  - fix Sjis::getc(BAREWORD)
  - created by INABA Hitoshi

Sjis/0.85  2013-01-13 00:00:00
  - support Microsoft Windows 95
  - support Microsoft Windows NT 4.0
  - support KPS 9566
  - support Sjis::getc()
  - created by INABA Hitoshi

Sjis/0.84  2012-11-19 00:00:00
  - support Strawberry Perl 5.16.2
  - support Perl 5.16.2
  - delete escape-characters of run-time command
  - have to use both two-argument and three-argument open()
  - support Microsoft Windows 8 Pro (x64)
  - support PowerShell 3.0
  - created by INABA Hitoshi

Sjis/0.83  2012-09-29 00:00:00
  - support Strawberry Perl 5.16.1
  - support ActivePerl 5.16.1
  - support x64 of ActivePerl and Strawberry Perl
  - new ver.sion.0 check (match or die)
  - fix $_ !~ s/regexp/replacement/
  - remove ESCAPE_SECOND_OCTET on single byte encoding
  - escape left brace on un-escaping of \N{...}, \p{...}, and \P{...}
  - remove "distribution_type: script" from META.yml
  - add perl64512.bat, perl64514.bat, perl64516.bat, aperl64512.bat, aperl64514.bat, aperl64516.bat, sperl64512.bat, sperl64514.bat, and sperl64516.bat
  - created by INABA Hitoshi

Sjis/0.82  2012-07-29 00:00:00
  - support Strawberry Perl 5.16.0
  - support ActivePerl 5.16.0
  - support variables in character class in regular expression
  - created by INABA Hitoshi

Sjis/0.81  2012-05-25 00:00:00
  - support fold case escape \F and function fc()
  - support scalar context of Esjis::stat, Esjis::stat_, Esjis::lstat, and Esjis::lstat_
  - support Strawberry Perl 5.8, 5.10, 5.12, and 5.14
  - become independent of strict.pm
  - add feature.pm
  - add perl5.bat
  - add aperl58.bat, aperl510.bat, aperl512.bat, aperl514.bat, and aperl516.bat
  - add sperl58.bat, sperl510.bat, sperl512.bat, sperl514.bat, and sperl516.bat
  - fix dummy access (-T and -B for underline cache) in Esjis::T, Esjis::T_, Esjis::B, and Esjis::B_
  - fix $dbh->Esjis::do to $dbh->do on DBI
  - fix Esjis::split(/(-)|(,)/,"1-10,20") --> (1,"-",undef,10,undef,",",20)
  - fix "\v" means "\x0A", "\x0B", "\x0C", and "\x0D"
  - remove './' at head of return value from Esjis::glob and Esjis::glob_
  - created by INABA Hitoshi

Sjis/0.80  2012-03-22 00:00:00
  - support byte-oriented regexp //b, m//b, m''b, s///b, s'''b, qr//b, qr''b, split(//b), split(m//b), split(m''b), split(qr//b), and split(qr''b)
  - support match once only ??, m??, ??b, and m??b
  - support literal null string pattern
  - support $`, $PREMATCH, ${^PREMATCH}, $&, $MATCH, ${^MATCH}, &', $POSTMATCH, and ${^POSTMATCH}
  - add perl516.bat
  - created by INABA Hitoshi

Sjis/0.79  2011-12-23 00:00:00
  - fix m/[[:lower:]]/i, m/[[:upper:]]/i, m/[[:^lower:]]/i, and m/[[:^upper:]]/i
  - created by INABA Hitoshi

Sjis/0.78  2011-10-28 00:00:00
  - support Windows-1258
  - update documents and URL
  - created by INABA Hitoshi

Sjis/0.77  2011-07-27 00:00:00
  - support KOI8-R, KOI8-U, US-ASCII
  - created by INABA Hitoshi

Sjis/0.76  2011-06-30 00:00:00
  - import $fix_drive_relative_paths from File::DosGlob/1.04
  - support regexp metasymbols \C and \R in regexp
  - support regexp metasymbol \N \N{3} \N{3,} \N{3,5}
  - \N{CHARNAME} means literal N{CHARNAME}
  - \p{PROP} means literal p{PROP}
  - \P{PROP} means literal P{PROP}
  - \X means literal X
  - support POSIX-style character classes
  - modifier /a /d /l /u, and /aa of regexp makes die
  - use 5.12.0; --> use 5.12.0; no strict qw(refs);
  - remove test 201_kanji.t,202_kanji.t,203_kanji.t,204_kanji.t,205_glob.t,210_chmod.t,211_chown.t,212_dbmopen.t,214_glob.t,216_open.t,217_qx.t,218_rename.t,221_sysopen.t,222_system.t,223_truncate.t,225_utime.t,226_chdir.t,227_chmod.t,228_chown.t,229_glob.t,230_mkdir.t,232_qx.t,233_rename.t,234_rmdir.t,235_system.t, and 236_utime.t from EUCJP,UTF2,OldUTF8
  - created by INABA Hitoshi

Sjis/0.75  2011-06-05 00:00:00
  - remove Esjis::binmode and Esjis::open (it's a bad idea)
  - created by INABA Hitoshi

Sjis/0.74  2011-06-01 00:00:00
  - remove Esjis::k_ test
  - fix s#foo#\\#, s#foo#\\#g, s'foo'\\', and s'foo'\\'g
  - created by INABA Hitoshi

Sjis/0.73  2011-05-12 00:00:00
  - hexadecimal escape sequence, \x{HHHHHH} in double-quote-like contexts
  - octal escape sequence, \o{OOOOOO} in double-quote-like contexts
  - support tr///r, y///r
  - support s///r
  - rewrite 'use strict;' to 'use strict; no strict qw(refs);'
  - fix m/$var/i: m/[$VAR$var]/ to m/@{[Esjis::ignorecase($var)]}/
  - fix s//code/e, s//code/ee, s//code/eee, ...
  - support Windows-1252
  - PASS all tests on perl 5.00503 of Solaris8
  - PASS all tests on perl 5.00503 of TURBOLINUX WORKSTATION Japanese 6.0 Limited Edition
  - created by INABA Hitoshi

Sjis/0.72  2011-03-04 00:00:00
  - change name Sjis to Char::Sjis
  - support Latin-2, Latin-3, Latin-4, Latin-5, Latin-6, Latin-7, Latin-8, Latin-9
  - support Cyrillic, Greek
  - add perl514.bat
  - created by INABA Hitoshi

Sjis/0.71  2011-01-26 00:00:00
  - support @homepage environment of @nifty. (Debugging ended thanks to valuable cooperation of jscripter)
  - created by INABA Hitoshi

Sjis/0.70  2011-01-14 00:00:00
  - remove multibyte anchoring of UTF2 and OldUTF8
  - propagate @INC by -I switch from script.pl to script.pl.e
  - propagate $^W by -w switch from script.pl to script.pl.e
  - support chdir(\x5c ends path) by perl5.006 or perl5.00800 on MSWin32(jacode.pl library required)
  - support chdir(\x5c ends long path) by perl5.008001 or later, perl5.010 or perl5.012 on MSWin32(Win32 module required)
  - support GBK
  - bundle strict.pm_ as dummy strict.pm
  - add perl55.bat and perl56.bat
  - created by INABA Hitoshi

Sjis/0.69  2010-12-21 00:00:00
  - support MacOS by Sjis software
  - correct open mode before flock()
  ; beside "escape" by Delight Prescott of MacPerl Power and Ease

Sjis/0.68  2010-11-09 00:00:00
  - re-correct 244_3open.t and 245_2binmode.t
  - created by INABA Hitoshi

Sjis/0.67  2010-11-08 00:00:00
  - correct 244_3open.t and 245_2binmode.t
  - created by INABA Hitoshi

Sjis/0.66  2010-11-07 00:00:00
  - emulate two-argument binmode() on perl5.005
  - emulate three-argument open() on perl5.005
  - dummy functions of utf8.pm and bytes.pm
  - correct write locking routine
  - bundle warnings.pm_ and warnings/register.pm_
  - created by INABA Hitoshi

Sjis/0.65  2010-09-16 00:00:00
  - check code page on DOS-like system before test
  - created by INABA Hitoshi

Sjis/0.64  2010-09-14 00:00:00
  - support SjisTk module
  - support \l, \u, lcfirst, and ucfirst
  - add test of Latin1
  - created by INABA Hitoshi

Sjis/0.63  2010-07-04 00:00:00
  - add test of Big5Plus, Big5HKSCS, GB18030, and UHC
  - created by INABA Hitoshi

Sjis/0.62  2010-07-03 00:00:00
  - redefine \b and \B
  - created by INABA Hitoshi

Sjis/0.61  2010-06-27 00:00:00
  - fix OldUTF8
  - initialize tr variables on demand
  - fix Esjis::lc and Esjis::uc's bug
  - created by INABA Hitoshi

Sjis/0.60  2010-06-16 00:00:00
  - back *.pm files from /lib
  - created by INABA Hitoshi

Sjis/0.59  2010-06-14 00:00:00
  - move *.pm files to /lib
  - fix Makefile.PL
  - fix m/[$@]/ to m/[\$\@]/
  - add HP15 and INFORMIXV6ALS test
  - support Big5-HKSCS
  - created by INABA Hitoshi

Sjis/0.58  2010-06-07 00:00:00
  - fix escapeshellcmd
  - created by INABA Hitoshi

Sjis/0.57  2010-06-02 00:00:00
  - do BEGIN { unshift @INC, '/Perl/site/lib/Sjis'; } in Esjis.pm
  - support 'no Module'
  - remove special routine of Tk module
  - test does only one version of perl
  - support TAP(Test Anything Protocol)
  - add ShiftJIS::Regexp's test
  - rename Makefile.PL to pMakefile.PL(Poor Makefile.PL) for DOS like system
  - standard Makefile.PL for UNIX like system
  - warn if chdir "\x5c" ended path on $^W is true
  - created by INABA Hitoshi

Sjis/0.56  2010-04-21 00:00:00
  - add JPerl's test
  - fix [^]] in regexp from <'^' then ']'> to <not ']'>
  - [] in regexp make die "unmatched [] in regexp at ..."
  - support \b and \B in regexp
  - created by INABA Hitoshi

Sjis/0.55  2010-04-16 00:00:00
  - test.pl support perl5.012
  - support when as a statement modifier
  - support := operator
  - created by INABA Hitoshi

Sjis/0.54  2010-04-02 00:00:00
  - fix /i modifier with character class '[ccc]' in regexp
  - support old UTF-8
  - created by INABA Hitoshi

Sjis/0.53  2010-04-01 00:00:00
  - support Latin-1
  - created by INABA Hitoshi

Sjis/0.52  2010-03-17 00:00:00
  - bugfix ${ foo } in regexp
  - remove modules (re.pm, Fcntl.pm and Symbol.pm)
  - call flock in Esjis::do and Esjis::require
  - add perl64.bat
  - Makefile.pl support UNIX like system
  - created by INABA Hitoshi

Sjis/0.51  2010-03-07 00:00:00
  - remove ** UNAUTHORIZED RELEASE ** modules (Fcntl.pm and Symbol.pm)
  - created by INABA Hitoshi

Sjis/0.50  2010-03-07 00:00:00
  - correct INFOMIXV6ALS to INFORMIXV6ALS (sorry!! forgive me!! ;X)
  - add UNIX like system's shell escape
  - glob @ARGV when [?*] included only
  - avoid warning in Esjis::e
  - flock on write and read script
  - add substitute modules (Fcntl.pm and Symbol.pm)
  - remove modules (Carp.pm and FindBin.pm)
  - created by INABA Hitoshi

Sjis/0.49  2010-02-10 00:00:00
  - add perl512.bat
  - redefined character class \d \s \w for perl 5.11 or later
  - fix test.pl and comment of BUGS AND LIMITATIONS about /o modifier
  - created by INABA Hitoshi

Sjis/0.48  2010-01-28 00:00:00
  - Call Module->import() when Module->can('import') is true only
  - No escape when require jcode.pl and jacode.pl
  - Remove limitation of two or more here-documents in a line
  - created by INABA Hitoshi

Sjis/0.47  2010-01-02 00:00:00
  - shorten script of EUCJP.pm and UTF2.pm
  - glob always function as File::DosGlob::glob
  - ignore use module File::DosGlob, Wildcard, Japanese, and JExt
  - created by INABA Hitoshi

Sjis/0.46  2009-12-02 00:00:00
  - fix bug of split q//
  - created by INABA Hitoshi

Sjis/0.45  2009-11-30 00:00:00
  - fix bug of Esjis::split when string is empty
  - created by INABA Hitoshi

Sjis/0.44  2009-11-16 00:00:00
  - support given and when keywords
  - support \gN, \g{N}, and \g{-N} in s///
  - support stacked filetest operators
  - created by INABA Hitoshi

Sjis/0.43  2009-10-12 00:00:00
  - support UTF-2 (aka UTF-8)
  - fix bug of join separated multiple octet of EUCJP, INFOMIXV6ALS, and GB18030
  - created by INABA Hitoshi

Sjis/0.42  2009-09-28 00:00:00
  - rewrite split(m/^/) to split(m/^/m) on any version of perl
  - fix bug of function Sjis::substr()
  - created by INABA Hitoshi

Sjis/0.41  2009-09-18 00:00:00
  - add test script
  - rename Esjis::ord() to Sjis::ord()
  - rename Esjis::reverse() to Sjis::reverse()
  - remove Esjis::shift_matched_var()
  - add Esjis::capture()
  - support !~ tr///
  - support s///g
  - support \h and \v
  - created by INABA Hitoshi

Sjis/0.40  2009-08-27 00:00:00
  - support INFOMIX V6 ALS, GB18030, EUC-JP
  - created by INABA Hitoshi

Sjis/0.39  2009-08-06 00:00:00
  - support Sjis::length, Sjis::substr, Sjis::index, and Sjis::rindex
  - created by INABA Hitoshi

Sjis/0.38  2009-08-05 00:00:00
  - improve qw
  - filetest operator before parenthesis '-X ('
  - escape sequence of hexadecimal number of one digit
  - fix bugs of function charlist_not_qr
  - created by INABA Hitoshi

Sjis/0.37  2009-07-09 00:00:00
  - separate Tk modules, make-*.pl, and test scripts
  - remove perl55.bat, and perl56.bat
  - created by INABA Hitoshi

Sjis/0.36  2009-05-17 00:00:00
  - do local $@ before eval
  - support Tk::getOpenFile and Tk::getSaveFile
  - rewrite in pure batch file perl55.bat, perl56.bat, perl58.bat, and perl510.bat
  - fixing world writable files in tarball before upload to CPAN [ #38127 ]
  - created by INABA Hitoshi

Sjis/0.35  2009-05-06 00:00:00
  - support do, require, and use for user library
  - upper compatible function ord and reverse functions only when demanded
  - support p modifier of m//, s///, and qr// of perl5.10
  - support !~~ operator
  - change to secure code, open() to sysopen()
  - change to secure code, undef %ENV before system()
  - add make-hp15.pl(HP-15 Hewlett-Packard developed)
  - created by INABA Hitoshi

Sjis/0.34  2009-04-01 00:00:00
  - memorial version on birth day
  - Sjis::Tk::* modules pre alpha support
  - created by INABA Hitoshi

Sjis/0.33  2009-02-15 00:00:00
  - add script perl56.bat
  - use Tk --> use Sjis::Tk alpha support
  - created by INABA Hitoshi

Sjis/0.32  2009-02-03 00:00:00
  - add script perl55.bat
  - wildcard globbing of @ARGV on command.com or cmd.exe
  - support chr(0x5C) ended path of do '', do "", require '', and require "" on MSWin32
  - chdir croak when dirname ends chr(0x5C) on MSWin32
  - created by INABA Hitoshi

Sjis/0.31  2009-01-29 00:00:00
  - create test data file on execute test.pl
  - require run-time module version
  - rewrite all about "split" logic
  - created by INABA Hitoshi

Sjis/0.30  2009-01-04 00:00:00
  - support context when calling lc(), lc, uc(), uc
  - support chr(0x5C) ended path on MSWin32
    - file test operators
    - functions lstat(), opendir(), stat(), and unlink()
    - glob() and <WILDCARD>
  - remove pl2ebat.bat, jperl55.bat, jperl58.bat, and jperl510.bat
  - merge esjis.pl into Sjis.pm
  - matched variables $1,$2,$3,... after s/// came to function as it was a description
  - support function of chr, ord, and reverse again
  - add test filetest, pathdir, pathfile, and perlmemo
  - created at kanmi-kissa Hahaso in Chichibu

Sjis/0.29  2008-11-20 00:00:00
  - remove \G from $your_gap
  - created by INABA Hitoshi

Sjis/0.28  2008-09-05 00:00:00
  - upgrade Makefile.PL
  - fix backslashed hexadecimal character escapes
  - fix backslashed octal character escapes
  - cancel upper compatible function of chr, ord, and reverse to backward compatibility
  - $1,$2,$3... of s/// in script means $2,$3,$4...
  - created by INABA Hitoshi

Sjis/0.27  2008-08-28 00:00:00
  - change tr output ex. (my $aaa = $bbb) =~ tr/XYZ/xyz/;
    before:
        (my $aaa = $bbb), Esjis::tr($bbb,'XYZ','xyz','');
    after:
        Esjis::tr((my $aaa = $bbb),'XYZ','xyz','');
  - created by INABA Hitoshi

Sjis/0.26  2008-08-27 00:00:00
  - fix errata
  - created by INABA Hitoshi

Sjis/0.25  2008-08-25 00:00:00
  - add Big5Plus, GBK, and UHC support
  - created by INABA Hitoshi

Sjis/0.24  2008-08-18 00:00:00
  - cancel \x{HHHH} syntax support in qq, m, s, and qr
  - escape second octet | of double octet in qq and "" for open() and system()
  - support \1,\2,\3 syntax of s///, and s'''
  - add Japanese document
  - created by INABA Hitoshi

Sjis/0.23  2008-08-11 00:00:00
  - escape second octet ^ of double octet code in m, s, and qr
  - remove brace of \x{HHHH} in qq, m, s, and qr
  - created at cafe mocca in Nagareyama-Otakanomori S.C

Sjis/0.22  2008-08-05 00:00:00
  - support bareword tr, index, rindex, and reverse
  - avoid "Error: Runtime Exception" of q, qq, '', "", and ``
  - remove below bugs
    - escape second octet of double octet code at last q / / string
    - escape second octet \ of double octet code before \ in q / / string
    - / means m / / after print operator
    - m * * rewrite to m { }
    - m - - rewrite to m { }
    - m : : rewrite to m { }
    - m ? ? rewrite to m { }
    - m \ \ rewrite to m { }
    - m ^ ^ rewrite to m { }
    - m | | rewrite to m { }
    - s * * * rewrite to s { } { }
    - s - - - rewrite to s { } { }
    - s : : : rewrite to s { } { }
    - s ? ? ? rewrite to s { } { }
    - s \ \ \ rewrite to s { } { }
    - s ^ ^ ^ rewrite to s { } { }
    - s | | | rewrite to s { } { }
    - qr * * rewrite to qr { }
    - qr - - rewrite to qr { }
    - qr : : rewrite to qr { }
    - qr ? ? rewrite to qr { }
    - qr \ \ rewrite to qr { }
    - qr ^ ^ rewrite to qr { }
    - qr | | rewrite to qr { }
  - created by INABA Hitoshi

Sjis/0.21  2008-07-22 00:00:00
  - add smoke test script
  - remove below bugs
    - remove return $ope of function &e_s2_q
    - remove parameter $ope of function &e_s2 and &e_s2_q
    - add q operator to parameter of function &e_tr_q when delimiter is '/' or '#'
    - add \c@ .. \c_ to $qq_char, $qq_paren, $qq_brace, $qq_bracket, and $qq_angle
    - remove unescape and re-escape logic from function &e_m, &e_s1, and &e_qr
    - any characters meaning .*? in qw { } and qw [ ] to (?:$q_char)*?
    - change \s* to \s+ of between split and m
  - created by INABA Hitoshi

Sjis/0.20  2008-07-14 00:00:00
  - disable below
    - delimiter tr''(), tr''{}, tr''[], and tr''<> of tr///
    - delimiter  y''(),  y''{},  y''[], and  y''<> of y///
    - delimiter  s''(),  s''{},  s''[], and  s''<> of s///
  - limit modifier
    - only c, d, s, b, and B of tr///
    - only c, d, s, b, and B of y///
    - only c, g, i, m, o, s, and x of m//
    - only c, g, i, m, o, s, and x of //
    - only i, m, s, o, and x of qr//
    - only e, g, i, m, o, s, and x of s///
  - change new line code to LF
  - more comment
  - created by INABA Hitoshi

Sjis/0.19  2008-07-03 00:00:00
  - add code for perl5.10
  - created by INABA Hitoshi

Sjis/0.18  2008-05-11 00:00:00
  - tr///B support
  - created by INABA Hitoshi

Sjis/0.17  2008-05-10 00:00:00
  - correct the document
  - created by INABA Hitoshi

Sjis/0.16  2008-05-09 12:00:00
  - separate run-time routines Esjis.pm, add Sjis.pm
  - created by INABA Hitoshi

Sjis/0.15  2008-05-07 00:00:00
  - remove some limitations
  - created at COUNTRY FARM CAFE in Ueno

Sjis/0.14  2008-05-06 00:00:00
  - remove many bugs and add jperl58.bat, perl58.bat
  - created at Cafe CORONA in Akihabara

Sjis/0.13  2008-04-30 00:00:00
  - remove some limitations and many bugs
  - created by INABA Hitoshi

Sjis/0.12  2008-04-27 00:00:00
  - rename Sjis to esjis, remove some limitations
  - created by INABA Hitoshi

Sjis/0.11  2008-04-22 00:00:00
  - compiler version for perl5.5 and perl5.10
  - created by INABA Hitoshi

Sjis/0.10  2008-04-01 00:00:00
  - original version
  - created by INABA Hitoshi
