mirror of https://github.com/flysand7/ciabatta.git
Added C11 mutexes
This commit is contained in:
parent
effd0acb63
commit
7936d0c633
|
@ -10,4 +10,4 @@ struct _os_heap {
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
void _os_timing_init(void);
|
void _os_timing_init(void);
|
||||||
|
|
|
@ -14,6 +14,14 @@ extern int main(int argc, char** argv);
|
||||||
DECLSPEC_IMPORT LPWSTR GetCommandLineW();
|
DECLSPEC_IMPORT LPWSTR GetCommandLineW();
|
||||||
DECLSPEC_IMPORT LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);
|
DECLSPEC_IMPORT LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);
|
||||||
|
|
||||||
|
int _wcsicmp(wchar_t const* s1, wchar_t const* s2) {
|
||||||
|
int diff;
|
||||||
|
do {
|
||||||
|
diff = *s1 - *s2;
|
||||||
|
} while(diff != 0 && *s1 != 0 && *s2 != 0);
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t count_wide_chars(const wchar_t* str) {
|
static size_t count_wide_chars(const wchar_t* str) {
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
while (str[len] != 0) len++;
|
while (str[len] != 0) len++;
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
// NOTE: debug mutexes will follow the recursive logic but error if they
|
||||||
|
// actually recurse, this is slower than doing plain logic but it helps
|
||||||
|
// debug weird mutex errors.
|
||||||
|
//
|
||||||
|
// Based on these posts:
|
||||||
|
// https://preshing.com/20120305/implementing-a-recursive-mutex/
|
||||||
|
// https://preshing.com/20120226/roll-your-own-lightweight-mutex/
|
||||||
|
#include "win.h"
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
void mtx_destroy(mtx_t *mtx) {
|
||||||
|
CloseHandle(mtx->semaphore);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mtx_init(mtx_t *mtx, int type) {
|
||||||
|
*mtx = (mtx_t){
|
||||||
|
.type = type,
|
||||||
|
.semaphore = CreateSemaphore(NULL, 0, 1, NULL)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (type == mtx_timed) {
|
||||||
|
// TODO(NeGate): implement timed mutexes
|
||||||
|
return thrd_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return thrd_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mtx_lock(mtx_t *mtx) {
|
||||||
|
bool try_recursive = (mtx->type == mtx_recursive);
|
||||||
|
#ifdef _DEBUG
|
||||||
|
try_recursive = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (try_recursive) {
|
||||||
|
DWORD tid = GetCurrentThreadId();
|
||||||
|
|
||||||
|
if (atomic_fetch_add_explicit(&mtx->counter, 1, memory_order_acquire) > 1) {
|
||||||
|
if (tid != mtx->owner) {
|
||||||
|
WaitForSingleObject(mtx->semaphore, INFINITE);
|
||||||
|
} else {
|
||||||
|
// we recursive and already locked
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if (mtx->type != mtx_recursive) {
|
||||||
|
return thrd_error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mtx->owner = tid;
|
||||||
|
mtx->recursion++;
|
||||||
|
} else {
|
||||||
|
if (atomic_fetch_add_explicit(&mtx->counter, 1, memory_order_acquire) > 1) {
|
||||||
|
WaitForSingleObject(mtx->semaphore, INFINITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return thrd_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts) {
|
||||||
|
return thrd_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mtx_trylock(mtx_t *mtx) {
|
||||||
|
bool try_recursive = (mtx->type == mtx_recursive);
|
||||||
|
#ifdef _DEBUG
|
||||||
|
try_recursive = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (try_recursive) {
|
||||||
|
DWORD tid = GetCurrentThreadId();
|
||||||
|
|
||||||
|
// Do we own this mutex on this thread already?
|
||||||
|
if (mtx->owner == tid) {
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if (mtx->type != mtx_recursive) {
|
||||||
|
return thrd_error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
atomic_fetch_add(&mtx->counter, 1);
|
||||||
|
} else {
|
||||||
|
int expected = 1;
|
||||||
|
if (!atomic_compare_exchange_strong(&mtx->counter, &expected, 0)) {
|
||||||
|
return thrd_busy;
|
||||||
|
}
|
||||||
|
|
||||||
|
mtx->owner = tid;
|
||||||
|
}
|
||||||
|
|
||||||
|
mtx->recursion++;
|
||||||
|
return thrd_success;
|
||||||
|
} else {
|
||||||
|
int expected = 1;
|
||||||
|
if (!atomic_compare_exchange_strong(&mtx->counter, &expected, 0)) {
|
||||||
|
return thrd_busy;
|
||||||
|
}
|
||||||
|
|
||||||
|
return thrd_success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int mtx_unlock(mtx_t *mtx) {
|
||||||
|
bool try_recursive = (mtx->type == mtx_recursive);
|
||||||
|
#if _DEBUG
|
||||||
|
try_recursive = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (try_recursive) {
|
||||||
|
DWORD tid = GetCurrentThreadId();
|
||||||
|
if (tid != mtx->owner) return thrd_error;
|
||||||
|
|
||||||
|
unsigned long recur = --mtx->recursion;
|
||||||
|
if (recur == 0) {
|
||||||
|
mtx->owner = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (atomic_fetch_sub_explicit(&mtx->counter, 1, memory_order_release) > 0) {
|
||||||
|
if (recur == 0) ReleaseSemaphore(mtx->semaphore, 1, NULL);
|
||||||
|
else {
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if (mtx->type != mtx_recursive) {
|
||||||
|
return thrd_error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// release?
|
||||||
|
if (atomic_fetch_sub_explicit(&mtx->counter, 1, memory_order_release) > 0) {
|
||||||
|
ReleaseSemaphore(mtx->semaphore, 1, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return thrd_success;
|
||||||
|
}
|
|
@ -1,8 +1,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define _os_win
|
#define _os_win
|
||||||
|
|
||||||
|
// Weird hack because this function is used by a weird function windows.h defines
|
||||||
|
int _wcsicmp(wchar_t const* s1, wchar_t const* s2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__linux__) && !defined(__ANDROID__)
|
#if defined(__linux__) && !defined(__ANDROID__)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
|
|
||||||
#define thread_local _Thread_local
|
#define thread_local _Thread_local
|
||||||
#define ONCE_FLAG_INIT 1
|
#define ONCE_FLAG_INIT 1
|
||||||
|
@ -13,7 +14,11 @@ typedef struct cnd_t {
|
||||||
} cnd_t;
|
} cnd_t;
|
||||||
|
|
||||||
typedef struct thrd_t {
|
typedef struct thrd_t {
|
||||||
int idk_yet;
|
#if defined(_WIN32)
|
||||||
|
HANDLE handle;
|
||||||
|
#else
|
||||||
|
#error "C11 thread has not been implemented on this platform"
|
||||||
|
#endif
|
||||||
} thrd_t;
|
} thrd_t;
|
||||||
|
|
||||||
typedef struct tss_t {
|
typedef struct tss_t {
|
||||||
|
@ -21,7 +26,16 @@ typedef struct tss_t {
|
||||||
} tss_t;
|
} tss_t;
|
||||||
|
|
||||||
typedef struct mtx_t {
|
typedef struct mtx_t {
|
||||||
int idk_yet;
|
#if defined(_WIN32)
|
||||||
|
int type;
|
||||||
|
// Done to handle recursive mutexes
|
||||||
|
unsigned long recursion;
|
||||||
|
unsigned long owner;
|
||||||
|
atomic_int counter;
|
||||||
|
void* semaphore;
|
||||||
|
#else
|
||||||
|
#error "C11 mutex has not been implemented on this platform"
|
||||||
|
#endif
|
||||||
} mtx_t;
|
} mtx_t;
|
||||||
|
|
||||||
typedef void(*tss_dtor_t)(void*);
|
typedef void(*tss_dtor_t)(void*);
|
||||||
|
@ -45,18 +59,21 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
void call_once(once_flag *flag, void (*func)(void));
|
void call_once(once_flag *flag, void (*func)(void));
|
||||||
|
|
||||||
int cnd_broadcast(cnd_t *cond);
|
int cnd_broadcast(cnd_t *cond);
|
||||||
void cnd_destroy(cnd_t *cond);
|
void cnd_destroy(cnd_t *cond);
|
||||||
int cnd_init(cnd_t *cond);
|
int cnd_init(cnd_t *cond);
|
||||||
int cnd_signal(cnd_t *cond);
|
int cnd_signal(cnd_t *cond);
|
||||||
int cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mtx, const struct timespec *restrict ts);
|
int cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mtx, const struct timespec *restrict ts);
|
||||||
int cnd_wait(cnd_t *cond, mtx_t *mtx);
|
int cnd_wait(cnd_t *cond, mtx_t *mtx);
|
||||||
|
|
||||||
void mtx_destroy(mtx_t *mtx);
|
void mtx_destroy(mtx_t *mtx);
|
||||||
int mtx_init(mtx_t *mtx, int type);
|
int mtx_init(mtx_t *mtx, int type);
|
||||||
int mtx_lock(mtx_t *mtx);
|
int mtx_lock(mtx_t *mtx);
|
||||||
int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts);
|
int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts);
|
||||||
int mtx_trylock(mtx_t *mtx);
|
int mtx_trylock(mtx_t *mtx);
|
||||||
int mtx_unlock(mtx_t *mtx);
|
int mtx_unlock(mtx_t *mtx);
|
||||||
|
|
||||||
int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);
|
int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);
|
||||||
thrd_t thrd_current(void);
|
thrd_t thrd_current(void);
|
||||||
int thrd_detach(thrd_t thr);
|
int thrd_detach(thrd_t thr);
|
||||||
|
@ -65,6 +82,7 @@ _Noreturn void thrd_exit(int res);
|
||||||
int thrd_join(thrd_t thr, int *res);
|
int thrd_join(thrd_t thr, int *res);
|
||||||
int thrd_sleep(const struct timespec *duration, struct timespec *remaining);
|
int thrd_sleep(const struct timespec *duration, struct timespec *remaining);
|
||||||
void thrd_yield(void);
|
void thrd_yield(void);
|
||||||
|
|
||||||
int tss_create(tss_t *key, tss_dtor_t dtor);
|
int tss_create(tss_t *key, tss_dtor_t dtor);
|
||||||
void tss_delete(tss_t key);
|
void tss_delete(tss_t key);
|
||||||
void *tss_get(tss_t key);
|
void *tss_get(tss_t key);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
local lake = require 'lakebuild'
|
||||||
|
|
||||||
|
local function buildcmd(target)
|
||||||
|
local deps = ""
|
||||||
|
if target.userdata.add_deps then
|
||||||
|
deps = table.concat(target.deps, " ")
|
||||||
|
end
|
||||||
|
local buildline = table.concat({"clang", target.userdata.flags, target.files[1], "-o", target.name, deps}, " ")
|
||||||
|
print(buildline)
|
||||||
|
os.execute(buildline)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- build all loose C files other than main.c into object files
|
||||||
|
local files = lake.glob_combined(".", false, nil, function(_, n) return lake.endswith(n, ".c") and not lake.endswith(n, "main.c") end)
|
||||||
|
local objects = {}
|
||||||
|
for _,file in ipairs(files) do
|
||||||
|
local name = file[1] .. '.o'
|
||||||
|
lake:add_target(name, {file[2]}, buildcmd, {flags="-c", add_deps=false})
|
||||||
|
table.insert(objects, name)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- build main.c
|
||||||
|
lake:add_chain("main.exe", {"main.c"}, objects, buildcmd, {flags="-O2", add_deps=true})
|
||||||
|
|
||||||
|
lake:request_build("main.exe")
|
||||||
|
|
|
@ -0,0 +1,310 @@
|
||||||
|
|
||||||
|
#line 3 "w:/workspace/cuik/crt/include/xmmintrin.h"
|
||||||
|
/* line 3 */ typedef _Vector ( float , 4 ) __m128 ;
|
||||||
|
/* line 4 */ typedef _Vector ( unsigned char , 16 ) __m128i ;
|
||||||
|
/* line 7 */ float __builtin_ia32_sqrtss ( __m128 a ) ;
|
||||||
|
/* line 8 */ __m128 __builtin_ia32_sqrtps ( __m128 a ) ;
|
||||||
|
/* line 9 */ float __builtin_ia32_rsqrtss ( __m128 a ) ;
|
||||||
|
/* line 10 */ __m128 __builtin_ia32_rsqrtps ( __m128 a ) ;
|
||||||
|
/* line 11 */ __m128 __builtin_ia32_rcpss ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 12 */ __m128 __builtin_ia32_rcpps ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 13 */ __m128 __builtin_ia32_minss ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 14 */ __m128 __builtin_ia32_minps ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 15 */ __m128 __builtin_ia32_maxss ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 16 */ __m128 __builtin_ia32_maxps ( __m128 a , __m128 b ) ;
|
||||||
|
/* line 18 */ static inline __m128 _mm_add_ss ( __m128 a , __m128 b ) {
|
||||||
|
/* line 19 */ a [ 0 ] += b [ 0 ] ;
|
||||||
|
/* line 20 */ return a ;
|
||||||
|
/* line 21 */ }
|
||||||
|
/* line 23 */ static inline __m128 _mm_sub_ss ( __m128 a , __m128 b ) {
|
||||||
|
/* line 24 */ a [ 0 ] -= b [ 0 ] ;
|
||||||
|
/* line 25 */ return a ;
|
||||||
|
/* line 26 */ }
|
||||||
|
/* line 28 */ static inline __m128 _mm_mul_ss ( __m128 a , __m128 b ) {
|
||||||
|
/* line 29 */ a [ 0 ] *= b [ 0 ] ;
|
||||||
|
/* line 30 */ return a ;
|
||||||
|
/* line 31 */ }
|
||||||
|
/* line 33 */ static inline __m128 _mm_div_ss ( __m128 a , __m128 b ) {
|
||||||
|
/* line 34 */ a [ 0 ] /= b [ 0 ] ;
|
||||||
|
/* line 35 */ return a ;
|
||||||
|
/* line 36 */ }
|
||||||
|
/* line 38 */ static inline __m128 _mm_add_ps ( __m128 a , __m128 b ) { return a + b ; }
|
||||||
|
/* line 39 */ static inline __m128 _mm_sub_ps ( __m128 a , __m128 b ) { return a - b ; }
|
||||||
|
/* line 40 */ static inline __m128 _mm_mul_ps ( __m128 a , __m128 b ) { return a * b ; }
|
||||||
|
/* line 41 */ static inline __m128 _mm_div_ps ( __m128 a , __m128 b ) { return a / b ; }
|
||||||
|
/* line 42 */ static inline __m128 _mm_and_ps ( __m128 a , __m128 b ) { return a & b ; }
|
||||||
|
/* line 43 */ static inline __m128 _mm_or_ps ( __m128 a , __m128 b ) { return a | b ; }
|
||||||
|
/* line 44 */ static inline __m128 _mm_xor_ps ( __m128 a , __m128 b ) { return a ^ b ; }
|
||||||
|
/* line 45 */ static inline __m128 _mm_andnot_ps ( __m128 a , __m128 b ) { return ~ ( a & b ) ; }
|
||||||
|
/* line 47 */ static inline __m128 _mm_sqrt_ss ( __m128 a ) { return ( __m128 ) __builtin_ia32_sqrtss ( a ) ; }
|
||||||
|
/* line 48 */ static inline __m128 _mm_sqrt_ps ( __m128 a ) { return __builtin_ia32_sqrtps ( a ) ; }
|
||||||
|
/* line 50 */ static inline __m128 _mm_rsqrt_ss ( __m128 a ) { return ( __m128 ) __builtin_ia32_rsqrtss ( a ) ; }
|
||||||
|
/* line 51 */ static inline __m128 _mm_rsqrt_ps ( __m128 a ) { return __builtin_ia32_rsqrtps ( a ) ; }
|
||||||
|
/* line 53 */ static inline __m128 _mm_rcp_ss ( __m128 a ) { return ( __m128 ) __builtin_ia32_rcpss ( a ) ; }
|
||||||
|
/* line 54 */ static inline __m128 _mm_rcp_ps ( __m128 a ) { return __builtin_ia32_rcpps ( a ) ; }
|
||||||
|
/* line 56 */ static inline __m128 _mm_min_ss ( __m128 a , __m128 b ) { return __builtin_ia32_minss ( a , b ) ; }
|
||||||
|
/* line 57 */ static inline __m128 _mm_min_ps ( __m128 a , __m128 b ) { return __builtin_ia32_minps ( a , b ) ; }
|
||||||
|
/* line 58 */ static inline __m128 _mm_max_ss ( __m128 a , __m128 b ) { return __builtin_ia32_maxss ( a , b ) ; }
|
||||||
|
/* line 59 */ static inline __m128 _mm_max_ps ( __m128 a , __m128 b ) { return __builtin_ia32_maxps ( a , b ) ; }
|
||||||
|
/* line 61 */ static inline __m128 _mm_setr_ps ( float z , float y , float x , float w ) { return ( __m128 ) { z , y , x , w } ; }
|
||||||
|
/* line 62 */ static inline __m128 _mm_setzero_ps ( void ) { return ( __m128 ) { 0 } ; }
|
||||||
|
/* line 65 */ static inline __m128i _mm_loadu_si128 ( const __m128i * src ) { return * src ; }
|
||||||
|
/* line 66 */ static inline __m128i _mm_load_si128 ( const __m128i * src ) { return * src ; }
|
||||||
|
/* line 67 */ static inline void _mm_store_si128 ( __m128i * dst , __m128i src ) { * dst = src ; }
|
||||||
|
#line 3 "w:/workspace/cuik/crt/include/intrin.h"
|
||||||
|
/* line 3 */ extern void __debugbreak ( void ) ;
|
||||||
|
#line 5 "w:/workspace/ciabatta/inc/assert.h"
|
||||||
|
/* line 5 */ extern void _assert_error (
|
||||||
|
/* line 6 */ char * cond ,
|
||||||
|
/* line 7 */ char const * func ,
|
||||||
|
/* line 8 */ char const * file ,
|
||||||
|
/* line 9 */ char const * line
|
||||||
|
/* line 10 */ ) ;
|
||||||
|
#line 3 "w:/workspace/ciabatta/inc/ctype.h"
|
||||||
|
/* line 3 */ int isalnum ( int c ) ;
|
||||||
|
/* line 4 */ int isalpha ( int c ) ;
|
||||||
|
/* line 5 */ int isblank ( int c ) ;
|
||||||
|
/* line 6 */ int iscntrl ( int c ) ;
|
||||||
|
/* line 7 */ int isdigit ( int c ) ;
|
||||||
|
/* line 8 */ int isgraph ( int c ) ;
|
||||||
|
/* line 9 */ int islower ( int c ) ;
|
||||||
|
/* line 10 */ int isprint ( int c ) ;
|
||||||
|
/* line 11 */ int ispunct ( int c ) ;
|
||||||
|
/* line 12 */ int isspace ( int c ) ;
|
||||||
|
/* line 13 */ int isupper ( int c ) ;
|
||||||
|
/* line 14 */ int isxdigit ( int c ) ;
|
||||||
|
/* line 15 */ int tolower ( int c ) ;
|
||||||
|
/* line 16 */ int toupper ( int c ) ;
|
||||||
|
#line 3 "w:/workspace/cuik/crt/include/stdint.h"
|
||||||
|
/* line 3 */ typedef signed char int8_t ;
|
||||||
|
/* line 4 */ typedef short int16_t ;
|
||||||
|
/* line 5 */ typedef int int32_t ;
|
||||||
|
/* line 6 */ typedef long long int64_t ;
|
||||||
|
/* line 7 */ typedef unsigned char uint8_t ;
|
||||||
|
/* line 8 */ typedef unsigned short uint16_t ;
|
||||||
|
/* line 9 */ typedef unsigned int uint32_t ;
|
||||||
|
/* line 10 */ typedef unsigned long long uint64_t ;
|
||||||
|
/* line 12 */ typedef signed char int_least8_t ;
|
||||||
|
/* line 13 */ typedef short int_least16_t ;
|
||||||
|
/* line 14 */ typedef int int_least32_t ;
|
||||||
|
/* line 15 */ typedef long long int_least64_t ;
|
||||||
|
/* line 16 */ typedef unsigned char uint_least8_t ;
|
||||||
|
/* line 17 */ typedef unsigned short uint_least16_t ;
|
||||||
|
/* line 18 */ typedef unsigned int uint_least32_t ;
|
||||||
|
/* line 19 */ typedef unsigned long long uint_least64_t ;
|
||||||
|
/* line 21 */ typedef signed char int_fast8_t ;
|
||||||
|
/* line 22 */ typedef int int_fast16_t ;
|
||||||
|
/* line 23 */ typedef int int_fast32_t ;
|
||||||
|
/* line 24 */ typedef long long int_fast64_t ;
|
||||||
|
/* line 25 */ typedef unsigned char uint_fast8_t ;
|
||||||
|
/* line 26 */ typedef unsigned int uint_fast16_t ;
|
||||||
|
/* line 27 */ typedef unsigned int uint_fast32_t ;
|
||||||
|
/* line 28 */ typedef unsigned long long uint_fast64_t ;
|
||||||
|
/* line 30 */ typedef long long intmax_t ;
|
||||||
|
/* line 31 */ typedef unsigned long long uintmax_t ;
|
||||||
|
#line 3 "w:/workspace/cuik/crt/include/stdarg.h"
|
||||||
|
/* line 3 */ typedef char * va_list ;
|
||||||
|
#line 6 "w:/workspace/ciabatta/inc/stdio.h"
|
||||||
|
/* line 6 */ typedef struct FILE FILE ;
|
||||||
|
/* line 7 */ typedef int64_t fpos_t ;
|
||||||
|
/* line 9 */ typedef struct div_t div_t ;
|
||||||
|
/* line 10 */ typedef struct ldiv_t ldiv_t ;
|
||||||
|
/* line 11 */ typedef struct lldiv_t lldiv_t ;
|
||||||
|
/* line 19 */ typedef int errno_t ;
|
||||||
|
/* line 20 */ typedef size_t rsize_t ;
|
||||||
|
/* line 57 */ extern FILE * stdout , * stderr , * stdin ;
|
||||||
|
/* line 59 */ int remove ( const char * filename ) ;
|
||||||
|
/* line 60 */ int rename ( const char * oldname , const char * newname ) ;
|
||||||
|
/* line 61 */ FILE * tmpfile ( void ) ;
|
||||||
|
/* line 62 */ char * tmpnam ( char * s ) ;
|
||||||
|
/* line 63 */ int fclose ( FILE * stream ) ;
|
||||||
|
/* line 64 */ int fflush ( FILE * stream ) ;
|
||||||
|
/* line 65 */ FILE * fopen ( const char * restrict filename , const char * restrict mode ) ;
|
||||||
|
/* line 66 */ FILE * freopen ( const char * restrict filename , const char * restrict mode , FILE * restrict stream ) ;
|
||||||
|
/* line 67 */ void setbuf ( FILE * restrict stream , char * restrict buf ) ;
|
||||||
|
/* line 68 */ int setvbuf ( FILE * restrict stream , char * restrict buf , int mode , size_t size ) ;
|
||||||
|
/* line 69 */ int fprintf ( FILE * restrict stream , const char * restrict format , ... ) ;
|
||||||
|
/* line 70 */ int fscanf ( FILE * restrict stream , const char * restrict format , ... ) ;
|
||||||
|
/* line 71 */ int printf ( const char * restrict format , ... ) ;
|
||||||
|
/* line 72 */ int scanf ( const char * restrict format , ... ) ;
|
||||||
|
/* line 73 */ int snprintf ( char * restrict s , size_t n , const char * restrict format , ... ) ;
|
||||||
|
/* line 74 */ int sprintf ( char * restrict s , const char * restrict format , ... ) ;
|
||||||
|
/* line 75 */ int sscanf ( const char * restrict s , const char * restrict format , ... ) ;
|
||||||
|
/* line 76 */ int vfprintf ( FILE * restrict stream , const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 77 */ int vfscanf ( FILE * restrict stream , const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 78 */ int vprintf ( const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 79 */ int vscanf ( const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 80 */ int vsnprintf ( char * restrict s , size_t n , const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 81 */ int vsprintf ( char * restrict s , const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 82 */ int vsscanf ( const char * restrict s , const char * restrict format , va_list arg ) ;
|
||||||
|
/* line 83 */ int fgetc ( FILE * stream ) ;
|
||||||
|
/* line 84 */ char * fgets ( char * restrict s , int n , FILE * restrict stream ) ;
|
||||||
|
/* line 85 */ int fputc ( int c , FILE * stream ) ;
|
||||||
|
/* line 86 */ int fputs ( const char * restrict s , FILE * restrict stream ) ;
|
||||||
|
/* line 87 */ int getc ( FILE * stream ) ;
|
||||||
|
/* line 88 */ int getchar ( void ) ;
|
||||||
|
/* line 89 */ int putc ( int c , FILE * stream ) ;
|
||||||
|
/* line 90 */ int putchar ( int c ) ;
|
||||||
|
/* line 91 */ int puts ( const char * s ) ;
|
||||||
|
/* line 92 */ int ungetc ( int c , FILE * stream ) ;
|
||||||
|
/* line 93 */ size_t fread ( void * restrict ptr , size_t size , size_t nmemb , FILE * restrict stream ) ;
|
||||||
|
/* line 94 */ size_t fwrite ( const void * restrict ptr , size_t size , size_t nmemb , FILE * restrict stream ) ;
|
||||||
|
/* line 95 */ int fgetpos ( FILE * restrict stream , fpos_t * restrict pos ) ;
|
||||||
|
/* line 96 */ int fseek ( FILE * stream , long int offset , int whence ) ;
|
||||||
|
/* line 97 */ int fsetpos ( FILE * stream , const fpos_t * pos ) ;
|
||||||
|
/* line 98 */ long int ftell ( FILE * stream ) ;
|
||||||
|
/* line 99 */ void rewind ( FILE * stream ) ;
|
||||||
|
/* line 100 */ void clearerr ( FILE * stream ) ;
|
||||||
|
/* line 101 */ int feof ( FILE * stream ) ;
|
||||||
|
/* line 102 */ int ferror ( FILE * stream ) ;
|
||||||
|
/* line 103 */ void perror ( const char * s ) ;
|
||||||
|
#line 13 "w:/workspace/cuik/crt/include/stddef.h"
|
||||||
|
/* line 13 */ typedef long long ptrdiff_t ;
|
||||||
|
/* line 14 */ typedef unsigned long long size_t ;
|
||||||
|
/* line 15 */ typedef long double max_align_t ;
|
||||||
|
/* line 18 */ typedef short wchar_t ;
|
||||||
|
#line 18 "w:/workspace/ciabatta/inc/stdlib.h" typedef struct div_t {
|
||||||
|
/* line 19 */ int quot ;
|
||||||
|
/* line 20 */ int rem ;
|
||||||
|
/* line 21 */ } div_t ;
|
||||||
|
/* line 23 */ typedef struct ldiv_t {
|
||||||
|
/* line 24 */ long quot ;
|
||||||
|
/* line 25 */ long rem ;
|
||||||
|
/* line 26 */ } ldiv_t ;
|
||||||
|
/* line 28 */ typedef struct lldiv_t {
|
||||||
|
/* line 29 */ long long quot ;
|
||||||
|
/* line 30 */ long long rem ;
|
||||||
|
/* line 31 */ } lldiv_t ;
|
||||||
|
/* line 44 */ double atof ( const char * nptr ) ;
|
||||||
|
/* line 45 */ int atoi ( const char * nptr ) ;
|
||||||
|
/* line 46 */ long int atol ( const char * nptr ) ;
|
||||||
|
/* line 47 */ long long int atoll ( const char * nptr ) ;
|
||||||
|
/* line 48 */ double strtod ( const char * restrict nptr , char * * restrict endptr ) ;
|
||||||
|
/* line 49 */ float strtof ( const char * restrict nptr , char * * restrict endptr ) ;
|
||||||
|
/* line 50 */ long double strtold ( const char * restrict nptr , char * * restrict endptr ) ;
|
||||||
|
/* line 51 */ long int strtol ( const char * restrict nptr , char * * restrict endptr , int base ) ;
|
||||||
|
/* line 52 */ long long int strtoll ( const char * restrict nptr , char * * restrict endptr , int base ) ;
|
||||||
|
/* line 53 */ unsigned long int strtoul ( const char * restrict nptr , char * * restrict endptr , int base ) ;
|
||||||
|
/* line 54 */ unsigned long long int strtoull ( const char * restrict nptr , char * * restrict endptr , int base ) ;
|
||||||
|
/* line 55 */ int rand ( void ) ;
|
||||||
|
/* line 56 */ void srand ( unsigned int seed ) ;
|
||||||
|
/* line 58 */ typedef struct _os_heap _os_heap ;
|
||||||
|
/* line 59 */ void _heap_setup ( _os_heap * heap ) ;
|
||||||
|
/* line 60 */ void * aligned_alloc ( size_t alignment , size_t size ) ;
|
||||||
|
/* line 61 */ void * calloc ( size_t nmemb , size_t size ) ;
|
||||||
|
/* line 62 */ void free ( void * ptr ) ;
|
||||||
|
/* line 63 */ void * malloc ( size_t size ) ;
|
||||||
|
/* line 64 */ void * realloc ( void * ptr , size_t size ) ;
|
||||||
|
/* line 66 */ _Noreturn void abort ( void ) ;
|
||||||
|
/* line 67 */ int atexit ( void ( * func ) ( void ) ) ;
|
||||||
|
/* line 69 */ _Noreturn void exit ( int status ) ;
|
||||||
|
/* line 70 */ _Noreturn void _Exit ( int status ) ;
|
||||||
|
/* line 71 */ char * getenv ( const char * name ) ;
|
||||||
|
/* line 73 */ int system ( const char * string ) ;
|
||||||
|
/* line 74 */ const void * bsearch ( const void * key , const void * base , size_t nmemb , size_t size , int ( * compar ) ( const void * , const void * ) ) ;
|
||||||
|
#line 9 "w:/workspace/ciabatta/inc/errno.h"
|
||||||
|
/* line 9 */ extern int errno ;
|
||||||
|
#line 708 "w:/windows kits/10/include/10.0.22000.0/shared/sal.h"
|
||||||
|
/* line 708 */ _Pragma ( "region Input Buffer SAL 1 compatibility macros" )
|
||||||
|
/* line 1472 */ _Pragma ( "endregion Input Buffer SAL 1 compatibility macros" )
|
||||||
|
#line 15 "w:/visual studio/2019/community/vc/tools/msvc/14.29.30133/include/vadefs.h"
|
||||||
|
/* line 15 */ _Pragma ( "pack(push, _CRT_PACKING)" )
|
||||||
|
/* line 47 */ _Pragma ( "warning(push)" )
|
||||||
|
/* line 48 */ _Pragma ( "warning(disable: _VCRUNTIME_DISABLED_WARNINGS)" )
|
||||||
|
/* line 61 */ typedef unsigned
|
||||||
|
/* line 1 */ long long
|
||||||
|
/* line 61 */ uintptr_t ;
|
||||||
|
/* line 72 */ typedef char * va_list ;
|
||||||
|
/* line 155 */ void __cdecl __va_start ( va_list * , ... ) ;
|
||||||
|
/* line 207 */ _Pragma ( "warning(pop)" )
|
||||||
|
/* line 208 */ _Pragma ( "pack(pop)" )
|
||||||
|
#line 60 "w:/visual studio/2019/community/vc/tools/msvc/14.29.30133/include/vcruntime.h"
|
||||||
|
/* line 60 */ _Pragma ( "warning(push)" )
|
||||||
|
/* line 61 */ _Pragma ( "warning(disable: _VCRUNTIME_DISABLED_WARNINGS)" )
|
||||||
|
/* line 1 */ _Pragma ( "pack(push, _CRT_PACKING)" )
|
||||||
|
/* line 193 */ typedef unsigned
|
||||||
|
/* line 1 */ long long
|
||||||
|
/* line 193 */ size_t ;
|
||||||
|
/* line 194 */ typedef
|
||||||
|
/* line 1 */ long long
|
||||||
|
/* line 194 */ ptrdiff_t ;
|
||||||
|
/* line 195 */ typedef
|
||||||
|
/* line 1 */ long long
|
||||||
|
/* line 195 */ intptr_t ;
|
||||||
|
/* line 209 */ typedef _Bool __vcrt_bool ;
|
||||||
|
/* line 228 */ typedef unsigned short wchar_t ;
|
||||||
|
/* line 342 */ void __cdecl __security_init_cookie ( void ) ;
|
||||||
|
/* line 351 */ void __cdecl __security_check_cookie ( uintptr_t _StackCookie ) ;
|
||||||
|
/* line 352 */ __declspec ( noreturn ) void __cdecl __report_gsfailure ( uintptr_t _StackCookie ) ;
|
||||||
|
/* line 356 */ extern uintptr_t __security_cookie ;
|
||||||
|
/* line 1 */ _Pragma ( "pack(pop)" )
|
||||||
|
/* line 366 */ _Pragma ( "warning(pop)" )
|
||||||
|
#line 13 "w:/visual studio/2019/community/vc/tools/msvc/14.29.30133/include/limits.h"
|
||||||
|
/* line 13 */ _Pragma ( "warning(push)" )
|
||||||
|
/* line 14 */ _Pragma ( "warning(disable: _VCRUNTIME_DISABLED_WARNINGS)" )
|
||||||
|
/* line 1 */ _Pragma ( "pack(push, _CRT_PACKING)" ) _Pragma ( "pack(pop)" )
|
||||||
|
/* line 78 */ _Pragma ( "warning(pop)" )
|
||||||
|
#line 27 "w:/workspace/ciabatta/inc/string.h"
|
||||||
|
/* line 27 */ void * memcpy ( void * restrict s1 , const void * restrict s2 , size_t n ) ;
|
||||||
|
/* line 28 */ void * memmove ( void * s1 , const void * s2 , size_t n ) ;
|
||||||
|
/* line 29 */ char * strcpy ( char * restrict s1 , const char * restrict s2 ) ;
|
||||||
|
/* line 30 */ char * strncpy ( char * restrict s1 , const char * restrict s2 , size_t n ) ;
|
||||||
|
/* line 31 */ char * strcat ( char * restrict s1 , const char * restrict s2 ) ;
|
||||||
|
/* line 32 */ char * strncat ( char * restrict s1 , const char * restrict s2 , size_t n ) ;
|
||||||
|
/* line 33 */ int memcmp ( const void * s1 , const void * s2 , size_t n ) ;
|
||||||
|
/* line 34 */ int strcmp ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 35 */ int strcoll ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 36 */ int strncmp ( const char * s1 , const char * s2 , size_t n ) ;
|
||||||
|
/* line 37 */ size_t strxfrm ( char * restrict s1 , const char * restrict s2 , size_t n ) ;
|
||||||
|
/* line 38 */ void * memchr ( const void * s , int c , size_t n ) ;
|
||||||
|
/* line 39 */ char * strchr ( const char * s , int c ) ;
|
||||||
|
/* line 40 */ size_t strcspn ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 41 */ char * strpbrk ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 42 */ char * strrchr ( const char * s , int c ) ;
|
||||||
|
/* line 43 */ size_t strspn ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 44 */ char * strstr ( const char * s1 , const char * s2 ) ;
|
||||||
|
/* line 45 */ char * strtok ( char * restrict s1 , const char * restrict s2 ) ;
|
||||||
|
/* line 46 */ void * memset ( void * s , int c , size_t n ) ;
|
||||||
|
/* line 47 */ char * strerror ( int errnum ) ;
|
||||||
|
/* line 48 */ size_t strlen ( const char * s ) ;
|
||||||
|
/* line 51 */ char * strtok_r ( char * restrict s1 , const char * restrict s2 , char * * restrict ctx ) ;
|
||||||
|
#line 4 "w:/workspace/ciabatta/inc/signal.h"
|
||||||
|
/* line 4 */ typedef int sig_atomic_t ;
|
||||||
|
/* line 25 */ void ( * signal ( int sig , void ( * func ) ( int ) ) ) ( int ) ;
|
||||||
|
/* line 26 */ int raise ( int sig ) ;
|
||||||
|
#line 13 "test/test.c"
|
||||||
|
/* line 13 */ int test ( ) {
|
||||||
|
/* line 14 */ static int a = 2 ;
|
||||||
|
/* line 15 */ a += 1 ;
|
||||||
|
/* line 16 */ return a ;
|
||||||
|
/* line 17 */ }
|
||||||
|
/* line 19 */ void wack ( ) {
|
||||||
|
/* line 20 */ printf ( "BYE!!!\n" ) ;
|
||||||
|
/* line 21 */ }
|
||||||
|
/* line 23 */ int main ( int argc , char * * argv ) {
|
||||||
|
/* line 24 */ atexit ( wack ) ;
|
||||||
|
/* line 26 */ char * path_env = getenv ( "PATH" ) ;
|
||||||
|
/* line 27 */ char * ctx , * path_token = strtok_r ( path_env , ";" , & ctx ) ;
|
||||||
|
/* line 28 */ while ( path_token ) {
|
||||||
|
/* line 29 */ printf ( "%s\n" , path_token ) ;
|
||||||
|
/* line 30 */ path_token = strtok_r (
|
||||||
|
/* line 1 */ ( ( void * ) 0 )
|
||||||
|
/* line 30 */ , ";" , & ctx ) ;
|
||||||
|
/* line 31 */ }
|
||||||
|
/* line 33 */ test ( ) ;
|
||||||
|
/* line 34 */ char input [ ] = "A bird came down the walk" ;
|
||||||
|
/* line 35 */ printf ( "Parsing the input string '%s'\n" , input ) ;
|
||||||
|
/* line 36 */ char * token = strtok ( input , " " ) ;
|
||||||
|
/* line 37 */ while ( token ) {
|
||||||
|
/* line 38 */ printf ( "%s\n" , token ) ;
|
||||||
|
/* line 39 */ token = strtok (
|
||||||
|
/* line 1 */ ( ( void * ) 0 )
|
||||||
|
/* line 39 */ , " " ) ;
|
||||||
|
/* line 40 */ }
|
||||||
|
/* line 42 */ printf ( "Contents of the input string now: '" ) ;
|
||||||
|
/* line 43 */ for ( size_t n = 0 ; n < sizeof input ; ++ n )
|
||||||
|
/* line 44 */ input [ n ] ? printf ( "%c" , input [ n ] ) : printf ( "\\0" ) ;
|
||||||
|
/* line 45 */ printf ( "'" ) ;
|
||||||
|
/* line 46 */ return 0 ;
|
||||||
|
/* line 47 */ }
|
||||||
|
/* line 1 */
|
Loading…
Reference in New Issue