diff --git a/charset/internal.h b/charset/internal.h index 32d0f6d5..7fd6628f 100644 --- a/charset/internal.h +++ b/charset/internal.h @@ -6,7 +6,13 @@ #define charset_internal_h /* This invariably comes in handy */ -#define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) +#ifndef lenof +#if HAVE_COUNTOF +#define lenof(x) _Countof(x) +#else +#define lenof(x) ( (sizeof((x))) / (sizeof(*(x)))) +#endif +#endif /* This is an invalid Unicode value used to indicate an error. */ #define ERROR 0xFFFFL /* Unicode value representing error */ diff --git a/cmake/cmake.h.in b/cmake/cmake.h.in index 3d36b3d0..3b64d03f 100644 --- a/cmake/cmake.h.in +++ b/cmake/cmake.h.in @@ -5,6 +5,8 @@ #cmakedefine NO_MULTIMON +#cmakedefine01 HAVE_COUNTOF + #cmakedefine01 HAVE_WINRESRC_H #cmakedefine01 HAVE_WINRES_H #cmakedefine01 HAVE_WIN_H diff --git a/cmake/setup.cmake b/cmake/setup.cmake index 1be448df..75af0eac 100644 --- a/cmake/setup.cmake +++ b/cmake/setup.cmake @@ -116,6 +116,12 @@ int main(int argc, char **argv) { free(p); }" HAVE_ALIGNED_ALLOC) +check_c_source_compiles(" +int main(int argc, char **argv) { + int a[3]; + return _Countof(a); +}" HAVE_COUNTOF) + if(PUTTY_DEBUG) add_compile_definitions(DEBUG) endif() diff --git a/misc.h b/misc.h index c64eb01b..67a1833b 100644 --- a/misc.h +++ b/misc.h @@ -353,8 +353,12 @@ const char *conf_id(int key); #endif #ifndef lenof +#if HAVE_COUNTOF +#define lenof(x) _Countof(x) +#else #define lenof(x) ( (sizeof((x))) / (sizeof(*(x)))) #endif +#endif #ifndef min #define min(x,y) ( (x) < (y) ? (x) : (y) ) diff --git a/utils/tree234.c b/utils/tree234.c index 004cfb8d..e7b3d4fc 100644 --- a/utils/tree234.c +++ b/utils/tree234.c @@ -1361,7 +1361,13 @@ int mycmp(void *av, void *bv) return strcmp(a, b); } -#define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) +#ifndef lenof +#if HAVE_COUNTOF +#define lenof(x) _Countof(x) +#else +#define lenof(x) ( (sizeof((x))) / (sizeof(*(x)))) +#endif +#endif char *strings[] = { "a", "ab", "absque", "coram", "de",