From 0138793ae6e49f70ab64d883810a5e05953a74ff Mon Sep 17 00:00:00 2001 From: Thenula Weerasinghe <167681802+programmer-1101@users.noreply.github.com> Date: Sat, 25 Apr 2026 15:20:17 +1000 Subject: [PATCH 1/4] Update VA_COPY macro to use va_copy function va_list isn't guarenteed to be a simple assignable type. In the case it's not #define VA_COPY(dest, src) (dest) = (src) produces undefined behaviour --- .cirrus.yml | 2 +- .github/workflows/ci.yml | 2 +- c89stringutils/c89stringutils_string_extras.c | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index c3799ca..79c600f 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,5 +1,5 @@ freebsd_instance: - image_family: freebsd-13-0 + image_family: freebsd-14 task: install_script: pkg install -y cmake diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d33f9ec..84e398a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,7 @@ jobs: EOF - name: Compile Test Amalgamation - run: gcc -Wall -Wextra -Werror -o test_amalg test_amalg.c + run: gcc -std=c89 -Wpedantic -Wall -Wextra -Werror -o test_amalg test_amalg.c - name: Run Test Amalgamation run: ./test_amalg diff --git a/c89stringutils/c89stringutils_string_extras.c b/c89stringutils/c89stringutils_string_extras.c index b24edda..1a5209e 100644 --- a/c89stringutils/c89stringutils_string_extras.c +++ b/c89stringutils/c89stringutils_string_extras.c @@ -103,8 +103,11 @@ char *strnstr(const char *buffer, const char *target, size_t bufferLength) { character of the first occurrence of little is returned. [this doc (c) FreeBSD <3 clause BSD license> from their manpage] */ - const size_t targetLength = strlen(target); + size_t targetLength; const char *start; + + /* Fix assignment of targetLength. C89 requires variables to be defined at beginning of a scope */ + targetLength = strlen(target); if (targetLength == 0) return (char *)buffer; for (start = buffer; *start && start + targetLength <= buffer + bufferLength; @@ -125,7 +128,8 @@ char *strnstr(const char *buffer, const char *target, size_t bufferLength) { /* `strcasestr` from MUSL */ char *strcasestr(const char *h, const char *n) { - const size_t l = strlen(n); + size_t l; + l = strlen(n); for (; *h; h++) if (!strncasecmp(h, n, l)) return (char *)h; @@ -192,7 +196,7 @@ size_t strerrorlen_s(errno_t errnum) { #ifdef HAVE___VA_COPY #define VA_COPY(dest, src) __va_copy(dest, src) #else -#define VA_COPY(dest, src) (dest) = (src) +#define VA_COPY(dest, src) memcpy(&(dest), &(src), sizeof(va_list)) #endif #endif #endif /* ! VA_COPY */ From f6db732cccdb5b24803bce72e161aeff4fe2078c Mon Sep 17 00:00:00 2001 From: Thenula Weerasinghe Date: Sat, 25 Apr 2026 17:45:01 +1000 Subject: [PATCH 2/4] Use long instead of C99 long long --- c89stringutils/c89stringutils_string_extras.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/c89stringutils/c89stringutils_string_extras.h b/c89stringutils/c89stringutils_string_extras.h index d4b4e15..389dfc0 100644 --- a/c89stringutils/c89stringutils_string_extras.h +++ b/c89stringutils/c89stringutils_string_extras.h @@ -19,7 +19,8 @@ extern "C" { #if defined(_MSC_VER) #define NUM_FORMAT "%I64d" #else -#define NUM_FORMAT "%lld" +/* Fix:- Change from C99 long long to long */ +#define NUM_FORMAT "%ld" #endif #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ From f9f979fba6b2ea799fc534b0783302ffdfb5c8bf Mon Sep 17 00:00:00 2001 From: Thenula Weerasinghe Date: Sun, 26 Apr 2026 11:08:48 +1000 Subject: [PATCH 3/4] Defining macros using cmake needed for modified va_copy --- CMakeLists.txt | 23 +++ c89stringutils/CMakeLists.txt | 2 + c89stringutils/c89stringutils_string_extras.c | 20 +-- cmake/BundleIcon.icns | Bin 33452 -> 0 bytes cmake/CTestConfig.cmake | 7 - cmake/Config.cmake.in | 4 +- cmake/CustomVolumeIcon.icns | Bin 37827 -> 0 bytes cmake/Info.plist | 14 -- cmake/LICENSE.txt | 8 +- cmake/MultiCPackConfig.cmake | 6 - cmake/README.txt | 158 +++++++++++++++++- cmake/Welcome.txt | 3 - cmake/config.h.in | 11 +- 13 files changed, 202 insertions(+), 54 deletions(-) delete mode 100644 cmake/BundleIcon.icns delete mode 100644 cmake/CTestConfig.cmake delete mode 100644 cmake/CustomVolumeIcon.icns delete mode 100644 cmake/Info.plist delete mode 100644 cmake/MultiCPackConfig.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 07bcffa..5cde290 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,34 @@ cmake_minimum_required(VERSION 3.11) project(c89stringutils VERSION 0.0.2 LANGUAGES C) +include(CheckCSourceCompiles) + +check_c_source_compiles("#include + void t(int i, ...) { va_list a, b; va_start(a,i); va_copy(b,a); va_end(b); va_end(a); } + int main() { return 0; }" HAVE_VA_COPY) + +check_c_source_compiles("#include + void t(int i, ...) { va_list a, b; va_start(a,i); __va_copy(b,a); va_end(b); va_end(a); } + int main() { return 0; }" HAVE___VA_COPY) + +check_c_source_compiles("#include + void t(int i, ...) { va_list a, b; va_start(a,i); b = a; va_end(a); } + int main() { return 0; }" HAVE_VA_LIST_ASSIGNMENT) + set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) set(CMAKE_C_STANDARD 90) add_library("${PROJECT_NAME}_compiler_flags" INTERFACE) + +if(HAVE_VA_COPY) + target_compile_definitions("${PROJECT_NAME}_compiler_flags" INTERFACE HAVE_VA_COPY) +elseif(HAVE___VA_COPY) + target_compile_definitions("${PROJECT_NAME}_compiler_flags" INTERFACE HAVE___VA_COPY) +elseif(HAVE_VA_LIST_ASSIGNMENT) + target_compile_definitions("${PROJECT_NAME}_compiler_flags" INTERFACE HAVE_VA_LIST_ASSIGNMENT) +endif() + if (NOT DEFINED MSVC_VERSION OR MSVC_VERSION STRGREATER "1900" # 2015 OR NOT (CMAKE_C_COMPILER_ID STREQUAL "OpenWatcom")) diff --git a/c89stringutils/CMakeLists.txt b/c89stringutils/CMakeLists.txt index 8e0bcac..e4647e9 100644 --- a/c89stringutils/CMakeLists.txt +++ b/c89stringutils/CMakeLists.txt @@ -8,6 +8,8 @@ source_group("Source Files" FILES "${Source_Files}") add_library("${LIBRARY_NAME}" "${Header_Files}" "${Source_Files}") +target_link_libraries("${LIBRARY_NAME}" PUBLIC "${PROJECT_NAME}_compiler_flags") + include(GNUInstallDirs) target_include_directories( "${LIBRARY_NAME}" diff --git a/c89stringutils/c89stringutils_string_extras.c b/c89stringutils/c89stringutils_string_extras.c index 1a5209e..2ea34be 100644 --- a/c89stringutils/c89stringutils_string_extras.c +++ b/c89stringutils/c89stringutils_string_extras.c @@ -190,16 +190,16 @@ size_t strerrorlen_s(errno_t errnum) { #define HAVE_ASPRINTF #ifndef VA_COPY -#if defined(HAVE_VA_COPY) || defined(va_copy) -#define VA_COPY(dest, src) va_copy(dest, src) -#else -#ifdef HAVE___VA_COPY -#define VA_COPY(dest, src) __va_copy(dest, src) -#else -#define VA_COPY(dest, src) memcpy(&(dest), &(src), sizeof(va_list)) -#endif -#endif -#endif /* ! VA_COPY */ +# if defined(HAVE_VA_COPY) +# define VA_COPY(dest, src) va_copy(dest, src) +# elif defined(HAVE___VA_COPY) +# define VA_COPY(dest, src) __va_copy(dest, src) +# elif defined(HAVE_VA_LIST_ASSIGNMENT) +# define VA_COPY(dest, src) ((dest) = (src)) +# else +# define VA_COPY(dest, src) memcpy(&(dest), &(src), sizeof(va_list)) +# endif +#endif /* !VA_COPY */ #define INIT_SZ 128 diff --git a/cmake/BundleIcon.icns b/cmake/BundleIcon.icns deleted file mode 100644 index 8808dd62db64540292417e8865bdf627aaf8792e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33452 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 diff --git a/cmake/CTestConfig.cmake b/cmake/CTestConfig.cmake deleted file mode 100644 index 6f998bb..0000000 --- a/cmake/CTestConfig.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set(CTEST_PROJECT_NAME "c89stringutils") -set(CTEST_NIGHTLY_START_TIME "00:00:00 EST") - -set(CTEST_DROP_METHOD "http") -set(CTEST_DROP_SITE "my.cdash.org") -set(CTEST_DROP_LOCATION "/submit.php?project=c89stringutils") -set(CTEST_DROP_SITE_CDASH TRUE) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index 1de8b34..833cd3d 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -1,4 +1,2 @@ - @PACKAGE_INIT@ - -include ( "${CMAKE_CURRENT_LIST_DIR}/c89stringutilsTargets.cmake" ) +include("${CMAKE_CURRENT_LIST_DIR}/c89stringutilsTargets.cmake") diff --git a/cmake/CustomVolumeIcon.icns b/cmake/CustomVolumeIcon.icns deleted file mode 100644 index 3862a51917954ff9c92cfe8e7469c4b12525796b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37827 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 diff --git a/cmake/Info.plist b/cmake/Info.plist deleted file mode 100644 index e5a7d00..0000000 --- a/cmake/Info.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - CFBundleExecutable - BundleGeneratorTest - CFBundleIconFile - BundleGeneratorTest.icns - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - - diff --git a/cmake/LICENSE.txt b/cmake/LICENSE.txt index cf0b324..51eb6b3 100644 --- a/cmake/LICENSE.txt +++ b/cmake/LICENSE.txt @@ -1 +1,7 @@ -(Apache-2.0 OR MIT) +Copyright 2020-2022 Samuel Marks (for Offscale.io) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cmake/MultiCPackConfig.cmake b/cmake/MultiCPackConfig.cmake deleted file mode 100644 index cce6d1e..0000000 --- a/cmake/MultiCPackConfig.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include("release/CPackConfig.cmake") - -set(CPACK_INSTALL_CMAKE_PROJECTS - "debug;c89stringutils;ALL;/" - "release;c89stringutils;ALL;/" -) diff --git a/cmake/README.txt b/cmake/README.txt index e2129d9..5ff33d9 100644 --- a/cmake/README.txt +++ b/cmake/README.txt @@ -1 +1,157 @@ -string functions from newer standards / common non-standards for C89. +c89stringutils +============== +[![License](https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![CI for Linux, Windows, macOS](https://github.com/offscale/c89stringutils/actions/workflows/ci.yml/badge.svg)](https://github.com/offscale/c89stringutils/actions/workflows/ci.yml) +[![CI for FreeBSD](https://api.cirrus-ci.com/github/offscale/c89stringutils.svg)](https://cirrus-ci.com/github/offscale/c89stringutils) +![coverage](reports/test_coverage.svg) +[![C89](https://img.shields.io/badge/C-89-blue)](https://en.wikipedia.org/wiki/C89_(C_version)) + +C89 is missing some nice things. As is MSVC. +This adds the string related functionality for: + +- **Windows** + - MSVC 2005 through MSVC 2026+ + - MinGW + - Cygwin + - Open Watcom 2.0 (including **DOS** target) +- **SunOS** +- **Linux** +- ***BSD** +- **macOS** + +Everything is hidden behind `ifdef`s so if the compiler/OS supports the function, that function will be used instead of +the one provided by this library. + +### Architecture & Standards + +- **Strict C89 Compliance:** The entire codebase strictly conforms to ISO C90 (C89), preventing compilation issues on extremely old enterprise toolchains. +- **Header Guards & C++ Interop:** Fully instrumented with `extern "C"` blocks and robust guards, playing nicely when directly `#include`d into C++ sources. +- **Windows Security:** Eradicates the inclusion of heavy platform headers like ``, and actively defaults to MSVC "Safe CRT" variants (e.g., `vsprintf_s`, `_vscprintf`) implicitly when building on Microsoft compilers. +- **Quality Metrics:** Maintains 100% Doxygen documentation and 100% test coverage locally. + +### Single-File Header-Only Amalgamation (STB-style) + +If you don't want to link against a built `static` or `shared` library, you can generate a drop-in, STB-style single-header amalgamation! + +When building the project via CMake, toggle `C89STRINGUTILS_BUILD_AMALGAMATION=ON`: +```sh +cmake -B build -DC89STRINGUTILS_BUILD_AMALGAMATION=ON +``` +This generates `build/c89stringutils/c89stringutils_amalgamation.h`. + +**To use the amalgamation in your project:** +Drop it into your source tree and define `C89STRINGUTILS_IMPLEMENTATION` in **exactly one** `.c` or `.cpp` file before including the header: + +```c +#define C89STRINGUTILS_IMPLEMENTATION +#include "c89stringutils_amalgamation.h" + +int main(void) { + char* str = NULL; + asprintf(&str, "Hello %s", "World"); + free(str); + return 0; +} +``` + +### String functions implemented + +| Function | Citation | +|-------------------------------------------------------------------------|------------------------------| +| [`strcasestr`](https://www.freebsd.org/cgi/man.cgi?query=strcasestr) | From MUSL | +| [`strncasecmp`](https://www.freebsd.org/cgi/man.cgi?query=strncasecmp) | Alias for MSVC's `_strnicmp` | +| [`strcasecmp`](https://www.freebsd.org/cgi/man.cgi?query=strcasecmp) | Alias for MSVC's `_stricmp` | +| [`snprintf`](https://www.freebsd.org/cgi/man.cgi?query=snprintf) | Mostly from WTF_StringExtras | +| [`vsnprintf`](https://www.freebsd.org/cgi/man.cgi?query=vsnprintf) | Mostly from WTF_StringExtras | +| [`strnstr`](https://www.freebsd.org/cgi/man.cgi?query=strnstr) | Mostly from WTF_StringExtras | +| [`strerrorlen_s`](https://en.cppreference.com/w/c/string/byte/strerror) | From Safe C Library | +| [`asprintf`](https://www.freebsd.org/cgi/man.cgi?query=asprintf) | From libressl-portable | + +Additionally `jasprintf`, a version of `asprintf` that concatenates on successive calls. + +### Dependencies + +- [CMake](https://cmake.org) (3.11 for MSVC 2005 or newer versions for other targets) +- C compiler (any that work with CMake, and were released within the last 30 years) + +### Configure, build, and test + +```sh +cmake -S . -B build -DBUILD_TESTING=ON +cmake --build build +ctest --test-dir build -C Debug +``` + +**Advanced CMake Toggles:** +The build environment seamlessly supports several CDD-style switches out of the box: +* `CDD_CHARSET`: `Unicode` or `ANSI` (Sets `UNICODE` and `_UNICODE` defines). +* `CDD_THREADING`: `ON` or `OFF`. +* `CDD_LTO`: `ON` or `OFF` (Validates and sets `CMAKE_INTERPROCEDURAL_OPTIMIZATION`). +* `CDD_MSVC_RTC`: `RTC1`, `RTCu`, or `RTCs` (Automatically injects `/RTCx` flags on MSVC). + +### Script to automatically build + +Build, test, and package for: + +- Cygwin; +- MinGW (32-bit and 64-bit); +- MSVC 2005 (32-bit and 64-bit); +- MSVC 2022 / 2026 (32-bit and 64-bit); +- OpenWatcom's DOS target (16-bit). + +…by running in Command Prompt: https://github.com/offscale/win-cmake-multi-build + +(also handles upload to GitHub Releases) + +#### Instructions for MSVC 2005 + +With cmake-3.11.4 specified, do: + +```sh +mkdir build_msvc2005 && cd build_msvc2005 +cmake-3.11.4-win64-x64\bin\cmake -DCMAKE_WARN_VS8=OFF -DCMAKE_BUILD_TYPE="Debug" -G "Visual Studio 8 2005" .. +cmake-3.11.4-win64-x64\bin\cmake --build . +cmake-3.11.4-win64-x64\bin\ctest -C Debug +``` + +(the last two commands can be run by opening the solution in Visual Studio 2005) + +Alternatively with newer versions of CMake (tested 3.26.3): + +```sh +mkdir build_msvc_nmake2005 && cd build_msvc_nmake2005 +cmake -DCMAKE_BUILD_TYPE="Debug" -G "NMake Makefiles" .. +cmake --build . +ctest -C Debug +``` + +#### Instructions for Open Watcom (DOS target) + +With v2 from https://github.com/open-watcom/open-watcom-v2/releases installed: + +```sh +[path]\WATCOM\owsetenv.bat +mkdir build_dos && cd build_dos +cmake -G "Watcom WMake" -D CMAKE_SYSTEM_NAME "DOS" -D CMAKE_SYSTEM_PROCESSOR "I86" .. +cmake --build . +ctest -C Debug +``` + +(that test phase might fail if you're running this on a non-DOS host) + +--- + +## License + +Licensed under either of + +- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or ) +- MIT license ([LICENSE-MIT](LICENSE-MIT) or ) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. diff --git a/cmake/Welcome.txt b/cmake/Welcome.txt index 19cc645..e69de29 100644 --- a/cmake/Welcome.txt +++ b/cmake/Welcome.txt @@ -1,3 +0,0 @@ -string functions from newer standards / common non-standards for C89 - -https://github.com/offscale/c89stringutils diff --git a/cmake/config.h.in b/cmake/config.h.in index 2f3b555..f64246f 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -1,9 +1,2 @@ -#ifndef C89STRINGUTILS_CONFIG_H -#define C89STRINGUTILS_CONFIG_H - -#define C89STRINGUTILS_VERSION_MAJOR @c89stringutils_VERSION_MAJOR@ -#define C89STRINGUTILS_VERSION_MINOR @c89stringutils_VERSION_MINOR@ -#define C89STRINGUTILS_VERSION_PATCH @c89stringutils_VERSION_PATCH@ -#define C89STRINGUTILS_VERSION "@c89stringutils_VERSION@" - -#endif /* C89STRINGUTILS_CONFIG_H */ +#define c89stringutils_VERSION_MAJOR @c89stringutils_VERSION_MAJOR@ +#define c89stringutils_VERSION_MINOR @c89stringutils_VERSION_MINOR@ From 6f51ce5552e4d0d8ab4770d4a2469b2e8e312656 Mon Sep 17 00:00:00 2001 From: Thenula Weerasinghe Date: Sun, 26 Apr 2026 11:47:54 +1000 Subject: [PATCH 4/4] Use HAVE_LONG_LONG to select correct printf format specifier for portability Choose between %lld and %ld based on compiler support for long long. --- .cirrus.yml | 2 +- CMakeLists.txt | 11 +++++++++++ c89stringutils/c89stringutils_string_extras.c | 7 ++----- c89stringutils/c89stringutils_string_extras.h | 5 ++++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 79c600f..cf7fc17 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,5 +1,5 @@ freebsd_instance: - image_family: freebsd-14 + image_family: freebsd-15 task: install_script: pkg install -y cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cde290..62c2476 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,13 @@ check_c_source_compiles("#include void t(int i, ...) { va_list a, b; va_start(a,i); b = a; va_end(a); } int main() { return 0; }" HAVE_VA_LIST_ASSIGNMENT) +check_c_source_compiles(" +int main(void) { + long long x = 0; + return (int)x; +} +" HAVE_LONG_LONG) + set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) set(CMAKE_C_STANDARD 90) @@ -29,6 +36,10 @@ elseif(HAVE_VA_LIST_ASSIGNMENT) target_compile_definitions("${PROJECT_NAME}_compiler_flags" INTERFACE HAVE_VA_LIST_ASSIGNMENT) endif() +if(HAVE_LONG_LONG) + target_compile_definitions("${PROJECT_NAME}_compiler_flags" INTERFACE HAVE_LONG_LONG) +endif() + if (NOT DEFINED MSVC_VERSION OR MSVC_VERSION STRGREATER "1900" # 2015 OR NOT (CMAKE_C_COMPILER_ID STREQUAL "OpenWatcom")) diff --git a/c89stringutils/c89stringutils_string_extras.c b/c89stringutils/c89stringutils_string_extras.c index 2ea34be..7d70e7f 100644 --- a/c89stringutils/c89stringutils_string_extras.c +++ b/c89stringutils/c89stringutils_string_extras.c @@ -103,11 +103,9 @@ char *strnstr(const char *buffer, const char *target, size_t bufferLength) { character of the first occurrence of little is returned. [this doc (c) FreeBSD <3 clause BSD license> from their manpage] */ - size_t targetLength; + const size_t targetLength = strlen(target); const char *start; - /* Fix assignment of targetLength. C89 requires variables to be defined at beginning of a scope */ - targetLength = strlen(target); if (targetLength == 0) return (char *)buffer; for (start = buffer; *start && start + targetLength <= buffer + bufferLength; @@ -128,8 +126,7 @@ char *strnstr(const char *buffer, const char *target, size_t bufferLength) { /* `strcasestr` from MUSL */ char *strcasestr(const char *h, const char *n) { - size_t l; - l = strlen(n); + const size_t l = strlen(n); for (; *h; h++) if (!strncasecmp(h, n, l)) return (char *)h; diff --git a/c89stringutils/c89stringutils_string_extras.h b/c89stringutils/c89stringutils_string_extras.h index 389dfc0..89795bd 100644 --- a/c89stringutils/c89stringutils_string_extras.h +++ b/c89stringutils/c89stringutils_string_extras.h @@ -19,9 +19,12 @@ extern "C" { #if defined(_MSC_VER) #define NUM_FORMAT "%I64d" #else -/* Fix:- Change from C99 long long to long */ +#if defined(HAVE_LONG_LONG) +#define NUM_FORMAT "%lld" +#else #define NUM_FORMAT "%ld" #endif +#endif #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ defined(__bsdi__) || defined(__DragonFly__) || defined(BSD)