aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbonmas14 <bonmas14@gmail.com>2025-09-28 23:31:34 +0300
committerbonmas14 <bonmas14@gmail.com>2025-09-28 23:31:34 +0300
commitc25b7709ef5c2bd9cae7047704c3a67b9160819a (patch)
tree5bdc4faa030633b3c500020542df4c49bbea1d40
parent62c7327c47407f4f92723e3613742c05c4de5ba9 (diff)
downloadungrateful-c25b7709ef5c2bd9cae7047704c3a67b9160819a.tar.gz
ungrateful-c25b7709ef5c2bd9cae7047704c3a67b9160819a.zip
Multithreaded build on winbows, and bugfixes
-rw-r--r--.gitignore1
-rw-r--r--build.bat79
-rw-r--r--src/un_strings.c4
3 files changed, 49 insertions, 35 deletions
diff --git a/.gitignore b/.gitignore
index 6b5f4d5..ab53a05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ bin/
obj/
lib/
include/
+log/
diff --git a/build.bat b/build.bat
index 922fd07..60f096f 100644
--- a/build.bat
+++ b/build.bat
@@ -1,29 +1,5 @@
@echo off
-:: /GS - is sequrity check for buffer overruns.
-:: /Oi - generate intrinsic functions (aka inline intrinsic).
-:: /O1 /O2 - minimize size, minimize speed.
-:: /Ox - subset of /O2, doesnt include.
-
-:: /GL - whole program optimizations.
-:: /LTCG - link time codegen. it is linker option.
-:: /cgthreads1 8 - how much thread cl.exe can use.
-
-:: /F {0} - sets stack size.
-
-:: outputs
-:: /Fa{path} - asm file path.
-:: /Fd{path} - pdb file path.
-:: /Fe{path} - exe file path.
-:: /Fo{path} - obj file path.
-
-:: /MT - defines _MT. uses LIBCMT.lib to resolve runtime symbols.
-:: /MTd - defines _MT _DEBUG, uses LIBCMT.lib.
-:: /MD - defines _MT _DLL. uses MSVCRT.lib.
-:: /MDd - defines _MT _DLL _DEBUG. uses MSVCRT.lib.
-:: /LD - implies /MT unless specified /MD.
-:: /LDd - ...
-
setlocal
setlocal enabledelayedexpansion
@@ -35,32 +11,54 @@ set "src_dir=src\"
set "obj_dir=obj\"
set "inc_dir=include\"
set "lib_dir=lib\"
+set "log_dir=log\"
set "warn=/wd4244 /wd5105 /wd4127"
set "cdefines=/D _CRT_SECURE_NO_WARNINGS /D _WINSOCK_DEPRECATED_NO_WARNINGS /D _UNICODE /D UNICODE"
set "cflags=/nologo /std:c11 /utf-8 /W4 /WX- /diagnostics:column /TC /Zi /fp:fast"
+set "link_conf=/INCREMENTAL:NO"
+
::
:: ------------
::
+if "%1"=="Release" ( goto release )
+if "%1"=="release" ( goto release )
+if "%1"=="rel" ( goto release )
+
+if "%1"=="Sanitize" ( goto sanitize )
+if "%1"=="asan" ( goto sanitize )
+if "%1"=="san" ( goto sanitize )
+
+goto debug
+
+:sanitize
+set "flag=/D DEBUG /MTd /fsanitize=address /Od /Gs /MP"
+goto build
+
+:release
+set "flag=/D NDEBUG /MT /Ox /GS- /MP /cgthreads8 /GL"
+goto build
+
+:debug
set "flag=/D DEBUG /MTd /Od /GS /MP"
-set "_flag=/D NDEBUG /MT /Ox /GS- /MP /cgthreads8 /GL"
+goto build
-::
-:: ------------
-::
+:build
if exist %bin_dir% ( rmdir /s /q %bin_dir% )
if exist %obj_dir% ( rmdir /s /q %obj_dir% )
if exist %inc_dir% ( rmdir /s /q %inc_dir% )
if exist %lib_dir% ( rmdir /s /q %lib_dir% )
+if exist %log_dir% ( rmdir /s /q %log_dir% )
if not exist %bin_dir% ( mkdir %bin_dir% )
if not exist %obj_dir% ( mkdir %obj_dir% )
if not exist %inc_dir% ( mkdir %inc_dir% )
if not exist %lib_dir% ( mkdir %lib_dir% )
+if not exist %log_dir% ( mkdir %log_dir% )
%cc% %cflags% %warn% %flag% /c %src_dir%ungrateful.c /Fo%obj_dir%ungrateful.obj /Fd%obj_dir%ungrateful.pdb %cdefines%
%cc% %cflags% %warn% %flag% /I %src_dir% /c %src_dir%cynic.c /Fo%obj_dir%cynic.obj /Fd%obj_dir%cynic.pdb %cdefines%
@@ -76,19 +74,32 @@ for %%f in ("%src_dir%*.h") do (
echo:
-set "link_param=/link %lib_dir%ungrateful.lib"
+set "link_param=/link %link_conf% %lib_dir%ungrateful.lib"
for %%f in ("tests\un\*.c") do (
- %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir% /Fd%bin_dir% /Fe%bin_dir% %link_param%
+ start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1
)
-set "link_param=/link %lib_dir%ungrateful.lib %lib_dir%cynic.lib"
+set "link_param=/link %link_conf% %lib_dir%ungrateful.lib %lib_dir%cynic.lib"
for %%f in ("tests\cyn\*.c") do (
- %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir% /Fd%bin_dir% /Fe%bin_dir% %link_param%
+ start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1
)
-set "link_param=/link %lib_dir%ungrateful.lib %lib_dir%cynic.lib %lib_dir%disgrace.lib"
+set "link_param=/link %link_conf% %lib_dir%ungrateful.lib %lib_dir%cynic.lib %lib_dir%disgrace.lib"
for %%f in ("tests\d\*.c") do (
- %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir% /Fd%bin_dir% /Fe%bin_dir% %link_param%
+ start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1
+)
+
+:wait
+tasklist | find "%cc%.exe" > nul
+if %errorlevel% == 0 (
+ timeout /t 0 > nul
+ goto wait
+)
+
+echo Logs:
+
+for %%f in ("%log_dir%*.txt") do (
+ type %%f
)
echo:
diff --git a/src/un_strings.c b/src/un_strings.c
index cf4fee8..0dfb493 100644
--- a/src/un_strings.c
+++ b/src/un_strings.c
@@ -42,7 +42,7 @@ s32 un_string_compare(String left, String right) {
if (left.size == 0) return -1;
if (right.size == 0) return 1;
- result = memcmp(left.data, right.data, left.size);
+ result = memcmp(left.data, right.data, UN_MIN(right.size, left.size));
if (result == 0) {
if (left.size > right.size) return 1;
@@ -146,6 +146,8 @@ List un_string_split(String input, String pattern, Allocator alloc) {
}
if (start != input.size - pattern.size) {
+ if (start >= input.size) return splits;
+
if (memcmp(input.data + start, pattern.data, pattern.size) == 0) {
return splits;
}