Introduced compatibility with systems that have pre-C99
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 6 Jan 2008 14:27:41 +0000 (16:27 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Sun, 6 Jan 2008 14:27:41 +0000 (16:27 +0200)
or no inttypes.h. This is useful when the compiler has
good enough support for C99, but libc headers don't.

Changed liblzma API so that sys/types.h and inttypes.h
have to be #included before #including lzma.h. On systems
that don't have C99 inttypes.h, it's the problem of the
applications to provide the required types and macros
before #including lzma.h.

If lzma.h defined the missing types and macros, it could
conflict with third-party applications whose configure
has detected that the types are missing and defined them
in config.h already. An alternative would have been
introducing lzma_uint32 and similar types, but that would
just be an extra pain on modern systems.

13 files changed:
configure.ac
doc/liblzma-intro.txt
src/common/sysdefs.h
src/liblzma/api/lzma.h
src/liblzma/check/crc32_table.c
src/liblzma/check/crc32_table_be.h
src/liblzma/check/crc32_table_le.h
src/liblzma/check/crc32_tablegen.c
src/liblzma/check/crc64_table.c
src/liblzma/check/crc64_table_be.h
src/liblzma/check/crc64_table_le.h
src/liblzma/check/crc64_tablegen.c
src/lzma/private.h

index e0b394a..514408e 100644 (file)
@@ -392,10 +392,21 @@ AC_CHECK_HEADERS([assert.h errno.h byteswap.h sys/param.h sys/sysctl.h],
 # Checks for typedefs, structures, and compiler characteristics.
 ###############################################################################
 
-AC_HEADER_STDBOOL
 AC_C_INLINE
 AC_C_RESTRICT
 
+AC_HEADER_STDBOOL
+
+AC_TYPE_UINT8_T
+AC_TYPE_INT32_T
+AC_TYPE_UINT32_T
+AC_TYPE_INT64_T
+AC_TYPE_UINT64_T
+AC_TYPE_UINTPTR_T
+
+AC_CHECK_SIZEOF([unsigned long])
+AC_CHECK_SIZEOF([size_t])
+
 # The command line tool can copy high resolution timestamps if such
 # information is availabe in struct stat. Otherwise one second accuracy
 # is used. Most systems seem to have st_xtim but BSDs have st_xtimespec.
index 9cbd63a..52c4d92 100644 (file)
@@ -5,8 +5,14 @@ Introduction to liblzma
 Writing applications to work with liblzma
 
     liblzma API is split in several subheaders to improve readability and
-    maintainance. The subheaders must not be #included directly; simply
-    use `#include <lzma.h>' instead.
+    maintainance. The subheaders must not be #included directly. lzma.h
+    requires that certain integer types and macros are available when
+    the header is #included. On systems that have inttypes.h that conforms
+    to C99, the following will work:
+
+        #include <sys/types.h>
+        #include <inttypes.h>
+        #include <lzma.h>
 
     Those who have used zlib should find liblzma's API easy to use.
     To developers who haven't used zlib before, I recommend learning
index b4ba8a5..7b69504 100644 (file)
 #      include <config.h>
 #endif
 
-#include "lzma.h"
+#include <sys/types.h>
+
+#ifdef HAVE_INTTYPES_H
+#      include <inttypes.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+#      include <limits.h>
+#endif
+
+// Be more compatible with systems that have non-conforming inttypes.h.
+// We assume that int is 32-bit and that long is either 32-bit or 64-bit.
+// Full Autoconf test could be more correct, but this should work well enough.
+#ifndef UINT32_C
+#      define UINT32_C(n) n ## U
+#endif
+#ifndef UINT32_MAX
+#      define UINT32_MAX UINT32_C(4294967295)
+#endif
+#ifndef PRIu32
+#      define PRIu32 "u"
+#endif
+#ifndef PRIX32
+#      define PRIX32 "X"
+#endif
+#if SIZEOF_UNSIGNED_LONG == 4
+#      ifndef UINT64_C
+#              define UINT64_C(n) n ## ULL
+#      endif
+#      ifndef PRIu64
+#              define PRIu64 "llu"
+#      endif
+#      ifndef PRIX64
+#              define PRIX64 "llX"
+#      endif
+#else
+#      ifndef UINT64_C
+#              define UINT64_C(n) n ## UL
+#      endif
+#      ifndef PRIu64
+#              define PRIu64 "lu"
+#      endif
+#      ifndef PRIX64
+#              define PRIX64 "lX"
+#      endif
+#endif
+#ifndef UINT64_MAX
+#      define UINT64_MAX UINT64_C(18446744073709551615)
+#endif
+#ifndef SIZE_MAX
+#      if SIZEOF_SIZE_T == 4
+#              define SIZE_MAX UINT32_MAX
+#      else
+#              define SIZE_MAX UINT64_MAX
+#      endif
+#endif
 
 #include <stdlib.h>
 
@@ -70,6 +125,8 @@ typedef unsigned char _Bool;
 #      include <memory.h>
 #endif
 
+#include "lzma.h"
+
 
 ////////////
 // Macros //
index 186ae12..ad39d34 100644 (file)
  * 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.
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ * Before #including this file, you must make the following types available:
+ *  - size_t
+ *  - uint8_t
+ *  - int32_t
+ *  - uint32_t
+ *  - int64_t
+ *  - uint64_t
+ *
+ * Before #including this file, you must make the following macros available:
+ *  - UINT32_C(n)
+ *  - UINT64_C(n)
+ *  - UINT32_MAX
+ *  - UINT64_MAX
+ *
+ * Easiest way to achieve the above is to #include sys/types.h and inttypes.h
+ * before #including lzma.h. However, some pre-C99 libc headers don't provide
+ * all the required types in inttypes.h (that file may even be missing).
+ * Portable applications need to provide these types themselves. This way
+ * liblzma API can use the standard types instead of defining its own
+ * (e.g. lzma_uint32).
+ *
+ * Note that the API still has lzma_bool, because using stdbool.h would
+ * break C89 and C++ programs on many systems.
  */
 
 #ifndef LZMA_H
 #define LZMA_H
 
-/********************
- * External headers *
- ********************/
-
-/* size_t */
-#include <sys/types.h>
-
-/* NULL */
-#include <stddef.h>
-
-/* uint8_t, uint32_t, uint64_t, UINT32_C, UINT64_C, UINT64_MAX. */
-#include <inttypes.h>
-
-
 /******************
  * GCC extensions *
  ******************/
index b59642d..f1cc0da 100644 (file)
@@ -11,9 +11,7 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef HAVE_CONFIG_H
-#      include <config.h>
-#endif
+#include "sysdefs.h"
 
 #ifdef WORDS_BIGENDIAN
 #      include "crc32_table_be.h"
index bc5a5fb..f4f4e36 100644 (file)
@@ -1,7 +1,5 @@
 /* This file has been automatically generated by crc32_tablegen.c. */
 
-#include <inttypes.h>
-
 const uint32_t lzma_crc32_table[8][256] = {
        {
                0x00000000, 0x96300777, 0x2C610EEE, 0xBA510999, 
index a96d772..7b81666 100644 (file)
@@ -1,7 +1,5 @@
 /* This file has been automatically generated by crc32_tablegen.c. */
 
-#include <inttypes.h>
-
 const uint32_t lzma_crc32_table[8][256] = {
        {
                0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 
index 280d3b1..f05d753 100644 (file)
@@ -31,7 +31,6 @@ main()
 
        printf("/* This file has been automatically generated by "
                        "crc32_tablegen.c. */\n\n"
-                       "#include <inttypes.h>\n\n"
                        "const uint32_t lzma_crc32_table[8][256] = {\n\t{");
 
        for (size_t s = 0; s < 8; ++s) {
index 0f2d1fb..2f22731 100644 (file)
@@ -11,9 +11,7 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef HAVE_CONFIG_H
-#      include <config.h>
-#endif
+#include "sysdefs.h"
 
 #ifdef WORDS_BIGENDIAN
 #      include "crc64_table_be.h"
index 9951840..2d2794f 100644 (file)
@@ -1,7 +1,5 @@
 /* This file has been automatically generated by crc64_tablegen.c. */
 
-#include <inttypes.h>
-
 const uint64_t lzma_crc64_table[4][256] = {
        {
                UINT64_C(0x0000000000000000), UINT64_C(0x6F5FA703BE4C2EB3), 
index 3047ea1..6f82cad 100644 (file)
@@ -1,7 +1,5 @@
 /* This file has been automatically generated by crc64_tablegen.c. */
 
-#include <inttypes.h>
-
 const uint64_t lzma_crc64_table[4][256] = {
        {
                UINT64_C(0x0000000000000000), UINT64_C(0xB32E4CBE03A75F6F), 
index 0f1005f..4b35ac1 100644 (file)
@@ -31,7 +31,6 @@ main()
 
        printf("/* This file has been automatically generated by "
                        "crc64_tablegen.c. */\n\n"
-                       "#include <inttypes.h>\n\n"
                        "const uint64_t lzma_crc64_table[4][256] = {\n\t{");
 
        for (size_t s = 0; s < 4; ++s) {
index 89afac9..f6a7564 100644 (file)
@@ -29,7 +29,6 @@ extern int errno;
 #endif
 
 #include <sys/stat.h>
-#include <limits.h>
 #include <signal.h>
 #include <pthread.h>
 #include <locale.h>