From 6b9ba6033eda93ea595da25540fd6a467f9e1d32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolas=20L=C3=A9veill=C3=A9?= <nicolas@uucidl.com>
Date: Sun, 9 Aug 2015 17:44:47 +0200
Subject: [PATCH] Allow windows users to include hammer.h

We substitute H_GCC_ATTRIBUTE to any occurence of __attribute__ and
disable its function with non gcc, non clang compilers.

We use a H_ macro so as to not pollute users' namespaces.

On windows build without c4201 so as to allow anonymous struct. This
shows hammer is not C99 compliant but rather C11.
---
 src/hammer.h             | 13 ++++++++++---
 tools/windows/clvars.bat |  3 +++
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/hammer.h b/src/hammer.h
index 50b3de5c..95f8c981 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -17,6 +17,13 @@
 
 #ifndef HAMMER_HAMMER__H
 #define HAMMER_HAMMER__H
+
+#if defined(__clang__) || defined(__GNUC__)
+#define H_GCC_ATTRIBUTE(x) __attribute__(x)
+#else
+#define H_GCC_ATTRIBUTE(x)
+#endif
+
 #ifndef HAMMER_INTERNAL__NO_STDARG_H
 #include <stdarg.h>
 #endif // HAMMER_INTERNAL__NO_STDARG_H
@@ -434,7 +441,7 @@ HAMMER_FN_DECL_NOARG(HParser*, h_nothing_p);
  *
  * Result token type: TT_SEQUENCE
  */
-HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, HParser* p);
+HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_sequence, HParser* p);
 
 /**
  * Given an array of parsers, p_array, apply each parser in order. The 
@@ -443,7 +450,7 @@ HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, HPa
  *
  * Result token type: The type of the first successful parser's result.
  */
-HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, HParser* p);
+HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_choice, HParser* p);
 
 /**
  * Given a null-terminated list of parsers, match a permutation phrase of these
@@ -469,7 +476,7 @@ HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, HPars
  *
  * Result token type: TT_SEQUENCE
  */
-HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_permutation, HParser* p);
+HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_permutation, HParser* p);
 
 /**
  * Given two parsers, p1 and p2, this parser succeeds in the following 
diff --git a/tools/windows/clvars.bat b/tools/windows/clvars.bat
index 4f63bd17..ba549006 100644
--- a/tools/windows/clvars.bat
+++ b/tools/windows/clvars.bat
@@ -19,6 +19,9 @@ set WARNINGS=%WARNINGS% -wd4200
 REM c4204 (non-constant aggregate initializers) ressembles C99 support
 set WARNINGS=%WARNINGS% -wd4204
 
+REM c4201 (anonymous unions) ressembles C11 support
+set WARNINGS=%WARNINGS% -wd4201
+
 REM c4820 (warnings about padding) is not useful
 set WARNINGS=%WARNINGS% -wd4820
 
-- 
GitLab