#ifndef _SG_COMPILER_H
#define _SG_COMPILER_H
+/*
+ * Helper macro SG_STRINGIZE:
+ * Converts the parameter X to a string after macro replacement
+ * on X has been performed.
+ */
+#define SG_STRINGIZE(X) SG_DO_STRINGIZE(X)
+#define SG_DO_STRINGIZE(X) #X
+
#ifdef __GNUC__
# if __GNUC__ == 2
# if __GNUC_MINOR__ < 8
# define STL_FUNCTIONAL <functional>
# define STL_IOMANIP <iomanip.h>
# define STL_IOSTREAM <iostream.h>
+# define STL_ITERATOR <iterator.h>
# define STL_FSTREAM <fstream.h>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
# define STL_FUNCTIONAL <functional>
# define STL_IOMANIP <iomanip>
# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
# define STL_FSTREAM <fstream>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
# define STL_STRSTREAM <strstream>
# endif
+# elif __GNUC__ == 3
+ // g++-3.0.x
+# define SG_EXPLICIT_FUNCTION_TMPL_ARGS
+# define SG_NEED_AUTO_PTR
+# define SG_MEMBER_TEMPLATES
+# define SG_NAMESPACES
+# define SG_HAVE_STD
+# define SG_HAVE_STREAMBUF
+# define SG_CLASS_PARTIAL_SPECIALIZATION
+# define SG_HAVE_STD_INCLUDES
+
+# define STL_ALGORITHM <algorithm>
+# define STL_FUNCTIONAL <functional>
+# define STL_IOMANIP <iomanip>
+# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
+# define STL_FSTREAM <fstream>
+# define STL_STDEXCEPT <stdexcept>
+# define STL_STRING <string>
+# define STL_STRSTREAM <strstream>
# else
# error Time to upgrade. GNU compilers < 2.7 not supported
# endif
+
+# define SG_COMPILER_STR "GNU C++ version " SG_STRINGIZE(__GNUC__) "." SG_STRINGIZE(__GNUC_MINOR__)
+
+#endif // __GNUC__
+
+#if defined( __MINGW32__ )
+# define bcopy(from, to, n) memcpy(to, from, n)
+# define FG_MEM_COPY(to,from,n) memcpy(to, from, n)
+# define snprintf _snprintf
#endif
/* KAI C++ */
# define STL_FUNCTIONAL <functional>
# define STL_IOMANIP <iomanip>
# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
# define STL_FSTREAM <fstream>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
# define STL_STRSTREAM <strstream>
-#endif
+
+# define SG_COMPILER_STR "Kai C++ version " SG_STRINGIZE(__KCC_VERSION)
+
+#endif // __KCC
//
// Metrowerks
# define STL_FUNCTIONAL <functional>
# define STL_IOMANIP <iomanip>
# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
# define STL_FSTREAM <fstream>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
// -dw- currently used glut has no game mode stuff
# define GLUT_WRONG_VERSION
-#endif
+
+# define SG_COMPILER_STR "Metrowerks CodeWarrior C++ version " SG_STRINGIZE(__MWERKS__)
+
+#endif // __MWERKS__
//
// Microsoft compilers.
# define STL_FUNCTIONAL <functional>
# define STL_IOMANIP <iomanip>
# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
# define STL_FSTREAM <fstream>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
# define STL_STRSTREAM <strstream>
-# pragma warning(disable: 4786) // identifier was truncated to '255' characters
-# pragma warning(disable: 4244) // conversion from double to float
-# pragma warning(disable: 4305) //
-
-# elif _MSC_VER == 1100 // msvc++ 5.0
-# define NEEDNAMESPACESTD
-# define SG_NAMESPACES
-# define SG_HAVE_STD
-# define SG_HAVE_STD_INCLUDES
-# define SG_HAVE_STREAMBUF
-
-# define STL_ALGORITHM <algorithm>
-# define STL_FUNCTIONAL <functional>
-# define STL_IOMANIP <iomanip>
-# define STL_IOSTREAM <iostream>
-# define STL_FSTREAM <fstream>
-# define STL_STDEXCEPT <stdexcept>
-# define STL_STRING <string>
-# define STL_STRSTREAM <strstream>
+# define snprintf _snprintf
# pragma warning(disable: 4786) // identifier was truncated to '255' characters
# pragma warning(disable: 4244) // conversion from double to float
# else
# error What version of MSVC++ is this?
# endif
-#endif
+
+# define SG_COMPILER_STR "Microsoft Visual C++ version " SG_STRINGIZE(_MSC_VER)
+
+#endif // _MSC_VER
#ifdef __BORLANDC__
# if defined(HAVE_SGI_STL_PORT)
# endif // HAVE_SGI_STL_PORT
# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
# define STL_FSTREAM <fstream>
# define STL_STRING <string>
# define SG_NO_DEFAULT_TEMPLATE_ARGS
# define SG_NAMESPACES
// # define SG_HAVE_STD
+# define SG_COMPILER_STR "Borland C++ version " SG_STRINGIZE(__BORLANDC__)
+
#endif // __BORLANDC__
//
# define SG_HAVE_NATIVE_SGI_COMPILERS
# define SG_EXPLICIT_FUNCTION_TMPL_ARGS
+# define SG_CLASS_PARTIAL_SPECIALIZATION
# define SG_NEED_AUTO_PTR
# define SG_MEMBER_TEMPLATES
# define SG_NAMESPACES
# define SG_HAVE_STD
-# define SG_CLASS_PARTIAL_SPECIALIZATION
+# define SG_HAVE_STREAMBUF
# define SG_HAVE_TRAITS
+# define SG_HAVE_STD_INCLUDES
# define STL_ALGORITHM <algorithm>
# define STL_FUNCTIONAL <functional>
-# define STL_IOMANIP <iomanip.h>
-# define STL_IOSTREAM <iostream.h>
-# define STL_FSTREAM <fstream.h>
+# define STL_IOMANIP <iomanip>
+# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
+# define STL_FSTREAM <fstream>
# define STL_STDEXCEPT <stdexcept>
# define STL_STRING <string>
-# define STL_STRSTREAM <strstream.h>
+# define STL_STRSTREAM <strstream>
+
+#pragma set woff 1001,1012,1014,1116,1155,1172,1174
+#pragma set woff 1401,1460,1551,1552,1681
+
+#ifdef __cplusplus
+#pragma set woff 1682,3303
+#endif
+
+# define SG_COMPILER_STR "SGI MipsPro compiler version " SG_STRINGIZE(_COMPILER_VERSION)
#endif // Native SGI compilers
# else
extern void *memmove(void *, const void *, size_t);
# endif // __cplusplus
+
+# define SG_COMPILER_STR "Sun compiler version " SG_STRINGIZE(__SUNPRO_CC)
+
#endif // sun
+//
+// Intel C++ Compiler
+//
+#if defined(__ICC) || defined (__ECC)
+# define SG_NAMESPACES
+# define SG_HAVE_STD
+# define SG_HAVE_STREAMBUF
+# define SG_HAVE_TRAITS
+# define SG_HAVE_STD_INCLUDES
+
+# define STL_ALGORITHM <algorithm>
+# define STL_FUNCTIONAL <functional>
+# define STL_IOMANIP <iomanip>
+# define STL_IOSTREAM <iostream>
+# define STL_ITERATOR <iterator>
+# define STL_FSTREAM <fstream>
+# define STL_STDEXCEPT <stdexcept>
+# define STL_STRING <string>
+# define STL_STRSTREAM <strstream>
+
+# define SG_COMPILER_STR "Intel C++ version " SG_STRINGIZE(__ICC)
+
+#endif // __ICC
+
//
// No user modifiable definitions beyond here.
//