Lua TeamLua 5.3.0-rc348416b811 years agoHistory
735 lines · 19.8 KB · C
RawDownload
/*** $Id: luaconf.h,v 1.238 2014/12/29 13:27:55 roberto Exp $** Configuration file for Lua** See Copyright Notice in lua.h*/  #ifndef luaconf_h#define luaconf_h #include <limits.h>#include <stddef.h>  /*** ===================================================================** Search for "@@" to find all configurable definitions.** ===================================================================*/  /*** {====================================================================** System Configuration: macros to adapt (if needed) Lua to some** particular platform, for instance compiling it with 32-bit numbers or** restricting it to C89.** =====================================================================*/ /*@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You** can also define LUA_32BITS in the make file, but changing here you** ensure that all software connected to Lua will be compiled with the** same configuration.*//* #define LUA_32BITS */  /*@@ LUA_USE_C89 controls the use of non-ISO-C89 features.** Define it if you want Lua to avoid the use of a few C99 features** or Windows-specific features on Windows.*//* #define LUA_USE_C89 */  /*** By default, Lua on Windows use (some) specific Windows features*/#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE)#define LUA_USE_WINDOWS  /* enable goodies for regular Windows */#endif  #if defined(LUA_USE_WINDOWS)#define LUA_DL_DLL	/* enable support for DLL */#define LUA_USE_C89	/* broadly, Windows is C89 */#endif  #if defined(LUA_USE_LINUX)#define LUA_USE_POSIX#define LUA_USE_DLOPEN		/* needs an extra library: -ldl */#define LUA_USE_READLINE	/* needs some extra libraries */#endif  #if defined(LUA_USE_MACOSX)#define LUA_USE_POSIX#define LUA_USE_DLOPEN		/* MacOS does not need -ldl */#define LUA_USE_READLINE	/* needs an extra library: -lreadline */#endif  /*@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for** C89 ('long' and 'double'); Windows always has '__int64', so it does** not need to use this case.*/#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)#define LUA_C89_NUMBERS#endif   /*@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'.*//* avoid undefined shifts */#if ((INT_MAX >> 15) >> 15) >= 1#define LUAI_BITSINT	32#else/* 'int' always must have at least 16 bits */#define LUAI_BITSINT	16#endif  /*@@ LUA_INT_INT / LUA_INT_LONG / LUA_INT_LONGLONG defines the type for** Lua integers.@@ LUA_REAL_FLOAT / LUA_REAL_DOUBLE / LUA_REAL_LONGDOUBLE defines** the type for Lua floats.** Lua should work fine with any mix of these options (if supported** by your C compiler). The usual configurations are 64-bit integers** and 'double' (the default), 32-bit integers and 'float' (for** restricted platforms), and 'long'/'double' (for C compilers not** compliant with C99, which may not have support for 'long long').*/ #if defined(LUA_32BITS)		/* { *//*** 32-bit integers and 'float'*/#if LUAI_BITSINT >= 32  /* use 'int' if big enough */#define LUA_INT_INT#else  /* otherwise use 'long' */#define LUA_INT_LONG#endif#define LUA_REAL_FLOAT #elif defined(LUA_C89_NUMBERS)	/* }{ *//*** largest types available for C89 ('long' and 'double')*/#define LUA_INT_LONG#define LUA_REAL_DOUBLE #else				/* }{ *//*** default configuration for 64-bit Lua ('long long' and 'double')*/#define LUA_INT_LONGLONG#define LUA_REAL_DOUBLE #endif								/* } */ /* }================================================================== */    /*** {==================================================================** Configuration for Paths.** ===================================================================*/ /*@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for** Lua libraries.@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for** C libraries.** CHANGE them if your machine has a non-conventional directory** hierarchy or if you want to install your libraries in** non-conventional directories.*/#define LUA_VDIR	LUA_VERSION_MAJOR "." LUA_VERSION_MINOR#if defined(_WIN32) 	/* { *//*** In Windows, any exclamation mark ('!') in the path is replaced by the** path of the directory of the executable file of the current process.*/#define LUA_LDIR	"!\\lua\\"#define LUA_CDIR	"!\\"#define LUA_SHRDIR	"!\\..\\share\\lua\\" LUA_VDIR "\\"#define LUA_PATH_DEFAULT  \		LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \		LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua;" \		LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \		".\\?.lua;" ".\\?\\init.lua"#define LUA_CPATH_DEFAULT \		LUA_CDIR"?.dll;" \		LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \		LUA_CDIR"loadall.dll;" ".\\?.dll" #else			/* }{ */ #define LUA_ROOT	"/usr/local/"#define LUA_LDIR	LUA_ROOT "share/lua/" LUA_VDIR "/"#define LUA_CDIR	LUA_ROOT "lib/lua/" LUA_VDIR "/"#define LUA_PATH_DEFAULT  \		LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \		LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua;" \		"./?.lua;" "./?/init.lua"#define LUA_CPATH_DEFAULT \		LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"#endif			/* } */  /*@@ LUA_DIRSEP is the directory separator (for submodules).** CHANGE it if your machine does not use "/" as the directory separator** and is not Windows. (On Windows Lua automatically uses "\".)*/#if defined(_WIN32)#define LUA_DIRSEP	"\\"#else#define LUA_DIRSEP	"/"#endif /* }================================================================== */  /*** {==================================================================** Marks for exported symbols in the C code** ===================================================================*/ /*@@ LUA_API is a mark for all core API functions.@@ LUALIB_API is a mark for all auxiliary library functions.@@ LUAMOD_API is a mark for all standard library opening functions.** CHANGE them if you need to define those functions in some special way.** For instance, if you want to create one Windows DLL with the core and** the libraries, you may want to use the following definition (define** LUA_BUILD_AS_DLL to get it).*/#if defined(LUA_BUILD_AS_DLL)	/* { */ #if defined(LUA_CORE) || defined(LUA_LIB)	/* { */#define LUA_API __declspec(dllexport)#else						/* }{ */#define LUA_API __declspec(dllimport)#endif						/* } */ #else				/* }{ */ #define LUA_API		extern #endif				/* } */  /* more often than not the libs go together with the core */#define LUALIB_API	LUA_API#define LUAMOD_API	LUALIB_API  /*@@ LUAI_FUNC is a mark for all extern functions that are not to be** exported to outside modules.@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables** that are not to be exported to outside modules (LUAI_DDEF for** definitions and LUAI_DDEC for declarations).** CHANGE them if you need to mark them in some special way. Elf/gcc** (versions 3.2 and later) mark them as "hidden" to optimize access** when Lua is compiled as a shared library. Not all elf targets support** this attribute. Unfortunately, gcc does not offer a way to check** whether the target offers that support, and those without support** give a warning about it. To avoid these warnings, change to the** default definition.*/#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \    defined(__ELF__)		/* { */#define LUAI_FUNC	__attribute__((visibility("hidden"))) extern#else				/* }{ */#define LUAI_FUNC	extern#endif				/* } */ #define LUAI_DDEC	LUAI_FUNC#define LUAI_DDEF	/* empty */ /* }================================================================== */  /*** {==================================================================** Compatibility with previous versions** ===================================================================*/ /*@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2.@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1.** You can define it to get all options, or change specific options** to fit your specific needs.*/#if defined(LUA_COMPAT_5_2)	/* { */ /*@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated** functions in the mathematical library.*/#define LUA_COMPAT_MATHLIB /*@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'.*/#define LUA_COMPAT_BITLIB /*@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod.*/#define LUA_COMPAT_IPAIRS /*@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for** manipulating other integer types (lua_pushunsigned, lua_tounsigned,** luaL_checkint, luaL_checklong, etc.)*/#define LUA_COMPAT_APIINTCASTS  /*@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a@@ a float mark ('.0').** This macro is not on by default even in compatibility mode,** because this is not really an incompatibility.*//* #define LUA_COMPAT_FLOATSTRING */ #endif				/* } */  #if defined(LUA_COMPAT_5_1)	/* { */ /*@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'.** You can replace it with 'table.unpack'.*/#define LUA_COMPAT_UNPACK /*@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'.** You can replace it with 'package.searchers'.*/#define LUA_COMPAT_LOADERS /*@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall.** You can call your C function directly (with light C functions).*/#define lua_cpcall(L,f,u)  \	(lua_pushcfunction(L, (f)), \	 lua_pushlightuserdata(L,(u)), \	 lua_pcall(L,1,0,0))  /*@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.** You can rewrite 'log10(x)' as 'log(x, 10)'.*/#define LUA_COMPAT_LOG10 /*@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base** library. You can rewrite 'loadstring(s)' as 'load(s)'.*/#define LUA_COMPAT_LOADSTRING /*@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library.*/#define LUA_COMPAT_MAXN /*@@ The following macros supply trivial compatibility for some** changes in the API. The macros themselves document how to** change your code to avoid using them.*/#define lua_strlen(L,i)		lua_rawlen(L, (i)) #define lua_objlen(L,i)		lua_rawlen(L, (i)) #define lua_equal(L,idx1,idx2)		lua_compare(L,(idx1),(idx2),LUA_OPEQ)#define lua_lessthan(L,idx1,idx2)	lua_compare(L,(idx1),(idx2),LUA_OPLT) /*@@ LUA_COMPAT_MODULE controls compatibility with previous** module functions 'module' (Lua) and 'luaL_register' (C).*/#define LUA_COMPAT_MODULE #endif				/* } */ /* }================================================================== */   /*** {==================================================================** Configuration for Numbers.** Change these definitions if no predefined LUA_REAL_* / LUA_INT_*** satisfy your needs.** ===================================================================*/ /*@@ LUA_NUMBER is the floating-point type used by Lua.**@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'@@ over a floating number.**@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats.@@ LUA_NUMBER_FMT is the format for writing floats.@@ lua_number2str converts a float to a string.**@@ l_mathop allows the addition of an 'l' or 'f' to all math operations.**@@ lua_str2number converts a decimal numeric string to a number.*/ #if defined(LUA_REAL_FLOAT)		/* { single float */ #define LUA_NUMBER	float #define LUAI_UACNUMBER	double #define LUA_NUMBER_FRMLEN	""#define LUA_NUMBER_FMT		"%.7g" #define l_mathop(op)		op##f #define lua_str2number(s,p)	strtof((s), (p))  #elif defined(LUA_REAL_LONGDOUBLE)	/* }{ long double */ #define LUA_NUMBER	long double #define LUAI_UACNUMBER	long double #define LUA_NUMBER_FRMLEN	"L"#define LUA_NUMBER_FMT		"%.19Lg" #define l_mathop(op)		op##l #define lua_str2number(s,p)	strtold((s), (p)) #elif defined(LUA_REAL_DOUBLE)		/* }{ double */ #define LUA_NUMBER	double #define LUAI_UACNUMBER	double #define LUA_NUMBER_FRMLEN	""#define LUA_NUMBER_FMT		"%.14g" #define l_mathop(op)		op #define lua_str2number(s,p)	strtod((s), (p)) #else					/* }{ */ #error "numeric real type not defined" #endif					/* } */  #define l_floor(x)		(l_mathop(floor)(x)) #define lua_number2str(s,n)	sprintf((s), LUA_NUMBER_FMT, (n))  /*@@ lua_numbertointeger converts a float number to an integer, or** returns 0 if float is not within the range of a lua_Integer.** (The range comparisons are tricky because of rounding. The tests** here assume a two-complement representation, where MININTEGER always** has an exact representation as a float; MAXINTEGER may not have one,** and therefore its conversion to float may have an ill-defined value.)*/#define lua_numbertointeger(n,p) \  ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \   (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \      (*(p) = (LUA_INTEGER)(n), 1))  /*@@ The luai_num* macros define the primitive operations over numbers.** They should work for any size of floating numbers.*/ /* the following operations need the math library */#if defined(lobject_c) || defined(lvm_c)#include <math.h> /* floor division (defined as 'floor(a/b)') */#define luai_numidiv(L,a,b)	((void)L, l_mathop(floor)(luai_numdiv(L,a,b))) /*** module: defined as 'a - floor(a/b)*b'; the previous definition gives** NaN when 'b' is huge, but the result should be 'a'. 'fmod' gives the** result of 'a - trunc(a/b)*b', and therefore must be corrected when** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a** non-integer negative result, which is equivalent to the test below*/#define luai_nummod(L,a,b,m)  \  { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); } /* exponentiation */#define luai_numpow(L,a,b)	((void)L, l_mathop(pow)(a,b)) #endif /* these are quite standard operations */#if defined(LUA_CORE)#define luai_numadd(L,a,b)	((a)+(b))#define luai_numsub(L,a,b)	((a)-(b))#define luai_nummul(L,a,b)	((a)*(b))

Lines 1–500 of 735.