From 0961a38493c545cd23a791cf66b45d8fc78accbd Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 7 Apr 2014 00:26:36 +0200 Subject: [PATCH] Declare wint_t in when needed Some old glibcs require to provide wint_t, accomodate them. --- include/stddef.h | 15 +++++++++++++++ libtcc.c | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/include/stddef.h b/include/stddef.h index fbc61fcd..eaf06698 100644 --- a/include/stddef.h +++ b/include/stddef.h @@ -26,3 +26,18 @@ typedef unsigned long long int uint64_t; void *alloca(size_t size); #endif + +/* Older glibc require a wint_t from (when requested + by __need_wint_t, as otherwise stddef.h isn't allowed to + define this type). Note that this must be outside the normal + _STDDEF_H guard, so that it works even when we've included the file + already (without requring wint_t). Some other libs define _WINT_T + if they've already provided that type, so we can use that as guard. + TCC defines __WINT_TYPE__ for us. */ +#if defined (__need_wint_t) +#ifndef _WINT_T +#define _WINT_T +typedef __WINT_TYPE__ wint_t; +#endif +#undef __need_wint_t +#endif diff --git a/libtcc.c b/libtcc.c index 601999ea..cc84cd70 100644 --- a/libtcc.c +++ b/libtcc.c @@ -988,8 +988,17 @@ LIBTCCAPI TCCState *tcc_new(void) #ifdef TCC_TARGET_PE tcc_define_symbol(s, "__WCHAR_TYPE__", "unsigned short"); + tcc_define_symbol(s, "__WINT_TYPE__", "unsigned short"); #else tcc_define_symbol(s, "__WCHAR_TYPE__", "int"); + /* wint_t is unsigned int by default, but (signed) int on BSDs + and unsigned short on windows. Other OSes might have still + other conventions, sigh. */ +#if defined(__FreeBSD__) || defined (__FreeBSD_kernel__) + tcc_define_symbol(s, "__WINT_TYPE__", "int"); +#else + tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int"); +#endif #endif #ifndef TCC_TARGET_PE