Compiles now with Cygwin, if -Werror is disabled in Makefile
authorMoritz Kroll <Moritz.Kroll@gmx.de>
Mon, 8 Dec 2008 22:30:29 +0000 (22:30 +0000)
committerMoritz Kroll <Moritz.Kroll@gmx.de>
Mon, 8 Dec 2008 22:30:29 +0000 (22:30 +0000)
[r24415]

adt/obstack_printf.c
ast.c
driver/firm_cmdline.c
driver/firm_opt.c
lexer.c
win32/config.h.cygwin [new file with mode: 0644]
win32/config.h.win32
win32/cygwin_math_ext.h [new file with mode: 0644]

index 21ecd2e..baae109 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  * 02111-1307, USA.
  */
+#include <config.h>
+
 #include <stdarg.h>
 #include <stdio.h>
 #include "obstack.h"
 
-#ifdef _WIN32
-#define vsnprintf _vsnprintf
-#endif
-
 int obstack_printf(struct obstack *obst, const char *fmt, ...)
 {
   char buf[1024];
diff --git a/ast.c b/ast.c
index 85c35c9..1037c91 100644 (file)
--- a/ast.c
+++ b/ast.c
 #include <stdlib.h>
 #include <ctype.h>
 
-#ifdef __INTEL_COMPILER
+#if defined(__INTEL_COMPILER)
 #include <mathimf.h>
+#elif defined(__CYGWIN__)
+#include "win32/cygwin_math_ext.h"
 #else
 #include <math.h>
 #endif
index 9a559a8..bf66c6e 100644 (file)
@@ -12,7 +12,7 @@
 #include <libfirm/firm.h>
 #include <libfirm/be.h>
 
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__CYGWIN__)
 #define DEFAULT_OS OS_SUPPORT_MINGW
 #elif defined(__APPLE__)
 #define DEFAULT_OS OS_SUPPORT_MACHO
index a7575ff..c5c9b83 100644 (file)
@@ -6,6 +6,9 @@
  *
  * $Id$
  */
+
+#include <config.h>
+
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include "firm_timing.h"
 #include "ast2firm.h"
 
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif
-
 #if defined(_DEBUG) || defined(FIRM_DEBUG)
 #define DBG(x)  dbg_printf x
 #else
diff --git a/lexer.c b/lexer.c
index 0f01d44..10e049f 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -43,7 +43,7 @@
 //#define DEBUG_CHARS
 #define MAX_PUTBACK 3
 
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__CYGWIN__)
 /* No strtold on windows and no replacement yet */
 #define strtold(s, e) strtod(s, e)
 #endif
diff --git a/win32/config.h.cygwin b/win32/config.h.cygwin
new file mode 100644 (file)
index 0000000..97ca4fe
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * This file is part of cparser.
+ * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#undef __STRICT_ANSI__
index 4102dba..ed68ceb 100644 (file)
@@ -20,3 +20,4 @@
 
 #define __attribute__(x)
 #define snprintf _snprintf
+#define vsnprintf _vsnprintf
diff --git a/win32/cygwin_math_ext.h b/win32/cygwin_math_ext.h
new file mode 100644 (file)
index 0000000..8c6ce5f
--- /dev/null
@@ -0,0 +1,115 @@
+/* Truncate argument to nearest integral value not larger than the argument.
+   Copyright (C) 1997, 1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and
+                  Jakub Jelinek <jj@ultra.linux.cz>, 1999.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <math.h>
+
+/* On Cygwin it should be little endian. */
+#define __FLOAT_WORD_ORDER LITTLE_ENDIAN
+
+/* A union which permits us to convert between a long double and
+   four 32 bit ints or two 64 bit ints.  */
+
+#if __FLOAT_WORD_ORDER == BIG_ENDIAN
+
+typedef union
+{
+       long double value;
+       struct
+       {
+               u_int64_t msw;
+               u_int64_t lsw;
+       } parts64;
+       struct
+       {
+               u_int32_t w0, w1, w2, w3;
+       } parts32;
+} ieee854_long_double_shape_type;
+
+#endif
+
+#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+       long double value;
+       struct
+       {
+               u_int64_t lsw;
+               u_int64_t msw;
+       } parts64;
+       struct
+       {
+               u_int32_t w3, w2, w1, w0;
+       } parts32;
+} ieee854_long_double_shape_type;
+
+#endif
+
+/* Get two 64 bit ints from a long double.  */
+
+#define GET_LDOUBLE_WORDS64(ix0,ix1,d)                          \
+do {                                                            \
+  ieee854_long_double_shape_type qw_u;                          \
+  qw_u.value = (d);                                             \
+  (ix0) = qw_u.parts64.msw;                                     \
+  (ix1) = qw_u.parts64.lsw;                                     \
+} while (0)
+
+/* Set a long double from two 64 bit ints.  */
+
+#define SET_LDOUBLE_WORDS64(d,ix0,ix1)                          \
+do {                                                            \
+  ieee854_long_double_shape_type qw_u;                          \
+  qw_u.parts64.msw = (ix0);                                     \
+  qw_u.parts64.lsw = (ix1);                                     \
+  (d) = qw_u.value;                                             \
+} while (0)
+
+
+static long double truncl(long double x)
+{
+       int32_t j0;
+       u_int64_t i0, i1, sx;
+
+       GET_LDOUBLE_WORDS64 (i0, i1, x);
+       sx = i0 & 0x8000000000000000ULL;
+       j0 = ((i0 >> 48) & 0x7fff) - 0x3fff;
+       if (j0 < 48)
+       {
+               if (j0 < 0)
+                       /* The magnitude of the number is < 1 so the result is +-0.  */
+                       SET_LDOUBLE_WORDS64 (x, sx, 0);
+               else
+                       SET_LDOUBLE_WORDS64 (x, i0 & ~(0x0000ffffffffffffLL >> j0), 0);
+       }
+       else if (j0 > 111)
+       {
+               if (j0 == 0x4000)
+                       /* x is inf or NaN.  */
+                       return x + x;
+       }
+       else
+       {
+               SET_LDOUBLE_WORDS64 (x, i0, i1 & ~(0xffffffffffffffffULL >> (j0 - 48)));
+       }
+
+       return x;
+}