Skip to content

Performance optimisations - #32

Open
mwsis wants to merge 98 commits into
masterfrom
perf-optimisations
Open

mwsis wants to merge 98 commits into
masterfrom
perf-optimisations

Conversation

@mwsis

@mwsis mwsis commented Sep 29, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

synesissoftware and others added 30 commits August 9, 2026 15:19
* Updated all `\param` and `\retval` Doxygen documentation comments in
  `cstring.h`, `cstring.vector.h`, and `cstring.core.c` to obey the 76-rule
  and terminate with a semicolon;
* Bumped version to 4.0.15 in `cstring.h`, `Doxyfile`, `CHANGES.md`, and
  `NEWS.md`;
* Updated `Updated:` header banners to 6th September 2026;
Give the 28 in-wave C/C++ projects (and gold **c** / **cxx** / **c_cxx**
templates) a sorted **files.associations** union of all associations
found under **~/dev**;
Align library version macros to c-cpp-standards. Define MAJOR, MINOR,
PATCH, and ALPHABETA; compute PREFIX_VER by shifts; keep REVISION as a
skip-section alias of PATCH (target at column 60); retain named historical
VER_* constants only for comparison and documentation.
Add or normalise test/scratch/libver to print the hosting PREFIX_VER as
“Name: vM.m.p.ab (PREFIX_VER = 0x........)” and, when sibling public
headers are included, an “efferent dependencies:” block.
Move test/scratch/libver to test/scratch/versions and retarget the
executable as versions so C/C++ reporters match the Phase 3 freeze.
Add a Phase 3 gold version printer under test/scratch/versions, wire
it from the scratch parent list, and use CMake target/argv0 versions;
Use Dir=$(cd "$(dirname "$ScriptPath")" && pwd) so paths with spaces resolve
reliably; apply the same one-line fix across in-wave helper scripts
(prepare/build/clean/ctest/remove and run_all_*).
Add SisClr_* status colour (NO_COLOR, AlwaysUseColours, TTY gate),
--build-shared-libs, and a single cmake invoke with CMakeGeneratorArgs so
every -D is always passed; tidy prologue groups, quoting, and help text.
Initialise AlwaysUseColours from SIS_CMAKE_ALWAYS_USE_COLOURS /
SIS_ALWAYS_USE_COLOURS; let -A/--always-use-colours override NO_COLOR
(pre-scan args so help and errors are coloured).
Drop MSYSTEM→MinGW and MakeCmd; honour SIS_CMAKE_MINGW via
`sis_cmake_is_truey()`; add sis_cmake_build for -m; configure in-place with
-S/-B and || exit 1; tighten --mingw/--msvc-mt/--run-make help.
Replace MakeCmd/Makefile gating with sis_cmake_build; require a configured
CMakeCache; add SisClr_* colour and -A to match prepare_cmake.sh.
Replace MakeCmd/Makefile gating with sis_cmake_build clean; require a
configured CMakeCache; add SisClr_* colour and -A to match build_cmake.sh.
Add SisClr_* colour and -A; quote inventory loops; recognise Windows_NT;
remove artefacts without cd into the build directory.
Replace MakeCmd with sis_cmake_build; require CMakeCache; fail -M when
unconfigured; add --output-on-failure, SisClr_* colour, and -A.
Make run_all_unit_tests.sh unit-only; align both category runners with
SisClr_*/-A, cmake --build, and gold basename discovery (.exe, print0).
synesissoftware and others added 10 commits September 27, 2026 18:58
* general boilerplate / project-support improvements (#16)

* squash-commit

* 4.0.14

* fix

* 4.0.15 (#20)

* Updated all `\param` and `\retval` Doxygen documentation comments in
  `cstring.h`, `cstring.vector.h`, and `cstring.core.c` to obey the 76-rule
  and terminate with a semicolon;
* Bumped version to 4.0.15 in `cstring.h`, `Doxyfile`, `CHANGES.md`, and
  `NEWS.md`;
* Updated `Updated:` header banners to 6th September 2026;

* markdown

* chore(c-cpp): union files.associations from ~/dev vscode settings

Give the 28 in-wave C/C++ projects (and gold **c** / **cxx** / **c_cxx**
templates) a sorted **files.associations** union of all associations
found under **~/dev**;

* .gitattributes

* .vscode/settings.json

* .vimrc

* CHANGES.md

* chore(<lib>): use computed PREFIX_VER with documented PATCH

Align library version macros to c-cpp-standards. Define MAJOR, MINOR,
PATCH, and ALPHABETA; compute PREFIX_VER by shifts; keep REVISION as a
skip-section alias of PATCH (target at column 60); retain named historical
VER_* constants only for comparison and documentation.

* test(<lib>): ship scratch libver version reporter

Add or normalise test/scratch/libver to print the hosting PREFIX_VER as
“Name: vM.m.p.ab (PREFIX_VER = 0x........)” and, when sibling public
headers are included, an “efferent dependencies:” block.

* test(<lib>): rename scratch libver to versions

Move test/scratch/libver to test/scratch/versions and retarget the
executable as versions so C/C++ reporters match the Phase 3 freeze.

* test: add canonical scratch versions reporter

Add a Phase 3 gold version printer under test/scratch/versions, wire
it from the scratch parent list, and use CMake target/argv0 versions;

* .gitattributes

* fix(c-cpp): quote Dir resolution in CMake helper scripts

Use Dir=$(cd "$(dirname "$ScriptPath")" && pwd) so paths with spaces resolve
reliably; apply the same one-line fix across in-wave helper scripts
(prepare/build/clean/ctest/remove and run_all_*).

* chore(scratch test): **versions** => **test.scratch.version**

* doc(README.md): adding afferent dependencies (**errni**, **rstrip**)

* feat(cstring): colour prepare_cmake and unify cmake configure

Add SisClr_* status colour (NO_COLOR, AlwaysUseColours, TTY gate),
--build-shared-libs, and a single cmake invoke with CMakeGeneratorArgs so
every -D is always passed; tidy prologue groups, quoting, and help text.

* feat(cstring): force colours via env and -A in prepare_cmake

Initialise AlwaysUseColours from SIS_CMAKE_ALWAYS_USE_COLOURS /
SIS_ALWAYS_USE_COLOURS; let -A/--always-use-colours override NO_COLOR
(pre-scan args so help and errors are coloured).

* refactor(cstring): drive prepare builds with cmake --build

Drop MSYSTEM→MinGW and MakeCmd; honour SIS_CMAKE_MINGW via
`sis_cmake_is_truey()`; add sis_cmake_build for -m; configure in-place with
-S/-B and || exit 1; tighten --mingw/--msvc-mt/--run-make help.

* refactor(cstring): drive build_cmake via cmake --build

Replace MakeCmd/Makefile gating with sis_cmake_build; require a configured
CMakeCache; add SisClr_* colour and -A to match prepare_cmake.sh.

* refactor(cstring): drive clean_cmake via cmake --build --target clean

Replace MakeCmd/Makefile gating with sis_cmake_build clean; require a
configured CMakeCache; add SisClr_* colour and -A to match build_cmake.sh.

* refactor(cstring): align remove_cmake_artefacts with helper dialect

Add SisClr_* colour and -A; quote inventory loops; recognise Windows_NT;
remove artefacts without cd into the build directory.

* refactor(cstring): drive ctest_cmake via cmake --build then ctest

Replace MakeCmd with sis_cmake_build; require CMakeCache; fail -M when
unconfigured; add --output-on-failure, SisClr_* colour, and -A.

* refactor(cstring): unit/component runners use sis_cmake_build dialect

Make run_all_unit_tests.sh unit-only; align both category runners with
SisClr_*/-A, cmake --build, and gold basename discovery (.exe, print0).

* fix(cstring): accept category-only flags; fix CI component runner

Treat --unit-only / --component-only as no-ops on the matching category
scripts; point ci-cell component tests at run_all_component_tests.sh.

* refactor(cstring): drive run_all_examples via cmake --build dialect

Replace MakeCmd with sis_cmake_build; add SisClr_*/-A; discover example*
executables with print0/.exe and optional --verbosity.

* fix(cstring): gate cstring_vector no-arg demo on SIS_EXAMPLE_SMOKE

Fail without input for humans; when SIS_EXAMPLE_SMOKE is set, use an
in-process tmpfile sample. run_all_examples exports the variable for CI.

* refactor(cstring): drive run_all_scratch via cmake --build dialect

Replace MakeCmd with sis_cmake_build; run scratch-only (drop performance);
add SisClr_*/-A; discover test_scratch* / test.scratch.* via print0/.exe.

* refactor(cstring): native CMD runners for unit, component, examples

Add run_all_component_tests.cmd and run_all_examples.cmd; make
run_all_unit_tests.cmd unit-only with ProjectName, benign --unit-only,
and stop on first failing .exe (no Bash).

* feat(cstring): add run_all_automated_tests aggregate (.sh/.cmd)

Add unit-then-component aggregators with mutually exclusive --unit-only /
--component-only; Bash forwards other flags, CMD CALLs native category
runners (no Bash).

* refactor(cstring): drive run_all_performance via cmake --build dialect

Align with scratch helpers: SisClr_*/-A, sis_cmake_build, and
test_performance* / test.performance.* discovery (print0/.exe).

* style(cstring): SisClr polish on run_all_automated_tests.sh

Add SisClr_*/-A (forwarded), coloured status/mutex messages; keep
unit-then-component aggregate behaviour.

* ci(cstring): exercise prepare/build/clean helpers in CI

Split no-cpp into prepare (no -m) then build_cmake.sh; add install-smoke
prepare-clean-build-clean-build on a dedicated SIS_CMAKE_BUILD_DIR tree.

* ci(cstring): dogfood native run_all *.cmd on Windows cells

Invoke examples/unit/component/scratch via cmd.exe on Windows; keep Bash
runners on Unix; add run_all_scratch_tests.cmd; PATH MinGW from msys2.

* ci(cstring): dogfood prepare/build in cells; order test jobs

- Replace raw cmake configure/build with prepare_cmake.sh and
  build_cmake.sh;
- add performance job/.cmd;
- chain unit→component→performance→scratch→examples.

* ci(cstring): invoke ctest, remove, and automated helpers

Run ctest_cmake.sh after each cell build; extend install-smoke through
remove and re-prepare/build; use run_all_automated_tests.sh in no-cpp.

* fix(cstring): harden prepare empty-args and multi-config ctest

Avoid bash 3.2 nounset failure on empty PREPARE_ARGS in ci-cell, and pass
ctest -C from SIS_CMAKE_CONFIG when CMAKE_CONFIGURATION_TYPES is present so
Visual Studio cells can run.

* ci(cstring): dogfood run_all_automated_tests.cmd on Windows

Drive Windows unit and component cell steps through the aggregate .cmd with
--unit-only / --component-only so the orchestrator and its CALL targets are
exercised without duplicating the suite.

* ci(cstring): collapse cell suites into one post-build test job

Replace the serial unit/component/performance/scratch/examples jobs with a
single Tests job of sequential helper steps so each matrix cell pays one
checkout, MinGW setup, and artifact download instead of five.

* docs(cstring): target 4.0.16 release for 23 September 2026

Align CHANGES/NEWS to today, bump Doxyfile PROJECT_NUMBER, and refresh
cstring.h Updated/edit counters; package CSTRING_VER_* already at 4.0.16.

* tidying

* Perf tests (#22)

* feat(cstring): add competitive performance tests for 4.0.17

Add test.performance.cstring and test.performance.cstring_vector with
std::string / vector and hand-rolled baselines; optional p99 percentiles
(and file_lines vs cstring_vector_readLines when linked); --no-p99 /
NO_P99; --gap-groups / SIS_PERFTESTS_GROUPGAPS; CSTRING_EXTERN_C on the
cstring.vector API.

* test(cstring): time ifstream getline in the file-lines suite

Add an `std::ifstream` + `std::getline` row to `file_read_all_lines`, so
`cstring_vector_readLines` has an owning standard-library baseline beside
`platformstl::file_lines`.

* test(cstring): pair borrowed_fixed_assign with std::string

Add the semantic std::string::assign baseline beside the existing
borrowed/fixed path; fix borrowed capacity to n+1.

* fix(cstring): restore legacy-compatible memory calls in performance tests

Define _CRT_SECURE_NO_WARNINGS for MSVC before CRT headers are included;
use global ::memcpy and ::memmove names to preserve early C/C++
compatibility;

* fix(cstring): use SIS target warning suppression mechanism

Register MSVC warning 4996 through X_MSVC_CUSTOM_WARNINGS_TO_BE_SUPPRESSED
for each affected performance target; remove broad and direct warning
suppression from the top-level build;

* fix(cstring): correct vector insertion range handling

Move the full tail when inserting before the vector end; construct inserted
strings and clean up failures at the insertion position; prevent prepend
benchmarks from corrupting vector storage;

* fix

* squash-commit

---------

Co-authored-by: Matt Wilson <matthew@synesis.com.au>

* More component tests (#23)

* test(cstring): rename component readline/writeline cases descriptively

Adopt TEST_<api>_<SCENARIO> names for cstring_readline and
cstring_writeline/cstring_write component cases; drop empty writeline
stubs; refresh Updated banners and prefer char* argv[] in main.

* test(cstring): adopt terse xTests API in component suites

Switch readline/writeline component assertions to TEST_ENUM_EQ,
TEST_INT_EQ, TEST_MS_EQ, TEST_PASSED, and REQUIRE; mark vector APIs
CSTRING_EXTERN_C for C++ linkage; wire
test.component.cstring_vector_readLines into the component CMake tree.

* test(cstring): expand cstring_readline component coverage

Fill empty readline cases for empty file, CRLF/mixed EOL, final EOL,
consecutive empties, long and many short lines, and cstring reuse; add
binary fixture helpers; correct the vector header File: banner.

* test(cstring): add cstring_vector_readLines component suite

Add test.component.cstring_vector_readLines covering empty file, EOL
variants, empty-at-EOF omission, append-onto-existing, long and many short
lines; use the xTests terse API.

* ci

* test(cstring): finish terse xTests API in readline coverage

Convert the remaining verbose XTESTS_* assertions in the expanded
cstring_readline cases to REQUIRE, TEST_ENUM_EQ, TEST_INT_EQ, and
TEST_MS_EQ.

* fix

* Flags fixes (#24)

* tidy

* chore: replacing backwards-compatibility flags uses with the replacements

* fix(flags): correcting (currently unused) flag(s)

* fix(cstring): drop unused bits from the cstring arena mask

Narrow CSTRING_F_ARENA_MASK from 0xff00 to 0x3700, the union of the defined
arena selectors, so unused high bits are not treated as an arena. Retire
the unsupported/unused custom-arena calling-convention macros, clearing the
old stdcall value 0x4000 that sat inside the mask.

* squash-commit

* version

* TODO.md

* fix(cstring): gate Windows arenas on `_WIN32` for 4.1.0

Define the Windows arena flags and compile the WinAPI allocators when the
compiler predefines `_WIN32`, rather than when `WIN32` or `WIN64` is set;
record the 28th September 2026 release in **CHANGES.md**, **NEWS.md**,
**Doxyfile**, and **TODO.md**.

* fix

* fix

* tidy

* version

* refactor(cstring): move Windows arena allocators into win.c (#26)

* refactor(cstring): move Windows arena allocators into win.c

Move the Win32 Global, process-heap, and COM task reallocators out of
**cstring.core.c** into **src/win.c**, declared from **src/internal.h**;
- Windows builds compile **win.c**, which does not re-check
  **CSTRING_USE_WINAPI_**; core still dispatches those arenas;
- **dllmain.c** and **mmap.c** are unchanged.

* clean

* tidy

* ci

* chore(cstring): stamp 4.0.18 Updated banners

Set Updated to 29th September 2026 on the implementation files changed
since 4.0.17 (**src/CMakeLists.txt**, **cstring.core.c**,
**cstring.vector.c**, **internal.h**, **win.c**); **CHANGES.md**,
**NEWS.md**, **Doxyfile**, and `CSTRING_VER` were already at 4.0.18.

---------

Co-authored-by: Matt Wilson <152443343+mwsis@users.noreply.github.com>
…#27)

* general boilerplate / project-support improvements (#16)

* squash-commit

* 4.0.14

* fix

* 4.0.15 (#20)

* Updated all `\param` and `\retval` Doxygen documentation comments in
  `cstring.h`, `cstring.vector.h`, and `cstring.core.c` to obey the 76-rule
  and terminate with a semicolon;
* Bumped version to 4.0.15 in `cstring.h`, `Doxyfile`, `CHANGES.md`, and
  `NEWS.md`;
* Updated `Updated:` header banners to 6th September 2026;

* markdown

* chore(c-cpp): union files.associations from ~/dev vscode settings

Give the 28 in-wave C/C++ projects (and gold **c** / **cxx** / **c_cxx**
templates) a sorted **files.associations** union of all associations
found under **~/dev**;

* .gitattributes

* .vscode/settings.json

* .vimrc

* CHANGES.md

* chore(<lib>): use computed PREFIX_VER with documented PATCH

Align library version macros to c-cpp-standards. Define MAJOR, MINOR,
PATCH, and ALPHABETA; compute PREFIX_VER by shifts; keep REVISION as a
skip-section alias of PATCH (target at column 60); retain named historical
VER_* constants only for comparison and documentation.

* test(<lib>): ship scratch libver version reporter

Add or normalise test/scratch/libver to print the hosting PREFIX_VER as
“Name: vM.m.p.ab (PREFIX_VER = 0x........)” and, when sibling public
headers are included, an “efferent dependencies:” block.

* test(<lib>): rename scratch libver to versions

Move test/scratch/libver to test/scratch/versions and retarget the
executable as versions so C/C++ reporters match the Phase 3 freeze.

* test: add canonical scratch versions reporter

Add a Phase 3 gold version printer under test/scratch/versions, wire
it from the scratch parent list, and use CMake target/argv0 versions;

* .gitattributes

* fix(c-cpp): quote Dir resolution in CMake helper scripts

Use Dir=$(cd "$(dirname "$ScriptPath")" && pwd) so paths with spaces resolve
reliably; apply the same one-line fix across in-wave helper scripts
(prepare/build/clean/ctest/remove and run_all_*).

* chore(scratch test): **versions** => **test.scratch.version**

* doc(README.md): adding afferent dependencies (**errni**, **rstrip**)

* feat(cstring): colour prepare_cmake and unify cmake configure

Add SisClr_* status colour (NO_COLOR, AlwaysUseColours, TTY gate),
--build-shared-libs, and a single cmake invoke with CMakeGeneratorArgs so
every -D is always passed; tidy prologue groups, quoting, and help text.

* feat(cstring): force colours via env and -A in prepare_cmake

Initialise AlwaysUseColours from SIS_CMAKE_ALWAYS_USE_COLOURS /
SIS_ALWAYS_USE_COLOURS; let -A/--always-use-colours override NO_COLOR
(pre-scan args so help and errors are coloured).

* refactor(cstring): drive prepare builds with cmake --build

Drop MSYSTEM→MinGW and MakeCmd; honour SIS_CMAKE_MINGW via
`sis_cmake_is_truey()`; add sis_cmake_build for -m; configure in-place with
-S/-B and || exit 1; tighten --mingw/--msvc-mt/--run-make help.

* refactor(cstring): drive build_cmake via cmake --build

Replace MakeCmd/Makefile gating with sis_cmake_build; require a configured
CMakeCache; add SisClr_* colour and -A to match prepare_cmake.sh.

* refactor(cstring): drive clean_cmake via cmake --build --target clean

Replace MakeCmd/Makefile gating with sis_cmake_build clean; require a
configured CMakeCache; add SisClr_* colour and -A to match build_cmake.sh.

* refactor(cstring): align remove_cmake_artefacts with helper dialect

Add SisClr_* colour and -A; quote inventory loops; recognise Windows_NT;
remove artefacts without cd into the build directory.

* refactor(cstring): drive ctest_cmake via cmake --build then ctest

Replace MakeCmd with sis_cmake_build; require CMakeCache; fail -M when
unconfigured; add --output-on-failure, SisClr_* colour, and -A.

* refactor(cstring): unit/component runners use sis_cmake_build dialect

Make run_all_unit_tests.sh unit-only; align both category runners with
SisClr_*/-A, cmake --build, and gold basename discovery (.exe, print0).

* fix(cstring): accept category-only flags; fix CI component runner

Treat --unit-only / --component-only as no-ops on the matching category
scripts; point ci-cell component tests at run_all_component_tests.sh.

* refactor(cstring): drive run_all_examples via cmake --build dialect

Replace MakeCmd with sis_cmake_build; add SisClr_*/-A; discover example*
executables with print0/.exe and optional --verbosity.

* fix(cstring): gate cstring_vector no-arg demo on SIS_EXAMPLE_SMOKE

Fail without input for humans; when SIS_EXAMPLE_SMOKE is set, use an
in-process tmpfile sample. run_all_examples exports the variable for CI.

* refactor(cstring): drive run_all_scratch via cmake --build dialect

Replace MakeCmd with sis_cmake_build; run scratch-only (drop performance);
add SisClr_*/-A; discover test_scratch* / test.scratch.* via print0/.exe.

* refactor(cstring): native CMD runners for unit, component, examples

Add run_all_component_tests.cmd and run_all_examples.cmd; make
run_all_unit_tests.cmd unit-only with ProjectName, benign --unit-only,
and stop on first failing .exe (no Bash).

* feat(cstring): add run_all_automated_tests aggregate (.sh/.cmd)

Add unit-then-component aggregators with mutually exclusive --unit-only /
--component-only; Bash forwards other flags, CMD CALLs native category
runners (no Bash).

* refactor(cstring): drive run_all_performance via cmake --build dialect

Align with scratch helpers: SisClr_*/-A, sis_cmake_build, and
test_performance* / test.performance.* discovery (print0/.exe).

* style(cstring): SisClr polish on run_all_automated_tests.sh

Add SisClr_*/-A (forwarded), coloured status/mutex messages; keep
unit-then-component aggregate behaviour.

* ci(cstring): exercise prepare/build/clean helpers in CI

Split no-cpp into prepare (no -m) then build_cmake.sh; add install-smoke
prepare-clean-build-clean-build on a dedicated SIS_CMAKE_BUILD_DIR tree.

* ci(cstring): dogfood native run_all *.cmd on Windows cells

Invoke examples/unit/component/scratch via cmd.exe on Windows; keep Bash
runners on Unix; add run_all_scratch_tests.cmd; PATH MinGW from msys2.

* ci(cstring): dogfood prepare/build in cells; order test jobs

- Replace raw cmake configure/build with prepare_cmake.sh and
  build_cmake.sh;
- add performance job/.cmd;
- chain unit→component→performance→scratch→examples.

* ci(cstring): invoke ctest, remove, and automated helpers

Run ctest_cmake.sh after each cell build; extend install-smoke through
remove and re-prepare/build; use run_all_automated_tests.sh in no-cpp.

* fix(cstring): harden prepare empty-args and multi-config ctest

Avoid bash 3.2 nounset failure on empty PREPARE_ARGS in ci-cell, and pass
ctest -C from SIS_CMAKE_CONFIG when CMAKE_CONFIGURATION_TYPES is present so
Visual Studio cells can run.

* ci(cstring): dogfood run_all_automated_tests.cmd on Windows

Drive Windows unit and component cell steps through the aggregate .cmd with
--unit-only / --component-only so the orchestrator and its CALL targets are
exercised without duplicating the suite.

* ci(cstring): collapse cell suites into one post-build test job

Replace the serial unit/component/performance/scratch/examples jobs with a
single Tests job of sequential helper steps so each matrix cell pays one
checkout, MinGW setup, and artifact download instead of five.

* docs(cstring): target 4.0.16 release for 23 September 2026

Align CHANGES/NEWS to today, bump Doxyfile PROJECT_NUMBER, and refresh
cstring.h Updated/edit counters; package CSTRING_VER_* already at 4.0.16.

* tidying

* Perf tests (#22)

* feat(cstring): add competitive performance tests for 4.0.17

Add test.performance.cstring and test.performance.cstring_vector with
std::string / vector and hand-rolled baselines; optional p99 percentiles
(and file_lines vs cstring_vector_readLines when linked); --no-p99 /
NO_P99; --gap-groups / SIS_PERFTESTS_GROUPGAPS; CSTRING_EXTERN_C on the
cstring.vector API.

* test(cstring): time ifstream getline in the file-lines suite

Add an `std::ifstream` + `std::getline` row to `file_read_all_lines`, so
`cstring_vector_readLines` has an owning standard-library baseline beside
`platformstl::file_lines`.

* test(cstring): pair borrowed_fixed_assign with std::string

Add the semantic std::string::assign baseline beside the existing
borrowed/fixed path; fix borrowed capacity to n+1.

* fix(cstring): restore legacy-compatible memory calls in performance tests

Define _CRT_SECURE_NO_WARNINGS for MSVC before CRT headers are included;
use global ::memcpy and ::memmove names to preserve early C/C++
compatibility;

* fix(cstring): use SIS target warning suppression mechanism

Register MSVC warning 4996 through X_MSVC_CUSTOM_WARNINGS_TO_BE_SUPPRESSED
for each affected performance target; remove broad and direct warning
suppression from the top-level build;

* fix(cstring): correct vector insertion range handling

Move the full tail when inserting before the vector end; construct inserted
strings and clean up failures at the insertion position; prevent prepend
benchmarks from corrupting vector storage;

* fix

* squash-commit

---------

Co-authored-by: Matt Wilson <matthew@synesis.com.au>

* More component tests (#23)

* test(cstring): rename component readline/writeline cases descriptively

Adopt TEST_<api>_<SCENARIO> names for cstring_readline and
cstring_writeline/cstring_write component cases; drop empty writeline
stubs; refresh Updated banners and prefer char* argv[] in main.

* test(cstring): adopt terse xTests API in component suites

Switch readline/writeline component assertions to TEST_ENUM_EQ,
TEST_INT_EQ, TEST_MS_EQ, TEST_PASSED, and REQUIRE; mark vector APIs
CSTRING_EXTERN_C for C++ linkage; wire
test.component.cstring_vector_readLines into the component CMake tree.

* test(cstring): expand cstring_readline component coverage

Fill empty readline cases for empty file, CRLF/mixed EOL, final EOL,
consecutive empties, long and many short lines, and cstring reuse; add
binary fixture helpers; correct the vector header File: banner.

* test(cstring): add cstring_vector_readLines component suite

Add test.component.cstring_vector_readLines covering empty file, EOL
variants, empty-at-EOF omission, append-onto-existing, long and many short
lines; use the xTests terse API.

* ci

* test(cstring): finish terse xTests API in readline coverage

Convert the remaining verbose XTESTS_* assertions in the expanded
cstring_readline cases to REQUIRE, TEST_ENUM_EQ, TEST_INT_EQ, and
TEST_MS_EQ.

* fix

* Flags fixes (#24)

* tidy

* chore: replacing backwards-compatibility flags uses with the replacements

* fix(flags): correcting (currently unused) flag(s)

* fix(cstring): drop unused bits from the cstring arena mask

Narrow CSTRING_F_ARENA_MASK from 0xff00 to 0x3700, the union of the defined
arena selectors, so unused high bits are not treated as an arena. Retire
the unsupported/unused custom-arena calling-convention macros, clearing the
old stdcall value 0x4000 that sat inside the mask.

* squash-commit

* version

* TODO.md

* fix(cstring): gate Windows arenas on `_WIN32` for 4.1.0

Define the Windows arena flags and compile the WinAPI allocators when the
compiler predefines `_WIN32`, rather than when `WIN32` or `WIN64` is set;
record the 28th September 2026 release in **CHANGES.md**, **NEWS.md**,
**Doxyfile**, and **TODO.md**.

* fix

* refactor(cstring): move Windows arena allocators into win.c

Move the Win32 Global, process-heap, and COM task reallocators out of
**cstring.core.c** into **src/win.c**, declared from **src/internal.h**;
- Windows builds compile **win.c**, which does not re-check
  **CSTRING_USE_WINAPI_**; core still dispatches those arenas;
- **dllmain.c** and **mmap.c** are unchanged.

* clean

* test(cstring): time Windows global, process-heap, and COM task arenas

Time the three Win32 arenas beside the realloc baseline:
- `cstring_win_global` uses `CSTRING_F_USE_WINDOWS_GLOBAL_MEMORY`;
- `cstring_win_processheap` uses
  `CSTRING_F_USE_WINDOWS_PROCESSHEAP_MEMORY`;
- `cstring_win_comtask` uses `CSTRING_F_USE_WINDOWS_COM_TASK_MEMORY`;

* refactor(cstring): static-link COM task arena via ole32

Replace LoadLibrary/GetProcAddress of CoTaskMemRealloc with direct
CoTaskMemAlloc/Free/Realloc calls in win32_comtask_realloc(); link
**ole32** from the Windows core target.

---------

Co-authored-by: Matt Wilson <152443343+mwsis@users.noreply.github.com>
@mwsis mwsis self-assigned this Sep 29, 2026
Replace per-iteration std::vector arenas with stlsoft::auto_buffer (512
stack elements) so sizes ≤256 avoid a heap alloc in the timed path; rename
scenario_borrowed_fixed to scenario_borrowed_fixed_assign to match the
measured operation.
GCC 15 with -Werror flags an inlined stlsoft::auto_buffer destructor as
freeing its internal buffer. Suppress -Wfree-nonheap-object on
test.performance.cstring; the destructor deallocates external storage
only.
test_unit_cstring_1 calls CoTaskMem* and CoGetMalloc. Hold a
comstl::com_init for the process, and skip arena size probes when an empty
string has a NULL pointer.
* misc

* chore(internal): removed `CSTRING_USE_WINAPI_` and now discriminate on `_WIN32`

* chore(internal): simplified includes

* refactor(cstring): centralise CSTRING_ASSERT in internal.h

Define CSTRING_ASSERT once in src/internal.h, with <assert.h>, and drop the
copies in cstring.core.c and cstring.vector.c. Vector call sites use that
macro in place of CSTRING_VECTOR_ASSERT. dllmain.c includes internal.h.

* fix
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants