From: Dale Weiler Date: Sun, 29 Apr 2012 16:09:30 +0000 (-0400) Subject: 64bit signed/unsigned integer support from the compiler if LONG_MAX != 0x7FFFFFFF X-Git-Tag: 0.1-rc1~548^2~1 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=5d64001c3630162f5d28f7c2081218d85fae4e74;p=xonotic%2Fgmqcc.git 64bit signed/unsigned integer support from the compiler if LONG_MAX != 0x7FFFFFFF --- diff --git a/gmqcc.h b/gmqcc.h index fc92d13..e0ae695 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -119,9 +119,25 @@ typedef long int32_t; typedef unsigned long uint32_t; - /* bail on 64 bit type! */ - typedef char int64_t; - typedef char uint64_t; + /* + * It's nearly impossible to figure out a 64bit type at + * this point without making assumptions about the build + * enviroment. So if clang or gcc is detected use some + * compiler builtins to create a 64 signed and unsigned + * type. + */ +# if defined(__GNUC__) || defined (__CLANG__) + typedef int int64_t __attribute__((__mode__(__DI__))); + typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); +# else + /* + * Incoorectly size the types so static assertions below will + * fail. There is no valid way to get a 64bit type at this point + * without making assumptions of too many things. + */ + typedef char int64_t; + typedef char uint64_t; +# endif #endif #ifdef _LP64 /* long pointer == 64 */ typedef unsigned long uintptr_t;