Fix some warnings. Hopefully fix bullet plugin.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5287 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2018-08-04 19:00:19 +00:00
parent aede46c776
commit 98b71860ed
33 changed files with 439 additions and 264 deletions

View file

@ -1,7 +1,13 @@
#Note: this file was made primarily to support msvc and its project file incompatibilities nightmare. #Note: this file was made primarily to support msvc and its project file incompatibilities nightmare.
#Its also useful for various other IDEs like QtCreator etc.
#It uses system libraries, so it will have dependancy issues with public releases where those dependancies are distro/version-specific.
#Public builds are still built using the (overcomplicated) traditional (g)makefile.
IF(${ANDROID})
CMAKE_MINIMUM_REQUIRED(VERSION 3.9) CMAKE_MINIMUM_REQUIRED(VERSION 3.6) #special dispensation for android crap.
ELSE()
CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
ENDIF()
PROJECT(fteqw) PROJECT(fteqw)
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
@ -30,14 +36,38 @@ ENDIF()
set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_C_VISIBILITY_PRESET hidden)
#use LTO where possible. reportedly requires cmake 3.9 to actually work IF(${CMAKE_VERSION} VERSION_LESS "3.9.0")
INCLUDE(CheckIPOSupported) #android studio sucks and insists on using an outdated version of cmake instead of the system version.
check_ipo_supported(RESULT result) ELSE()
IF(result) IF(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
SET(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) #use LTO where possible. reportedly requires cmake 3.9 to actually work
INCLUDE(CheckIPOSupported)
check_ipo_supported(RESULT result)
IF(result)
SET(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
ENDIF()
ENDIF()
ENDIF() ENDIF()
IF(${WIN32}) if (CMAKE_C_COMPILER_ID MATCHES "Clang")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pointer-sign")
endif()
IF(${ANDROID})
# FIND_PACKAGE(Freetype REQUIRED)
# INCLUDE_DIRECTORIES( ${FREETYPE_INCLUDE_DIRS} )
SET(FTE_DEFINES ANDROID;GLQUAKE;VKQUAKE;DYNAMIC_LIBPNG;DYNAMIC_LIBJPEG;MULTITHREAD;stricmp=strcasecmp;strnicmp=strncasecmp)
SET(FTE_LIBS android log EGL z m ${CMAKE_DL_LIBS})
SET(FTE_ARCH_FILES
engine/client/sys_droid.c
engine/common/sys_linux_threads.c
engine/client/snd_droid.c
engine/client/cd_null.c
engine/gl/gl_viddroid.c
)
ELSEIF(${WIN32})
INCLUDE_DIRECTORIES(engine/libs engine/libs/freetype2/include) INCLUDE_DIRECTORIES(engine/libs engine/libs/freetype2/include)
# LINK_DIRECTORIES(engine/libs/mingw64-libs) # LINK_DIRECTORIES(engine/libs/mingw64-libs)
@ -129,13 +159,13 @@ ELSEIF(${UNIX}) #linux(ish)
) )
ENDIF() ENDIF()
SET(FTESV_DEFINES stricmp=strcasecmp;strnicmp=strncasecmp) SET(FTESV_DEFINES MULTITHREAD;stricmp=strcasecmp;strnicmp=strncasecmp)
SET(FTESV_ARCH_FILES SET(FTESV_ARCH_FILES
engine/server/sv_sys_unix.c engine/server/sv_sys_unix.c
engine/common/sys_linux_threads.c engine/common/sys_linux_threads.c
engine/common/net_ssl_gnutls.c engine/common/net_ssl_gnutls.c
) )
SET(FTESV_LIBS z m ${CMAKE_DL_LIBS}) SET(FTESV_LIBS z m ${CMAKE_DL_LIBS} pthread)
ELSEIF(1) #SDL ELSEIF(1) #SDL
FIND_PACKAGE(Freetype REQUIRED) FIND_PACKAGE(Freetype REQUIRED)
# INCLUDE_DIRECTORIES(engine/libs engine/libs/freetype2/include) # INCLUDE_DIRECTORIES(engine/libs engine/libs/freetype2/include)
@ -318,11 +348,9 @@ SET(FTE_COMMON_FILES
engine/http/httpclient.c engine/http/httpclient.c
) )
ADD_EXECUTABLE(fteqw WIN32 #these files are only in the client
${FTE_ARCH_FILES} SET(FTE_CLIENT_FILES
${FTE_COMMON_FILES}
engine/client/cl_cam.c engine/client/cl_cam.c
engine/client/cl_cg.c engine/client/cl_cg.c
engine/client/cl_demo.c engine/client/cl_demo.c
@ -402,53 +430,73 @@ ADD_EXECUTABLE(fteqw WIN32
engine/gl/gl_screen.c engine/gl/gl_screen.c
engine/gl/gl_vidcommon.c engine/gl/gl_vidcommon.c
engine/gl/glmod_doom.c engine/gl/glmod_doom.c
engine/vk/vk_backend.c engine/vk/vk_backend.c
engine/vk/vk_init.c engine/vk/vk_init.c
) )
SET_TARGET_PROPERTIES(fteqw PROPERTIES COMPILE_DEFINITIONS "${FTE_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(fteqw ${FTE_LIBS} )
ADD_EXECUTABLE(fteqw-sv IF(${ANDROID})
${FTESV_ARCH_FILES} #android sucks. everything is a library. so we build the engine as a shared library and completely ignore dedicated servers+tools
${FTE_COMMON_FILES}
) ADD_LIBRARY(ftedroid MODULE
SET_TARGET_PROPERTIES(fteqw-sv PROPERTIES COMPILE_DEFINITIONS "SERVERONLY;${FTESV_DEFINES};${FTE_REVISON}") ${FTE_ARCH_FILES}
TARGET_LINK_LIBRARIES(fteqw-sv ${FTESV_LIBS}) ${FTE_COMMON_FILES}
${FTE_CLIENT_FILES}
)
SET_TARGET_PROPERTIES(ftedroid PROPERTIES COMPILE_DEFINITIONS "${FTE_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(ftedroid ${FTE_LIBS} )
ELSE()
#systems that actually have executables...
ADD_EXECUTABLE(fteqw WIN32
${FTE_ARCH_FILES}
${FTE_COMMON_FILES}
${FTE_CLIENT_FILES}
)
SET_TARGET_PROPERTIES(fteqw PROPERTIES COMPILE_DEFINITIONS "${FTE_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(fteqw ${FTE_LIBS} )
ADD_EXECUTABLE(fteqw-sv
${FTESV_ARCH_FILES}
${FTE_COMMON_FILES}
)
SET_TARGET_PROPERTIES(fteqw-sv PROPERTIES COMPILE_DEFINITIONS "SERVERONLY;${FTESV_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(fteqw-sv ${FTESV_LIBS})
ADD_EXECUTABLE(fteqcc ADD_EXECUTABLE(fteqcc
engine/qclib/qcctui.c engine/qclib/qcctui.c
engine/qclib/comprout.c engine/qclib/comprout.c
engine/qclib/hash.c engine/qclib/hash.c
engine/qclib/qcc_cmdlib.c engine/qclib/qcc_cmdlib.c
engine/qclib/qcc_pr_comp.c engine/qclib/qcc_pr_comp.c
engine/qclib/qcc_pr_lex.c engine/qclib/qcc_pr_lex.c
engine/qclib/qccmain.c engine/qclib/qccmain.c
engine/qclib/qcd_main.c engine/qclib/qcd_main.c
) )
TARGET_LINK_LIBRARIES(fteqcc z m) TARGET_LINK_LIBRARIES(fteqcc z m)
IF(${WIN32}) IF(${WIN32})
ADD_EXECUTABLE(fteqccgui WIN32 ADD_EXECUTABLE(fteqccgui WIN32
engine/qclib/qccgui.c engine/qclib/qccgui.c
engine/qclib/qccguistuff.c engine/qclib/qccguistuff.c
engine/qclib/comprout.c engine/qclib/comprout.c
engine/qclib/hash.c engine/qclib/hash.c
engine/qclib/qcc_cmdlib.c engine/qclib/qcc_cmdlib.c
engine/qclib/qcc_pr_comp.c engine/qclib/qcc_pr_comp.c
engine/qclib/qcc_pr_lex.c engine/qclib/qcc_pr_lex.c
engine/qclib/qccmain.c engine/qclib/qccmain.c
engine/qclib/decomp.c engine/qclib/decomp.c
engine/qclib/packager.c engine/qclib/packager.c
engine/qclib/qcd_main.c engine/qclib/qcd_main.c
) )
TARGET_LINK_LIBRARIES(fteqccgui z shlwapi ole32 comctl32 comdlg32) TARGET_LINK_LIBRARIES(fteqccgui z shlwapi ole32 comctl32 comdlg32)
ENDIF()
ENDIF() ENDIF()
#Quake Injector Alike plugin #Quake Injector Alike plugin
ADD_LIBRARY(qi MODULE ADD_LIBRARY(qi MODULE
plugins/qvm_api.c plugins/qvm_api.c
@ -460,6 +508,28 @@ ADD_LIBRARY(qi MODULE
SET_TARGET_PROPERTIES(qi PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN") SET_TARGET_PROPERTIES(qi PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN")
SET_TARGET_PROPERTIES(qi PROPERTIES PREFIX "fteplug_") SET_TARGET_PROPERTIES(qi PROPERTIES PREFIX "fteplug_")
#Bullet Physics library plugin
FIND_PACKAGE(Bullet REQUIRED)
ADD_LIBRARY(bullet MODULE
plugins/qvm_api.c
plugins/plugin.c
plugins/bullet/bulletplug.cpp
)
TARGET_INCLUDE_DIRECTORIES(bullet PUBLIC ${BULLET_INCLUDE_DIRS})
SET_TARGET_PROPERTIES(bullet PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN")
SET_TARGET_PROPERTIES(bullet PROPERTIES PREFIX "fteplug_")
#Bullet Physics library plugin
#FIND_PACKAGE(ode REQUIRED)
ADD_LIBRARY(ode MODULE
plugins/qvm_api.c
plugins/plugin.c
engine/common/com_phys_ode.c
)
TARGET_INCLUDE_DIRECTORIES(ode PUBLIC ${BULLET_INCLUDE_DIRS})
SET_TARGET_PROPERTIES(ode PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN;ODE_STATIC")
SET_TARGET_PROPERTIES(ode PROPERTIES PREFIX "fteplug_")
#EzQuake Hud port plugin #EzQuake Hud port plugin
ADD_LIBRARY(ezhud MODULE ADD_LIBRARY(ezhud MODULE
plugins/qvm_api.c plugins/qvm_api.c
@ -481,19 +551,21 @@ ADD_LIBRARY(irc MODULE
SET_TARGET_PROPERTIES(irc PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN") SET_TARGET_PROPERTIES(irc PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN")
SET_TARGET_PROPERTIES(irc PROPERTIES PREFIX "fteplug_") SET_TARGET_PROPERTIES(irc PROPERTIES PREFIX "fteplug_")
#XMPP/jabber client plugin IF(NOT ${ANDROID})
ADD_LIBRARY(xmpp MODULE #XMPP/jabber client plugin
plugins/qvm_api.c ADD_LIBRARY(xmpp MODULE
plugins/plugin.c plugins/qvm_api.c
plugins/jabber/jabberclient.c plugins/plugin.c
plugins/jabber/xml.c plugins/jabber/jabberclient.c
plugins/jabber/jingle.c plugins/jabber/xml.c
plugins/jabber/sift.c plugins/jabber/jingle.c
engine/common/sha1.c plugins/jabber/sift.c
plugins/emailnot/md5.c engine/common/sha1.c
) plugins/emailnot/md5.c
SET_TARGET_PROPERTIES(xmpp PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN") )
SET_TARGET_PROPERTIES(xmpp PROPERTIES PREFIX "fteplug_") SET_TARGET_PROPERTIES(xmpp PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN")
SET_TARGET_PROPERTIES(xmpp PROPERTIES PREFIX "fteplug_")
ENDIF()
#ffmpeg plugin #ffmpeg plugin
#cef plugin #cef plugin

View file

@ -35,6 +35,7 @@ OPUSVER=1.2.1
SPEEXVER=1.2.0 SPEEXVER=1.2.0
SPEEXDSPVER=1.2rc3 SPEEXDSPVER=1.2rc3
FREETYPEVER=2.9 FREETYPEVER=2.9
BULLETVER=2.87
#only limited forms of cross-making is supported #only limited forms of cross-making is supported
#only the following 3 are supported #only the following 3 are supported
@ -106,9 +107,11 @@ endif
ifeq ($(BITS),64) ifeq ($(BITS),64)
CC:=$(CC) -m64 CC:=$(CC) -m64
CXX:=$(CXX) -m64
endif endif
ifeq ($(BITS),32) ifeq ($(BITS),32)
CC:=$(CC) -m32 CC:=$(CC) -m32
CXX:=$(CXX) -m32
endif endif
#correct the gcc build when cross compiling #correct the gcc build when cross compiling
@ -119,6 +122,7 @@ ifneq (,$(findstring win32,$(FTE_TARGET)))
ifneq ($(shell which i586-mingw32msvc-gcc 2> /dev/null),) ifneq ($(shell which i586-mingw32msvc-gcc 2> /dev/null),)
#yup, the alternative exists (this matches the one debian has) #yup, the alternative exists (this matches the one debian has)
CC=i586-mingw32msvc-gcc CC=i586-mingw32msvc-gcc
CXX=i586-mingw32msvc-g++
AR=i586-mingw32msvc-ar AR=i586-mingw32msvc-ar
WINDRES=i586-mingw32msvc-windres WINDRES=i586-mingw32msvc-windres
STRIP=i586-mingw32msvc-strip STRIP=i586-mingw32msvc-strip
@ -128,6 +132,7 @@ ifneq (,$(findstring win32,$(FTE_TARGET)))
ifneq ($(shell which i686-w64-mingw32-gcc 2> /dev/null),) ifneq ($(shell which i686-w64-mingw32-gcc 2> /dev/null),)
#yup, the alternative exists (this matches the one debian has) #yup, the alternative exists (this matches the one debian has)
CC=i686-w64-mingw32-gcc CC=i686-w64-mingw32-gcc
CXX=i686-w64-mingw32-g++
AR=i686-w64-mingw32-ar AR=i686-w64-mingw32-ar
WINDRES=i686-w64-mingw32-windres WINDRES=i686-w64-mingw32-windres
STRIP=i686-w64-mingw32-strip STRIP=i686-w64-mingw32-strip
@ -143,6 +148,7 @@ ifneq (,$(findstring win64,$(FTE_TARGET)))
ifneq ($(shell which x86_64-w64-mingw32-gcc 2> /dev/null),) ifneq ($(shell which x86_64-w64-mingw32-gcc 2> /dev/null),)
#yup, the alternative exists (this matches the one debian has) #yup, the alternative exists (this matches the one debian has)
CC=x86_64-w64-mingw32-gcc -m64 CC=x86_64-w64-mingw32-gcc -m64
CXX=x86_64-w64-mingw32-g++ -m64
AR=x86_64-w64-mingw32-ar AR=x86_64-w64-mingw32-ar
WINDRES=x86_64-w64-mingw32-windres WINDRES=x86_64-w64-mingw32-windres
STRIP=x86_64-w64-mingw32-strip STRIP=x86_64-w64-mingw32-strip
@ -151,6 +157,7 @@ ifneq (,$(findstring win64,$(FTE_TARGET)))
ifneq ($(shell which amd64-mingw32msvc-gcc 2> /dev/null),) ifneq ($(shell which amd64-mingw32msvc-gcc 2> /dev/null),)
#yup, the alternative exists (this matches the one debian has) #yup, the alternative exists (this matches the one debian has)
CC=amd64-mingw32msvc-gcc -m64 CC=amd64-mingw32msvc-gcc -m64
CXX=amd64-mingw32msvc-g++ -m64
AR=amd64-mingw32msvc-ar AR=amd64-mingw32msvc-ar
WINDRES=amd64-mingw32msvc-windres WINDRES=amd64-mingw32msvc-windres
STRIP=amd64-mingw32msvc-strip STRIP=amd64-mingw32msvc-strip
@ -279,6 +286,7 @@ ifeq ($(FTE_TARGET),droid)
ANDROID_SCRIPT=android.bat ANDROID_SCRIPT=android.bat
#make can't cope with absolute win32 paths in dependancy files #make can't cope with absolute win32 paths in dependancy files
DEPCC= DEPCC=
DEPCXX=
ifneq ($(realpath $(TOOLCHAINPATH)),) #don't invoke cygpath when realpath returns nothing due to dodgy paths (which happens when stuff isn't set up right for the top-level makefile) ifneq ($(realpath $(TOOLCHAINPATH)),) #don't invoke cygpath when realpath returns nothing due to dodgy paths (which happens when stuff isn't set up right for the top-level makefile)
#configure hates android, with its broken default sysroot and lack of path etc #configure hates android, with its broken default sysroot and lack of path etc
@ -289,6 +297,7 @@ ifeq ($(FTE_TARGET),droid)
endif endif
CC:=$(TOOLCHAIN)gcc --sysroot="$(DROIDSYSROOT)" -DANDROID $(DROID_ABI) -fno-strict-aliasing CC:=$(TOOLCHAIN)gcc --sysroot="$(DROIDSYSROOT)" -DANDROID $(DROID_ABI) -fno-strict-aliasing
CXX:=$(TOOLCHAIN)g++ --sysroot="$(DROIDSYSROOT)" -DANDROID $(DROID_ABI) -fno-strict-aliasing
DO_LD=$(DO_ECHO) $(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack -o $@ $(LTO_LD) $(WCFLAGS) $(BRANDFLAGS) $(CFLAGS) -llog -lc -lm -lz DO_LD=$(DO_ECHO) $(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack -o $@ $(LTO_LD) $(WCFLAGS) $(BRANDFLAGS) $(CFLAGS) -llog -lc -lm -lz
LD:=$(TOOLCHAIN)ld LD:=$(TOOLCHAIN)ld
AR:=$(TOOLCHAIN)ar AR:=$(TOOLCHAIN)ar
@ -305,6 +314,7 @@ ifeq ($(FTE_TARGET),macosx)
ifeq ($(shell $(CC) -v 2>&1 | grep apple),) ifeq ($(shell $(CC) -v 2>&1 | grep apple),)
ifneq ($(shell which powerpc-apple-darwin8-gcc 2> /dev/null),) ifneq ($(shell which powerpc-apple-darwin8-gcc 2> /dev/null),)
CC=powerpc-apple-darwin8-gcc CC=powerpc-apple-darwin8-gcc
CXX=powerpc-apple-darwin8-g++
STRIP=powerpc-apple-darwin8-strip STRIP=powerpc-apple-darwin8-strip
#seems, macosx has a more limited version of strip #seems, macosx has a more limited version of strip
STRIPFLAGS= STRIPFLAGS=
@ -319,6 +329,7 @@ ifeq ($(FTE_TARGET),macosx_ppc64)
ifneq ($(shell which powerpc-apple-darwin8-gcc 2> /dev/null),) ifneq ($(shell which powerpc-apple-darwin8-gcc 2> /dev/null),)
FTE_TARGET=macosx FTE_TARGET=macosx
CC=powerpc-apple-darwin8-gcc -arch ppc64 CC=powerpc-apple-darwin8-gcc -arch ppc64
CXX=powerpc-apple-darwin8-g++ -arch ppc64
STRIP=powerpc-apple-darwin8-strip STRIP=powerpc-apple-darwin8-strip
#seems, macosx has a more limited version of strip #seems, macosx has a more limited version of strip
STRIPFLAGS= STRIPFLAGS=
@ -334,6 +345,7 @@ ifeq ($(FTE_TARGET),macosx_x86)
FTE_TARGET=macosx FTE_TARGET=macosx
# i686-apple-darwin8-gcc's default target is i386, powerpc-apple-darwin8-gcc -arch i386 just invokes i686-apple-darwin8-gcc anyway # i686-apple-darwin8-gcc's default target is i386, powerpc-apple-darwin8-gcc -arch i386 just invokes i686-apple-darwin8-gcc anyway
CC=i686-apple-darwin8-gcc CC=i686-apple-darwin8-gcc
CXX=i686-apple-darwin8-g++
STRIP=i686-apple-darwin8-strip STRIP=i686-apple-darwin8-strip
#seems, macosx has a more limited version of strip #seems, macosx has a more limited version of strip
STRIPFLAGS= STRIPFLAGS=
@ -347,6 +359,7 @@ ifeq ($(FTE_TARGET),morphos)
ifeq ($(shell $(CC) -v 2>&1 | grep morphos),) ifeq ($(shell $(CC) -v 2>&1 | grep morphos),)
ifneq ($(shell which ppc-morphos-gcc 2> /dev/null),) ifneq ($(shell which ppc-morphos-gcc 2> /dev/null),)
CC=ppc-morphos-gcc CC=ppc-morphos-gcc
CXX=ppc-morphos-g++
#morphos strip has a 'feature', it strips permissions #morphos strip has a 'feature', it strips permissions
STRIP=ppc-morphos-strip STRIP=ppc-morphos-strip
endif endif
@ -356,6 +369,7 @@ endif
ifeq ($(FTE_TARGET),dos) ifeq ($(FTE_TARGET),dos)
#at least from dos. #at least from dos.
CC=i586-pc-msdosdjgpp-gcc CC=i586-pc-msdosdjgpp-gcc
CXX=i586-pc-msdosdjgpp-g++
CFLAGS+=-DNO_ZLIB CFLAGS+=-DNO_ZLIB
endif endif
@ -363,12 +377,14 @@ endif
ifeq ($(FTE_TARGET),linux32) ifeq ($(FTE_TARGET),linux32)
FTE_TARGET=linux FTE_TARGET=linux
CC=gcc -m32 CC=gcc -m32
CXX=g++ -m32
BITS=32 BITS=32
endif endif
ifeq ($(FTE_TARGET),linuxarmhf) ifeq ($(FTE_TARGET),linuxarmhf)
#debian's armhf is armv7, but armv6 works on RPI too. #debian's armhf is armv7, but armv6 works on RPI too.
FTE_TARGET=linux FTE_TARGET=linux
CC=arm-linux-gnueabihf-gcc -marm -march=armv6 -mfpu=vfp -mfloat-abi=hard CC=arm-linux-gnueabihf-gcc -marm -march=armv6 -mfpu=vfp -mfloat-abi=hard
CXX=arm-linux-gnueabihf-g++ -marm -march=armv6 -mfpu=vfp -mfloat-abi=hard
BITS=armhf BITS=armhf
endif endif
ifeq ($(FTE_TARGET),linuxx32) ifeq ($(FTE_TARGET),linuxx32)
@ -376,11 +392,13 @@ ifeq ($(FTE_TARGET),linuxx32)
#at the current time, you will need to edit your kernel's commandline to allow this stuff to run #at the current time, you will need to edit your kernel's commandline to allow this stuff to run
FTE_TARGET=linux FTE_TARGET=linux
CC=gcc -mx32 CC=gcc -mx32
CXX=g++ -mx32
BITS=x32 BITS=x32
endif endif
ifeq ($(FTE_TARGET),linux64) ifeq ($(FTE_TARGET),linux64)
FTE_TARGET=linux FTE_TARGET=linux
CC=gcc -m64 CC=gcc -m64
CXX=g++ -m64
BITS=64 BITS=64
endif endif
ifeq ($(FTE_TARGET),cygwin) ifeq ($(FTE_TARGET),cygwin)
@ -445,6 +463,7 @@ ifeq ($(NOCOMPAT),1)
NCDIRPREFIX=nc NCDIRPREFIX=nc
endif endif
ALL_CFLAGS=$(HAVECONFIG) $(VISIBILITY_FLAGS) $(BRANDFLAGS) $(CFLAGS) $(BASE_CFLAGS) $(WCFLAGS) $(ARCH_CFLAGS) $(NCCFLAGS) -I$(ARCHLIBS) ALL_CFLAGS=$(HAVECONFIG) $(VISIBILITY_FLAGS) $(BRANDFLAGS) $(CFLAGS) $(BASE_CFLAGS) $(WCFLAGS) $(ARCH_CFLAGS) $(NCCFLAGS) -I$(ARCHLIBS)
ALL_CXXFLAGS=$(subst -Wno-pointer-sign,,$(ALL_CFLAGS))
#cheap compile-everything-in-one-unit (compile becomes preprocess only) #cheap compile-everything-in-one-unit (compile becomes preprocess only)
ifneq ($(WPO),) ifneq ($(WPO),)
@ -463,6 +482,7 @@ endif
DO_ECHO=@ DO_ECHO=@
#DO_ECHO= #DO_ECHO=
DO_CC=$(DO_ECHO) $(CC) $(LTO_CC) $(ALL_CFLAGS) -o $@ -c $< DO_CC=$(DO_ECHO) $(CC) $(LTO_CC) $(ALL_CFLAGS) -o $@ -c $<
DO_CXX=$(DO_ECHO) $(CXX) $(LTO_CC) $(ALL_CXXFLAGS) -o $@ -c $<
ifeq ($(FTE_TARGET),vc) ifeq ($(FTE_TARGET),vc)
BASELDFLAGS= BASELDFLAGS=
@ -829,6 +849,12 @@ ifeq (1,$(USE_BOTLIB))
l_struct.o l_struct.o
endif endif
COMMONLIBFLAGS=
COMMONLDDEPS=
CLIENTLIBFLAGS=$(COMMONLIBFLAGS) $(LIBOPUS_STATIC) $(LIBSPEEX_STATIC) $(OGGVORBISFILE_STATIC) $(LIBFREETYPE_STATIC)
SERVERLIBFLAGS=$(COMMONLIBFLAGS)
CLIENTLDDEPS=$(COMMONLDDEPS) $(LIBOPUS_LDFLAGS) $(LIBSPEEX_LDFLAGS) $(OGGVORBISLDFLAGS) $(LIBFREETYPE_LDFLAGS)
SERVERLDDEPS=$(COMMONLDDEPS)
ifeq (1,$(USE_OPUS)) ifeq (1,$(USE_OPUS))
LIBOPUS_STATIC=-DOPUS_STATIC LIBOPUS_STATIC=-DOPUS_STATIC
LIBOPUS_LDFLAGS=-lopus LIBOPUS_LDFLAGS=-lopus
@ -851,15 +877,12 @@ ifeq (1,$(USE_FREETYPE))
endif endif
ifeq (1,$(strip $(INTERNAL_BULLET))) ifeq (1,$(strip $(INTERNAL_BULLET)))
COMMON_OBJS+=com_phys_bullet.o COMMON_OBJS+=com_phys_bullet.o
ALL_CFLAGS+=-I/usr/include/bullet -I$(ARCHLIBS)/bullet3-$(BULLETVER)/src
COMMONLDDEPS+=-lBulletDynamics -lBulletCollision -lLinearMath
LDCC=$(CXX)
MAKELIBS+=libs-$(ARCH)/libBulletDynamics.a
endif endif
COMMONLIBFLAGS=
CLIENTLIBFLAGS=$(COMMONLIBFLAGS) $(LIBOPUS_STATIC) $(LIBSPEEX_STATIC) $(OGGVORBISFILE_STATIC) $(LIBFREETYPE_STATIC)
SERVERLIBFLAGS=$(COMMONLIBFLAGS)
COMMONLDDEPS=
CLIENTLDDEPS=$(COMMONLDDEPS) $(LIBOPUS_LDFLAGS) $(LIBSPEEX_LDFLAGS) $(OGGVORBISLDFLAGS) $(LIBFREETYPE_LDFLAGS)
SERVERLDDEPS=$(COMMONLDDEPS)
#the defaults for sdl come first #the defaults for sdl come first
#CC_MACHINE:=$(shell $(CC) -dumpmachine) #CC_MACHINE:=$(shell $(CC) -dumpmachine)
ifeq ($(FTE_TARGET),SDL2) ifeq ($(FTE_TARGET),SDL2)
@ -941,28 +964,33 @@ ifeq ($(FTE_TARGET),nacl)
endif endif
CC= CC=
CXX=
STRIP= STRIP=
NACLLIBC=glibc NACLLIBC=glibc
ifeq ($(NARCH),x86_32) ifeq ($(NARCH),x86_32)
CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-gcc -DNACL -m32 CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-gcc -DNACL -m32
CXX=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-g++ -DNACL -m32
STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-strip STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-strip
BITS= BITS=
NACLLIBS=$(NACLLIBC)_x86_32/Release NACLLIBS=$(NACLLIBC)_x86_32/Release
endif endif
ifeq ($(NARCH),x86_64) ifeq ($(NARCH),x86_64)
CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-gcc -DNACL -m64 CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-gcc -DNACL -m64
CXX=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-g++ -DNACL -m64
STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-strip STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_x86_$(NACLLIBC)/bin/i686-nacl-strip
BITS= BITS=
NACLLIBS=$(NACLLIBC)_x86_64/Release NACLLIBS=$(NACLLIBC)_x86_64/Release
endif endif
ifeq ($(NARCH),arm) ifeq ($(NARCH),arm)
CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_arm_$(NACLLIBC)/bin/arm-nacl-gcc -DNACL CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_arm_$(NACLLIBC)/bin/arm-nacl-gcc -DNACL
CXX=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_arm_$(NACLLIBC)/bin/arm-nacl-g++ -DNACL
STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_arm_$(NACLLIBC)/bin/arm-nacl-strip STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_arm_$(NACLLIBC)/bin/arm-nacl-strip
BITS= BITS=
NACLLIBS=$(NACLLIBC)_arm/Release NACLLIBS=$(NACLLIBC)_arm/Release
endif endif
ifeq ($(NARCH),pnacl) ifeq ($(NARCH),pnacl)
CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_pnacl/bin/pnacl-clang -DNACL CC=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_pnacl/bin/pnacl-clang -DNACL
CXX=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_pnacl/bin/pnacl-clang++ -DNACL
STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_pnacl/bin/pnacl-strip STRIP=$(NACL_SDK_ROOT)/toolchain/$(MYOS)_pnacl/bin/pnacl-strip
STRIPFLAGS= STRIPFLAGS=
BITS= BITS=
@ -1121,6 +1149,7 @@ ifeq ($(FTE_TARGET),vc)
EXEPOSTFIX=.exe EXEPOSTFIX=.exe
CC=PATH="C:\Program Files (x86)\$(MSVCDIR)\Common7\IDE" "$(MSVCPATH)cl" $(SDKINC) $(MSVCINC) -D_CRT_SECURE_NO_WARNINGS CC=PATH="C:\Program Files (x86)\$(MSVCDIR)\Common7\IDE" "$(MSVCPATH)cl" $(SDKINC) $(MSVCINC) -D_CRT_SECURE_NO_WARNINGS
CXX=PATH="C:\Program Files (x86)\$(MSVCDIR)\Common7\IDE" "$(MSVCPATH)cl" $(SDKINC) $(MSVCINC) -D_CRT_SECURE_NO_WARNINGS
DEBUG_CFLAGS ?= -Od $(CPUOPTIMIZATIONS) /fp:fast DEBUG_CFLAGS ?= -Od $(CPUOPTIMIZATIONS) /fp:fast
PROFILE_CFLAGS = -O2 -Ot -Ox -GL $(CPUOPTIMISATIONS) /fp:fast PROFILE_CFLAGS = -O2 -Ot -Ox -GL $(CPUOPTIMISATIONS) /fp:fast
PROFILE_LDFLAGS = /LTCG:PGINSTRUMENT PROFILE_LDFLAGS = /LTCG:PGINSTRUMENT
@ -1129,9 +1158,11 @@ ifeq ($(FTE_TARGET),vc)
# /LTCG:PGOPTIMIZE # /LTCG:PGOPTIMIZE
DO_CC=$(DO_ECHO) $(CC) /nologo $(ALL_CFLAGS) -Fo$(shell cygpath -m $@) -c $(shell cygpath -m $<) DO_CC=$(DO_ECHO) $(CC) /nologo $(ALL_CFLAGS) -Fo$(shell cygpath -m $@) -c $(shell cygpath -m $<)
DO_CXX=$(DO_ECHO) $(CXX) /nologo $(ALL_CFLAGS) -Fo$(shell cygpath -m $@) -c $(shell cygpath -m $<)
DO_LD=$(DO_ECHO) PATH="C:\Program Files (x86)\$(MSVCDIR)\Common7\IDE" "$(MSVCPATH)link" /nologo /out:"$(shell cygpath -m $@)" /nodefaultlib:libc.lib /LARGEADDRESSAWARE /nodefaultlib:MSVCRT $(MSVCLIB) $(SDKLIB) /manifest:no /OPT:REF wsock32.lib user32.lib kernel32.lib advapi32.lib winmm.lib libs/zlib$(BITS).lib shell32.lib DO_LD=$(DO_ECHO) PATH="C:\Program Files (x86)\$(MSVCDIR)\Common7\IDE" "$(MSVCPATH)link" /nologo /out:"$(shell cygpath -m $@)" /nodefaultlib:libc.lib /LARGEADDRESSAWARE /nodefaultlib:MSVCRT $(MSVCLIB) $(SDKLIB) /manifest:no /OPT:REF wsock32.lib user32.lib kernel32.lib advapi32.lib winmm.lib libs/zlib$(BITS).lib shell32.lib
PRECOMPHEADERS = PRECOMPHEADERS =
DEPCC= DEPCC=
DEPCXX=
LIBS_DIR=./libs/ LIBS_DIR=./libs/
@ -1372,6 +1403,7 @@ ifneq (,$(findstring rpi,$(FTE_TARGET)))
#These next two lines enable cross compiling. If you're compiling natively you can just kill the two. #These next two lines enable cross compiling. If you're compiling natively you can just kill the two.
RPI_SYSROOT:=$(realpath $(shell echo ~)/rpi/rpi-sysroot/) RPI_SYSROOT:=$(realpath $(shell echo ~)/rpi/rpi-sysroot/)
CC=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$(RPI_SYSROOT) CC=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$(RPI_SYSROOT)
CXX=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++ --sysroot=$(RPI_SYSROOT)
SDLCONFIG=$(RPI_SYSROOT)/usr/bin/sdl-config --prefix=$(RPI_SYSROOT)/usr SDLCONFIG=$(RPI_SYSROOT)/usr/bin/sdl-config --prefix=$(RPI_SYSROOT)/usr
GL_CFLAGS+= -I$(RPI_SYSROOT)/opt/vc/include -I$(RPI_SYSROOT)/opt/vc/include/interface/vmcs_host/linux -I$(RPI_SYSROOT)/opt/vc/include/interface/vcos/pthreads -DFTE_RPI -DUSE_EGL GL_CFLAGS+= -I$(RPI_SYSROOT)/opt/vc/include -I$(RPI_SYSROOT)/opt/vc/include/interface/vmcs_host/linux -I$(RPI_SYSROOT)/opt/vc/include/interface/vcos/pthreads -DFTE_RPI -DUSE_EGL
GL_LDFLAGS+= -L$(RPI_SYSROOT)/opt/vc/lib -Wl,--sysroot=$(RPI_SYSROOT),-rpath=/opt/vc/lib,-rpath-link=$(RPI_SYSROOT)/opt/vc/lib -lbcm_host GL_LDFLAGS+= -L$(RPI_SYSROOT)/opt/vc/lib -Wl,--sysroot=$(RPI_SYSROOT),-rpath=/opt/vc/lib,-rpath-link=$(RPI_SYSROOT)/opt/vc/lib -lbcm_host
@ -1544,6 +1576,7 @@ ifeq ($(FTE_TARGET),web)
# RELEASE_LDFLAGS=-s ASM_JS=0 -O1 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS) # RELEASE_LDFLAGS=-s ASM_JS=0 -O1 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS)
DEBUG_LDFLAGS=-O0 -g4 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS) -s SAFE_HEAP=1 -s ALIASING_FUNCTION_POINTERS=0 -s ASSERTIONS=2 DEBUG_LDFLAGS=-O0 -g4 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS) -s SAFE_HEAP=1 -s ALIASING_FUNCTION_POINTERS=0 -s ASSERTIONS=2
CC?=emcc CC?=emcc
CXX?=emcc
#BASELDFLAGS= #BASELDFLAGS=
PRECOMPHEADERS= PRECOMPHEADERS=
@ -1574,10 +1607,12 @@ ifeq ($(FTE_TARGET),web)
BOTLIB_CFLAGS= BOTLIB_CFLAGS=
#generate deps properly #generate deps properly
#DEPCC= #DEPCC=
#DEPCXX=
endif endif
SV_DIR?=sv_sdl SV_DIR?=sv_sdl
DEPCC?=$(CC) DEPCC?=$(CC)
DEPCXX?=$(CXX)
ARCH:=$(ARCH) ARCH:=$(ARCH)
BASELDFLAGS:=-L$(ARCHLIBS) $(BASELDFLAGS) BASELDFLAGS:=-L$(ARCHLIBS) $(BASELDFLAGS)
@ -1648,24 +1683,24 @@ endif
$(DO_CC) -I$(OUT_DIR) $(DO_CC) -I$(OUT_DIR)
$(OUT_DIR)/%.o $(OUT_DIR)/%.d : %.cpp $(OUT_DIR)/%.o $(OUT_DIR)/%.d : %.cpp
ifneq ($(DEPCC),) ifneq ($(DEPCXX),)
@-set -e; rm -f $@.d; \ @-set -e; rm -f $@.d; \
$(DEPCC) -MM $(ALL_CFLAGS) $< > $@.d.$$$$; \ $(DEPCXX) -MM $(ALL_CXXFLAGS) $< > $@.d.$$$$; \
sed 's,\($*\)\.o[ :]*,$@ $@.d : ,g' < $@.d.$$$$ > $@.d; \ sed 's,\($*\)\.o[ :]*,$@ $@.d : ,g' < $@.d.$$$$ > $@.d; \
sed -e 's/.*://' -e 's/\\$$//' < $@.d.$$$$ | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.d; \ sed -e 's/.*://' -e 's/\\$$//' < $@.d.$$$$ | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.d; \
rm -f $@.d.$$$$ rm -f $@.d.$$$$
endif endif
$(DO_CC) -I$(OUT_DIR) $(DO_CXX) -I$(OUT_DIR)
$(OUT_DIR)/%.o $(OUT_DIR)/%.d : %.cxx $(OUT_DIR)/%.o $(OUT_DIR)/%.d : %.cxx
ifneq ($(DEPCC),) ifneq ($(DEPCXX),)
@-set -e; rm -f $@.d; \ @-set -e; rm -f $@.d; \
$(DEPCC) -MM $(ALL_CFLAGS) $< > $@.d.$$$$; \ $(DEPCXX) -MM $(ALL_CXXFLAGS) $< > $@.d.$$$$; \
sed 's,\($*\)\.o[ :]*,$@ $@.d : ,g' < $@.d.$$$$ > $@.d; \ sed 's,\($*\)\.o[ :]*,$@ $@.d : ,g' < $@.d.$$$$ > $@.d; \
sed -e 's/.*://' -e 's/\\$$//' < $@.d.$$$$ | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.d; \ sed -e 's/.*://' -e 's/\\$$//' < $@.d.$$$$ | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.d; \
rm -f $@.d.$$$$ rm -f $@.d.$$$$
endif endif
$(DO_CC) -I$(OUT_DIR) $(DO_CXX) -I$(OUT_DIR)
$(OUT_DIR)/%.oo $(OUT_DIR)/%.d : %.c $(OUT_DIR)/%.oo $(OUT_DIR)/%.d : %.c
ifneq ($(DEPCC),) ifneq ($(DEPCC),)
@ -1696,7 +1731,8 @@ PRECOMPHEADERS ?= $(OUT_DIR)/quakedef.h.gch
#god knows how gcc loads the list properly. #god knows how gcc loads the list properly.
#or at least I hope he does. It makes no sence to mortals. #or at least I hope he does. It makes no sence to mortals.
DO_LD ?= $(DO_ECHO) $(CC) -o $@ $(LTO_LD) $(WCFLAGS) $(BRANDFLAGS) $(CFLAGS) LDCC ?=$(CC)
DO_LD ?= $(DO_ECHO) $(LDCC) -o $@ $(LTO_LD) $(WCFLAGS) $(BRANDFLAGS) $(CFLAGS)
$(OUT_DIR)/$(EXE_NAME): $(PRECOMPHEADERS) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS), $($(ol))),$(if $(findstring ltox,$(fn)),,$(OUT_DIR)/$(fn))) $(OUT_DIR)/$(EXE_NAME): $(PRECOMPHEADERS) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS), $($(ol))),$(if $(findstring ltox,$(fn)),,$(OUT_DIR)/$(fn)))
$(DO_LD) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS) $(LTO_END), $($(ol))),$(if $(findstring ltox,$(fn)),$(subst ltox,-x ,$(fn)),$(NATIVE_OUT_DIR)/$(fn)) ) $(LDFLAGS) $(DO_LD) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS) $(LTO_END), $($(ol))),$(if $(findstring ltox,$(fn)),$(subst ltox,-x ,$(fn)),$(NATIVE_OUT_DIR)/$(fn)) ) $(LDFLAGS)
@ -2152,7 +2188,11 @@ libs-$(ARCH)/libfreetype.a:
test -f freetype-$(FREETYPEVER).tar.gz || wget https://download.savannah.gnu.org/releases/freetype/freetype-$(FREETYPEVER).tar.gz test -f freetype-$(FREETYPEVER).tar.gz || wget https://download.savannah.gnu.org/releases/freetype/freetype-$(FREETYPEVER).tar.gz
-test -f libs-$(ARCH)/libfreetype.a || (mkdir -p libs-$(ARCH) && cd libs-$(ARCH) && tar -xvzf ../freetype-$(FREETYPEVER).tar.gz && cd freetype-$(FREETYPEVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure $(CONFIGARGS) && $(TOOLOVERRIDES) $(MAKE) && cp objs/.libs/libfreetype.a ../ && cp -r include/ ../) -test -f libs-$(ARCH)/libfreetype.a || (mkdir -p libs-$(ARCH) && cd libs-$(ARCH) && tar -xvzf ../freetype-$(FREETYPEVER).tar.gz && cd freetype-$(FREETYPEVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure $(CONFIGARGS) && $(TOOLOVERRIDES) $(MAKE) && cp objs/.libs/libfreetype.a ../ && cp -r include/ ../)
makelibs: libs-$(ARCH)/libjpeg.a libs-$(ARCH)/libz.a libs-$(ARCH)/libpng.a libs-$(ARCH)/libogg.a libs-$(ARCH)/libvorbis.a libs-$(ARCH)/libopus.a libs-$(ARCH)/libspeex.a libs-$(ARCH)/libspeexdsp.a libs-$(ARCH)/libfreetype.a libs-$(ARCH)/libBulletDynamics.a:
test -f bullet3-$(BULLETVER).tar.gz || wget https://github.com/bulletphysics/bullet3/archive/$(BULLETVER).tar.gz
-test -f libs-$(ARCH)/libBulletDynamics.a || (mkdir -p libs-$(ARCH) && cd libs-$(ARCH) && tar -xvzf ../bullet3-$(BULLETVER).tar.gz && cd bullet3-$(BULLETVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) cmake . && $(TOOLOVERRIDES) $(MAKE) LinearMath BulletDynamics BulletCollision && cp src/LinearMath/libLinearMath.a src/BulletDynamics/libBulletDynamics.a src/BulletCollision/libBulletCollision.a src/btBulletCollisionCommon.h src/btBulletDynamicsCommon.h ..)
makelibs: libs-$(ARCH)/libjpeg.a libs-$(ARCH)/libz.a libs-$(ARCH)/libpng.a libs-$(ARCH)/libogg.a libs-$(ARCH)/libvorbis.a libs-$(ARCH)/libopus.a libs-$(ARCH)/libspeex.a libs-$(ARCH)/libspeexdsp.a libs-$(ARCH)/libfreetype.a $(MAKELIBS)
HTTP_OBJECTS=http/httpserver.c http/iwebiface.c common/fs_stdio.c http/ftpserver.c HTTP_OBJECTS=http/httpserver.c http/iwebiface.c common/fs_stdio.c http/ftpserver.c
$(RELEASE_DIR)/httpserver$(BITS): $(HTTP_OBJECTS) $(RELEASE_DIR)/httpserver$(BITS): $(HTTP_OBJECTS)

View file

@ -28,10 +28,7 @@ struct searchpathfuncs_s;
struct model_s; struct model_s;
struct font_s; struct font_s;
struct shader_s; struct shader_s;
enum slist_test_e;
enum hostcachekey_e; //obtained via calls to gethostcacheindexforkey
enum fs_relative;
enum com_tokentype_e;
#ifndef __QUAKEDEF_H__ #ifndef __QUAKEDEF_H__
#ifdef __cplusplus #ifdef __cplusplus
typedef enum {qfalse, qtrue} qboolean;//false and true are forcivly defined. typedef enum {qfalse, qtrue} qboolean;//false and true are forcivly defined.
@ -52,6 +49,15 @@ enum com_tokentype_e;
typedef uint64_t qofs_t; typedef uint64_t qofs_t;
#endif #endif
#if 1 //c++ or standard C
#include "cl_master.h"
#else
enum slist_test_e;
enum hostcachekey_e; //obtained via calls to gethostcacheindexforkey
#endif
enum fs_relative;
enum com_tokentype_e;
struct menu_inputevent_args_s struct menu_inputevent_args_s
{ {
enum { enum {
@ -166,8 +172,8 @@ typedef struct {
char *(*gethostcachestring) (struct serverinfo_s *host, enum hostcachekey_e fld); char *(*gethostcachestring) (struct serverinfo_s *host, enum hostcachekey_e fld);
float (*gethostcachenumber) (struct serverinfo_s *host, enum hostcachekey_e fld); float (*gethostcachenumber) (struct serverinfo_s *host, enum hostcachekey_e fld);
void (*resethostcachemasks) (void); void (*resethostcachemasks) (void);
void (*sethostcachemaskstring) (qboolean or, enum hostcachekey_e fld, const char *str, enum slist_test_e op); void (*sethostcachemaskstring) (qboolean or_, enum hostcachekey_e fld, const char *str, enum slist_test_e op);
void (*sethostcachemasknumber) (qboolean or, enum hostcachekey_e fld, int num, enum slist_test_e op); void (*sethostcachemasknumber) (qboolean or_, enum hostcachekey_e fld, int num, enum slist_test_e op);
void (*sethostcachesort) (enum hostcachekey_e fld, qboolean descending); void (*sethostcachesort) (enum hostcachekey_e fld, qboolean descending);
int (*resorthostcache) (void); int (*resorthostcache) (void);
void (*refreshhostcache) (qboolean fullreset); void (*refreshhostcache) (qboolean fullreset);

View file

@ -485,7 +485,7 @@ static int CL_FindHighTrack(int seat, char *rule)
; //don't block if the players have different powerups ; //don't block if the players have different powerups
else if ((cl.players[j].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_LIGHTNING)) && !(cl.players[i].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_LIGHTNING))) else if ((cl.players[j].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_LIGHTNING)) && !(cl.players[i].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_LIGHTNING)))
; //don't block the switch if the new player has a decent weapon, and the guy we're tracking does not. ; //don't block the switch if the new player has a decent weapon, and the guy we're tracking does not.
else if ((cl.players[j].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_INVULNERABILITY))==(IT_ROCKET_LAUNCHER|IT_INVULNERABILITY) && (cl.players[i].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_LIGHTNING)) != (IT_ROCKET_LAUNCHER|IT_INVULNERABILITY)) else if ((cl.players[j].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_INVULNERABILITY))==(IT_ROCKET_LAUNCHER|IT_INVULNERABILITY) && (cl.players[i].stats[STAT_ITEMS] & (IT_ROCKET_LAUNCHER|IT_INVULNERABILITY)) != (IT_ROCKET_LAUNCHER|IT_INVULNERABILITY))
; //don't block if we're switching to someone with pent+rl from someone that does not. ; //don't block if we're switching to someone with pent+rl from someone that does not.
else else
#endif #endif

View file

@ -5045,17 +5045,17 @@ done:
goto done; goto done;
} }
snprintf(loadcommand, sizeof(loadcommand), "map \"%s\"\n", shortname); Q_snprintfz(loadcommand, sizeof(loadcommand), "map \"%s\"\n", shortname);
snprintf(displayname, sizeof(displayname), "map: %s", shortname); Q_snprintfz(displayname, sizeof(displayname), "map: %s", shortname);
snprintf(qname, sizeof(qname), "maps/%s.bsp", shortname); Q_snprintfz(qname, sizeof(qname), "maps/%s.bsp", shortname);
} }
else if (f->flags & HRF_PACKAGE) else if (f->flags & HRF_PACKAGE)
{ {
char *shortname; char *shortname;
shortname = COM_SkipPath(f->fname); shortname = COM_SkipPath(f->fname);
snprintf(qname, sizeof(qname), "%s", shortname); Q_snprintfz(qname, sizeof(qname), "%s", shortname);
snprintf(loadcommand, sizeof(loadcommand), "fs_restart\n"); Q_snprintfz(loadcommand, sizeof(loadcommand), "fs_restart\n");
snprintf(displayname, sizeof(displayname), "package: %s", shortname); Q_snprintfz(displayname, sizeof(displayname), "package: %s", shortname);
} }
else if (f->flags & HRF_MANIFEST) else if (f->flags & HRF_MANIFEST)
{ {

View file

@ -1,3 +1,6 @@
#ifndef CL_MASTER_H
#define CL_MASTER_H
enum masterprotocol_e enum masterprotocol_e
{ {
MP_UNSPECIFIED, MP_UNSPECIFIED,
@ -238,9 +241,13 @@ qboolean Master_GetSortDescending(void);
int Master_NumSorted(void); int Master_NumSorted(void);
void Master_ClearMasks(void); void Master_ClearMasks(void);
serverinfo_t *Master_SortedServer(int idx); serverinfo_t *Master_SortedServer(int idx);
void Master_SetMaskString(qboolean or, hostcachekey_t field, const char *param, slist_test_t testop); void Master_SetMaskString(qboolean or_, hostcachekey_t field, const char *param, slist_test_t testop);
void Master_SetMaskInteger(qboolean or, hostcachekey_t field, int param, slist_test_t testop); void Master_SetMaskInteger(qboolean or_, hostcachekey_t field, int param, slist_test_t testop);
serverinfo_t *Master_FindRoute(netadr_t target); serverinfo_t *Master_FindRoute(netadr_t target);
#else #else
#define MasterInfo_WriteServers() #define MasterInfo_WriteServers()
#endif #endif
#endif

View file

@ -3457,7 +3457,7 @@ void CL_MasterListParse(netadrtype_t adrtype, int type, qboolean slashpad)
info->special = type; info->special = type;
info->refreshtime = 0; info->refreshtime = 0;
snprintf(info->name, sizeof(info->name), "%s (via %s)", NET_AdrToString(adr, sizeof(adr), &info->adr), madr); Q_snprintfz(info->name, sizeof(info->name), "%s (via %s)", NET_AdrToString(adr, sizeof(adr), &info->adr), madr);
info->next = last; info->next = last;
last = info; last = info;

View file

@ -2927,7 +2927,7 @@ static void P_ImportEffectInfo(char *config, char *line)
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
{ {
parenttype = ptype - part_type; parenttype = ptype - part_type;
snprintf(newname, sizeof(newname), "%i+%s", i, arg[1]); Q_snprintfz(newname, sizeof(newname), "%i+%s", i, arg[1]);
ptype = P_GetParticleType(config, newname); ptype = P_GetParticleType(config, newname);
if (!ptype->loaded) if (!ptype->loaded)
{ {

View file

@ -317,6 +317,17 @@ static cvar_t s_al_velocityscale = CVAR("s_al_velocityscale", "1");
static cvar_t s_al_static_listener = CVAR("s_al_static_listener", "0"); //cheat static cvar_t s_al_static_listener = CVAR("s_al_static_listener", "0"); //cheat
extern cvar_t snd_doppler; extern cvar_t snd_doppler;
enum distancemodel_e
{
DM_INVERSE = 0,
DM_INVERSE_CLAMPED = 1,
DM_LINEAR = 2,
DM_LINEAR_CLAMPED = 3,
DM_EXPONENT = 4,
DM_EXPONENT_CLAMPED = 5,
DM_NONE = 6
};
typedef struct typedef struct
{ {
ALuint *source; ALuint *source;
@ -873,20 +884,20 @@ static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned
if (srcrel) if (srcrel)
{ {
#ifdef FTE_TARGET_WEB #ifdef FTE_TARGET_WEB
switch(0) //emscripten omits it, and this is webaudio's default too. switch(DM_INVERSE) //emscripten omits it, and this is webaudio's default too.
#else #else
switch(s_al_distancemodel.ival) switch((enum distancemodel_e)s_al_distancemodel.ival)
#endif #endif
{ {
default: default:
case 0: case DM_INVERSE:
case 1: case DM_INVERSE_CLAMPED:
palSourcef(src, AL_ROLLOFF_FACTOR, 0); palSourcef(src, AL_ROLLOFF_FACTOR, 0);
palSourcef(src, AL_REFERENCE_DISTANCE, 1); //0 would be silent, or a division by 0 palSourcef(src, AL_REFERENCE_DISTANCE, 1); //0 would be silent, or a division by 0
palSourcef(src, AL_MAX_DISTANCE, 1); //only used for clamped mode palSourcef(src, AL_MAX_DISTANCE, 1); //only used for clamped mode
break; break;
case 2: case DM_LINEAR:
case 3: case DM_LINEAR_CLAMPED:
palSourcef(src, AL_ROLLOFF_FACTOR, 0); palSourcef(src, AL_ROLLOFF_FACTOR, 0);
palSourcef(src, AL_REFERENCE_DISTANCE, 0); //doesn't matter when rolloff is 0 palSourcef(src, AL_REFERENCE_DISTANCE, 0); //doesn't matter when rolloff is 0
palSourcef(src, AL_MAX_DISTANCE, 1); //doesn't matter, so long as its not a nan palSourcef(src, AL_MAX_DISTANCE, 1); //doesn't matter, so long as its not a nan
@ -896,20 +907,20 @@ static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned
else else
{ {
#ifdef FTE_TARGET_WEB #ifdef FTE_TARGET_WEB
switch(2) //emscripten hardcodes it. switch(DM_LINEAR) //emscripten hardcodes it in a buggy kind of way.
#else #else
switch(s_al_distancemodel.ival) switch((enum distancemodel_e)s_al_distancemodel.ival)
#endif #endif
{ {
default: default:
case 0: case DM_INVERSE:
case 1: case DM_INVERSE_CLAMPED:
palSourcef(src, AL_ROLLOFF_FACTOR, s_al_reference_distance.value); palSourcef(src, AL_ROLLOFF_FACTOR, s_al_reference_distance.value);
palSourcef(src, AL_REFERENCE_DISTANCE, 1); palSourcef(src, AL_REFERENCE_DISTANCE, 1);
palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); //clamp to the maximum distance you'd normally be allowed to hear... this is probably going to be annoying. palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); //clamp to the maximum distance you'd normally be allowed to hear... this is probably going to be annoying.
break; break;
case 2: //linear, mimic quake. case DM_LINEAR: //linear, mimic quake.
case 3: //linear clamped to further than ref distance case DM_LINEAR_CLAMPED: //linear clamped to further than ref distance
palSourcef(src, AL_ROLLOFF_FACTOR, 1); palSourcef(src, AL_ROLLOFF_FACTOR, 1);
#ifdef FTE_TARGET_WEB #ifdef FTE_TARGET_WEB
//chrome complains about 0. //chrome complains about 0.
@ -1093,45 +1104,45 @@ static void QDECL OnChangeALSettings (cvar_t *var, char *value)
if (palDistanceModel) if (palDistanceModel)
{ {
switch (s_al_distancemodel.ival) switch ((enum distancemodel_e)s_al_distancemodel.ival)
{ {
case 0: case DM_INVERSE:
//gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) ) //gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) )
palDistanceModel(AL_INVERSE_DISTANCE); palDistanceModel(AL_INVERSE_DISTANCE);
break; break;
case 1: //openal's default mode case DM_INVERSE_CLAMPED: //openal's default mode
//istance = max(distance,AL_REFERENCE_DISTANCE); //istance = max(distance,AL_REFERENCE_DISTANCE);
//distance = min(distance,AL_MAX_DISTANCE); //distance = min(distance,AL_MAX_DISTANCE);
//gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) ) //gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) )
palDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); palDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
break; break;
case 2: //most quake-like case DM_LINEAR: //most quake-like. linear
//distance = min(distance, AL_MAX_DISTANCE) // avoid negative gain //distance = min(distance, AL_MAX_DISTANCE) // avoid negative gain
//gain = ( 1 AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) / (AL_MAX_DISTANCE AL_REFERENCE_DISTANCE) ) //gain = ( 1 AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) / (AL_MAX_DISTANCE AL_REFERENCE_DISTANCE) )
palDistanceModel(AL_LINEAR_DISTANCE); palDistanceModel(AL_LINEAR_DISTANCE);
break; break;
case 3: case DM_LINEAR_CLAMPED: //linear, with near stuff clamped to further away
//distance = max(distance, AL_REFERENCE_DISTANCE) //distance = max(distance, AL_REFERENCE_DISTANCE)
//distance = min(distance, AL_MAX_DISTANCE) //distance = min(distance, AL_MAX_DISTANCE)
//gain = ( 1 AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) / (AL_MAX_DISTANCE AL_REFERENCE_DISTANCE) ) //gain = ( 1 AL_ROLLOFF_FACTOR * (distance AL_REFERENCE_DISTANCE) / (AL_MAX_DISTANCE AL_REFERENCE_DISTANCE) )
palDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); palDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
break; break;
case 4: case DM_EXPONENT:
//gain = (distance / AL_REFERENCE_DISTANCE) ^ (- AL_ROLLOFF_FACTOR) //gain = (distance / AL_REFERENCE_DISTANCE) ^ (- AL_ROLLOFF_FACTOR)
palDistanceModel(AL_EXPONENT_DISTANCE); palDistanceModel(AL_EXPONENT_DISTANCE);
break; break;
case 5: case DM_EXPONENT_CLAMPED:
//distance = max(distance, AL_REFERENCE_DISTANCE) //distance = max(distance, AL_REFERENCE_DISTANCE)
//distance = min(distance, AL_MAX_DISTANCE) //distance = min(distance, AL_MAX_DISTANCE)
//gain = (distance / AL_REFERENCE_DISTANCE) ^ (- AL_ROLLOFF_FACTOR) //gain = (distance / AL_REFERENCE_DISTANCE) ^ (- AL_ROLLOFF_FACTOR)
palDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED); palDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
break; break;
case 6: case DM_NONE:
//gain = 1 //gain = 1
palDistanceModel(AL_NONE); palDistanceModel(AL_NONE);
break; break;
default: default:
Cvar_ForceSet(&s_al_distancemodel, "0"); Cvar_ForceSet(&s_al_distancemodel, "2");
} }
} }
} }
@ -1258,7 +1269,6 @@ static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb)
{ {
/* EAX Reverb is available. Set the EAX effect type then load the /* EAX Reverb is available. Set the EAX effect type then load the
* reverb properties. */ * reverb properties. */
palEffectf(effect, AL_EAXREVERB_DENSITY, reverb->flDensity); palEffectf(effect, AL_EAXREVERB_DENSITY, reverb->flDensity);
palEffectf(effect, AL_EAXREVERB_DIFFUSION, reverb->flDiffusion); palEffectf(effect, AL_EAXREVERB_DIFFUSION, reverb->flDiffusion);
palEffectf(effect, AL_EAXREVERB_GAIN, reverb->flGain); palEffectf(effect, AL_EAXREVERB_GAIN, reverb->flGain);
@ -1284,7 +1294,9 @@ static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb)
palEffecti(effect, AL_EAXREVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit); palEffecti(effect, AL_EAXREVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit);
} }
else else
#endif
{ {
#ifdef AL_EFFECT_REVERB
/* No EAX Reverb. Set the standard reverb effect type then load the /* No EAX Reverb. Set the standard reverb effect type then load the
* available reverb properties. */ * available reverb properties. */
palEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB); palEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB);
@ -1302,8 +1314,8 @@ static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb)
palEffectf(effect, AL_REVERB_AIR_ABSORPTION_GAINHF, reverb->flAirAbsorptionGainHF); palEffectf(effect, AL_REVERB_AIR_ABSORPTION_GAINHF, reverb->flAirAbsorptionGainHF);
palEffectf(effect, AL_REVERB_ROOM_ROLLOFF_FACTOR, reverb->flRoomRolloffFactor); palEffectf(effect, AL_REVERB_ROOM_ROLLOFF_FACTOR, reverb->flRoomRolloffFactor);
palEffecti(effect, AL_REVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit); palEffecti(effect, AL_REVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit);
}
#endif #endif
}
return effect; return effect;
} }

View file

@ -3881,11 +3881,11 @@ void S_PlayVol(void)
{ {
if (!Q_strrchr(Cmd_Argv(i), '.')) if (!Q_strrchr(Cmd_Argv(i), '.'))
{ {
Q_strncpy(name, Cmd_Argv(i), sizeof(name)-4); Q_strncpyz(name, Cmd_Argv(i), sizeof(name)-4);
Q_strcat(name, ".wav"); Q_strcat(name, ".wav");
} }
else else
Q_strncpy(name, Cmd_Argv(i), sizeof(name)); Q_strncpyz(name, Cmd_Argv(i), sizeof(name));
sfx = S_PrecacheSound(name); sfx = S_PrecacheSound(name);
vol = Q_atof(Cmd_Argv(i+1)); vol = Q_atof(Cmd_Argv(i+1));
S_StartSound(0, -1, sfx, NULL, NULL, vol, 0.0, 0, 0, CF_NOSPACIALISE); S_StartSound(0, -1, sfx, NULL, NULL, vol, 0.0, 0, 0, CF_NOSPACIALISE);

View file

@ -719,7 +719,12 @@ void Cmd_Exec_f (void)
return; return;
} }
if (cl_warncmd.ival || developer.ival || cvar_watched) if (cl_warncmd.ival || developer.ival || cvar_watched)
Con_TPrintf ("execing %s\n",name); {
if (loc.search)
Con_TPrintf ("execing %s/%s\n",name, loc.search->logicalpath);
else
Con_TPrintf ("execing %s\n",name);
}
l = VFS_GETLEN(file); l = VFS_GETLEN(file);
f = BZ_Malloc(l+1); f = BZ_Malloc(l+1);

View file

@ -568,7 +568,7 @@ void Q_ftoa(char *str, float in)
sprintf(str, "%.0f", in); sprintf(str, "%.0f", in);
else else
{ {
char tstr[8]; char tstr[32];
char *lsig = str - 1; char *lsig = str - 1;
sprintf(tstr, "%%.%if", exp); sprintf(tstr, "%%.%if", exp);
sprintf(str, tstr, in); sprintf(str, tstr, in);
@ -5040,6 +5040,12 @@ void COM_Version_f (void)
#else #else
Con_DPrintf(" ^h(disabled: openal)^7"); Con_DPrintf(" ^h(disabled: openal)^7");
#endif #endif
#endif
#ifdef USE_INTERNAL_BULLET
Con_Printf(" bullet");
#endif
#ifdef ENGINE_ROUTING
Con_Printf(" routing");
#endif #endif
Con_Printf("\n"); Con_Printf("\n");
@ -5102,6 +5108,9 @@ void COM_Version_f (void)
#if defined(MENU_DAT) #if defined(MENU_DAT)
Con_Printf(" menuqc"); Con_Printf(" menuqc");
#endif #endif
#if defined(MENU_NATIVECODE)
Con_Printf(" nmenu");
#endif
#if defined(CSQC_DAT) #if defined(CSQC_DAT)
Con_Printf(" csqc"); Con_Printf(" csqc");
#endif #endif

View file

@ -141,7 +141,7 @@
#undef TEXTEDITOR //my funky text editor! its awesome! #undef TEXTEDITOR //my funky text editor! its awesome!
#undef TCPCONNECT //support for playing over tcp sockets, instead of just udp. compatible with qizmo. #undef TCPCONNECT //support for playing over tcp sockets, instead of just udp. compatible with qizmo.
#undef IRCCONNECT //lame support for routing game packets via irc server. not a good idea. #undef IRCCONNECT //lame support for routing game packets via irc server. not a good idea.
#undef PLUGINS //support for external plugins (like huds or fancy menus or whatever) #define PLUGINS //support for external plugins (like huds or fancy menus or whatever)
#undef SUPPORT_ICE //Internet Connectivity Establishment, for use by plugins to establish voice or game connections. #undef SUPPORT_ICE //Internet Connectivity Establishment, for use by plugins to establish voice or game connections.
#undef PSET_CLASSIC //support the 'classic' particle system, for that classic quake feel. #undef PSET_CLASSIC //support the 'classic' particle system, for that classic quake feel.
#undef HAVE_CDPLAYER //includes cd playback. actual cds. named/numbered tracks are supported regardless (though you need to use the 'music' command to play them without this). #undef HAVE_CDPLAYER //includes cd playback. actual cds. named/numbered tracks are supported regardless (though you need to use the 'music' command to play them without this).

View file

@ -2553,7 +2553,7 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
char pakfile[MAX_OSPATH]; char pakfile[MAX_OSPATH];
char logicalpaths[MAX_OSPATH]; //with a slash char logicalpaths[MAX_OSPATH]; //with a slash
char purefile[MAX_OSPATH]; char purefile[MAX_OSPATH];
char logicalfile[MAX_OSPATH]; char logicalfile[MAX_OSPATH*2];
unsigned int keptflags; unsigned int keptflags;
vfsfile_t *vfs; vfsfile_t *vfs;
flocation_t loc; flocation_t loc;
@ -2621,7 +2621,7 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
if (!search->handle->FindFile(search->handle, &loc, pakfile, NULL)) if (!search->handle->FindFile(search->handle, &loc, pakfile, NULL))
break; //not found.. break; //not found..
snprintf (logicalfile, sizeof(pakfile), "%spak%i.%s", logicalpaths, i, extension); snprintf (logicalfile, sizeof(logicalfile), "%spak%i.%s", logicalpaths, i, extension);
snprintf (purefile, sizeof(purefile), "%s/pak%i.%s", purepath, i, extension); snprintf (purefile, sizeof(purefile), "%s/pak%i.%s", purepath, i, extension);
for (existing = com_searchpaths; existing; existing = existing->next) for (existing = com_searchpaths; existing; existing = existing->next)

View file

@ -7777,13 +7777,15 @@ int QDECL VFSTCP_WriteBytes (struct vfsfile_s *file, const void *buffer, int byt
if (tf->conpending) if (tf->conpending)
{ {
fd_set fd; fd_set fdw, fdx;
struct timeval timeout; struct timeval timeout;
timeout.tv_sec = 0; timeout.tv_sec = 0;
timeout.tv_usec = 0; timeout.tv_usec = 0;
FD_ZERO(&fd); FD_ZERO(&fdw);
FD_SET(tf->sock, &fd); FD_SET(tf->sock, &fdw);
if (!select((int)tf->sock+1, NULL, &fd, &fd, &timeout)) FD_ZERO(&fdx);
FD_SET(tf->sock, &fdx);
if (!select((int)tf->sock+1, NULL, &fdw, &fdx, &timeout))
return 0; return 0;
tf->conpending = false; tf->conpending = false;
} }

View file

@ -24,7 +24,7 @@ struct
} staticplugins[] = } staticplugins[] =
{ {
#if defined(USE_INTERNAL_BULLET) #if defined(USE_INTERNAL_BULLET)
{"Bullet_internal", Plug_Bullet_Init}, {"bullet_internal", Plug_Bullet_Init},
#endif #endif
#if defined(USE_INTERNAL_ODE) #if defined(USE_INTERNAL_ODE)
{"ODE_internal", Plug_ODE_Init}, {"ODE_internal", Plug_ODE_Init},

View file

@ -2508,7 +2508,7 @@ void Mod_BSPXRW_SetLump(struct bspxrw *ctx, const char *lumpname, void *data, si
} }
} }
Z_ReallocElements(&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps)); Z_ReallocElements((void**)&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps));
Q_strncpyz(ctx->lumps[i].lumpname, lumpname, sizeof(ctx->lumps[i].lumpname)); Q_strncpyz(ctx->lumps[i].lumpname, lumpname, sizeof(ctx->lumps[i].lumpname));
ctx->lumps[i].data = data; ctx->lumps[i].data = data;
ctx->lumps[i].filelen = datasize; ctx->lumps[i].filelen = datasize;
@ -2594,7 +2594,7 @@ qboolean Mod_BSPXRW_Read(struct bspxrw *ctx, const char *fname)
l = (lump_t*)(ctx->origfile+ctx->lumpofs); l = (lump_t*)(ctx->origfile+ctx->lumpofs);
for (i = 0; i < ctx->corelumps; i++) for (i = 0; i < ctx->corelumps; i++)
{ {
Z_ReallocElements(&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps)); Z_ReallocElements((void**)&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps));
ctx->lumps[ctx->totallumps-1].data = ctx->origfile+l[i].fileofs; ctx->lumps[ctx->totallumps-1].data = ctx->origfile+l[i].fileofs;
ctx->lumps[ctx->totallumps-1].filelen = l[i].filelen; ctx->lumps[ctx->totallumps-1].filelen = l[i].filelen;
if (corelumpnames) if (corelumpnames)
@ -2608,7 +2608,7 @@ qboolean Mod_BSPXRW_Read(struct bspxrw *ctx, const char *fname)
{ {
for (i = 0; i < bspxheader->numlumps; i++) for (i = 0; i < bspxheader->numlumps; i++)
{ {
Z_ReallocElements(&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps)); Z_ReallocElements((void**)&ctx->lumps, &ctx->totallumps, ctx->totallumps+1, sizeof(*ctx->lumps));
ctx->lumps[ctx->totallumps-1].data = ctx->origfile+bspxheader->lumps[i].fileofs; ctx->lumps[ctx->totallumps-1].data = ctx->origfile+bspxheader->lumps[i].fileofs;
ctx->lumps[ctx->totallumps-1].filelen = bspxheader->lumps[i].filelen; ctx->lumps[ctx->totallumps-1].filelen = bspxheader->lumps[i].filelen;
memcpy(ctx->lumps[ctx->totallumps-1].lumpname, bspxheader->lumps[i].lumpname, sizeof(ctx->lumps[0].lumpname)); memcpy(ctx->lumps[ctx->totallumps-1].lumpname, bspxheader->lumps[i].lumpname, sizeof(ctx->lumps[0].lumpname));
@ -2730,7 +2730,7 @@ void Mod_FindCubemaps_f(void)
if (isenvmap) if (isenvmap)
{ {
int e = nenvmap; int e = nenvmap;
if (ZF_ReallocElements(&envmap, &nenvmap, nenvmap+1, sizeof(*envmap))) if (ZF_ReallocElements((void**)&envmap, &nenvmap, nenvmap+1, sizeof(*envmap)))
{ {
VectorCopy(origin, envmap[e].origin); VectorCopy(origin, envmap[e].origin);
envmap[e].cubesize = size; envmap[e].cubesize = size;
@ -2741,7 +2741,7 @@ void Mod_FindCubemaps_f(void)
if (nenvmap) if (nenvmap)
{ {
qsort(envmap, nenvmap, sizeof(*envmap), envmapsort); qsort(envmap, nenvmap, sizeof(*envmap), envmapsort);
if (ZF_ReallocElements(&envmapidx, &nenvmapidx, cl.worldmodel->numsurfaces, sizeof(*envmapidx))) if (ZF_ReallocElements((void**)&envmapidx, &nenvmapidx, cl.worldmodel->numsurfaces, sizeof(*envmapidx)))
{ {
for(i = 0; i < cl.worldmodel->numsurfaces; i++) for(i = 0; i < cl.worldmodel->numsurfaces; i++)
envmapidx[i] = Mod_NearestCubeForSurf(cl.worldmodel->surfaces+i, envmap, nenvmap); envmapidx[i] = Mod_NearestCubeForSurf(cl.worldmodel->surfaces+i, envmap, nenvmap);
@ -2778,11 +2778,11 @@ void Mod_BSPX_List_f(void)
{ {
for (i = 0; i < ctx.corelumps; i++) for (i = 0; i < ctx.corelumps; i++)
{ {
Con_Printf("%s: %u\n", ctx.lumps[i].lumpname, ctx.lumps[i].filelen); Con_Printf("%s: %u\n", ctx.lumps[i].lumpname, (unsigned int)ctx.lumps[i].filelen);
} }
for ( ; i < ctx.totallumps; i++) for ( ; i < ctx.totallumps; i++)
{ {
Con_Printf("%s: %u\n", ctx.lumps[i].lumpname, ctx.lumps[i].filelen); Con_Printf("%s: %u\n", ctx.lumps[i].lumpname, (unsigned int)ctx.lumps[i].filelen);
} }
Mod_BSPXRW_Free(&ctx); Mod_BSPXRW_Free(&ctx);
} }

View file

@ -80,7 +80,7 @@ qboolean QVM_LoadDLL(vm_t *vm, const char *name, qboolean binroot, void **vmMain
char dllname_anycpu[MAX_OSPATH];//simple char dllname_anycpu[MAX_OSPATH];//simple
dllhandle_t *hVM; dllhandle_t *hVM;
char fname[MAX_OSPATH]; char fname[MAX_OSPATH*2];
char gpath[MAX_OSPATH]; char gpath[MAX_OSPATH];
void *iterator; void *iterator;

View file

@ -151,7 +151,9 @@ void *Sys_CreateMutexNamed(char *file, int line);
#define Sys_IsMainThread() Sys_MutexStub() #define Sys_IsMainThread() Sys_MutexStub()
#define Sys_LockMutex(m) Sys_MutexStub() #define Sys_LockMutex(m) Sys_MutexStub()
#define Sys_UnlockMutex(m) Sys_MutexStub() #define Sys_UnlockMutex(m) Sys_MutexStub()
static inline qboolean Sys_IsThread(void *thread) {return !thread;} #ifndef __cplusplus
static inline qboolean Sys_IsThread(void *thread) {return !thread;}
#endif
#else #else
#define Sys_IsMainThread() (qboolean)(true) #define Sys_IsMainThread() (qboolean)(true)
#define Sys_CreateMutex() (void*)(NULL) #define Sys_CreateMutex() (void*)(NULL)

View file

@ -1777,7 +1777,7 @@ struct font_s *Font_LoadFont(const char *fontfilename, float vheight)
char *aname; char *aname;
char *parms; char *parms;
int height = ((vheight * vid.rotpixelheight)/vid.height) + 0.5; int height = ((vheight * vid.rotpixelheight)/vid.height) + 0.5;
char facename[MAX_QPATH]; char facename[MAX_QPATH*12];
struct charcache_s *c; struct charcache_s *c;
float aspect = 1; float aspect = 1;
enum enum
@ -1790,7 +1790,7 @@ struct font_s *Font_LoadFont(const char *fontfilename, float vheight)
FMT_HORIZONTAL, //unicode, charcount=width/(height-2). single strip of chars, like halflife. FMT_HORIZONTAL, //unicode, charcount=width/(height-2). single strip of chars, like halflife.
} fmt = FMT_AUTO; } fmt = FMT_AUTO;
Q_strncpy(facename, fontfilename, sizeof(facename)); Q_strncpyz(facename, fontfilename, sizeof(facename));
aname = strstr(facename, ":"); aname = strstr(facename, ":");
if (aname) if (aname)

View file

@ -800,8 +800,14 @@ void Mod_Init (qboolean initial)
//q2/q3bsps //q2/q3bsps
#if defined(Q2BSPS) || defined(Q3BSPS) #if defined(Q2BSPS) || defined(Q3BSPS)
#ifndef Q2BSPS
Mod_RegisterModelFormatMagic(NULL, "Quake3 Map (bsp)", IDBSPHEADER, Mod_LoadQ2BrushModel);
#elif !defined(Q3BSPS)
Mod_RegisterModelFormatMagic(NULL, "Quake2 Map (bsp)", IDBSPHEADER, Mod_LoadQ2BrushModel);
#else
Mod_RegisterModelFormatMagic(NULL, "Quake2/Quake3 Map (bsp)", IDBSPHEADER, Mod_LoadQ2BrushModel); Mod_RegisterModelFormatMagic(NULL, "Quake2/Quake3 Map (bsp)", IDBSPHEADER, Mod_LoadQ2BrushModel);
#endif #endif
#endif
#ifdef RFBSPS #ifdef RFBSPS
Mod_RegisterModelFormatMagic(NULL, "Raven Map (bsp)", ('R'<<0)+('B'<<8)+('S'<<16)+('P'<<24), Mod_LoadQ2BrushModel); Mod_RegisterModelFormatMagic(NULL, "Raven Map (bsp)", ('R'<<0)+('B'<<8)+('S'<<16)+('P'<<24), Mod_LoadQ2BrushModel);
Mod_RegisterModelFormatMagic(NULL, "QFusion Map (bsp)", ('F'<<0)+('B'<<8)+('S'<<16)+('P'<<24), Mod_LoadQ2BrushModel); Mod_RegisterModelFormatMagic(NULL, "QFusion Map (bsp)", ('F'<<0)+('B'<<8)+('S'<<16)+('P'<<24), Mod_LoadQ2BrushModel);

View file

@ -11188,7 +11188,7 @@ void QCC_PR_ParseStatement (void)
pr_labels = realloc(pr_labels, sizeof(*pr_labels)*max_labels); pr_labels = realloc(pr_labels, sizeof(*pr_labels)*max_labels);
} }
strncpy(pr_labels[num_labels].name, pr_token, sizeof(pr_labels[num_labels].name) -1); QC_strlcpy(pr_labels[num_labels].name, pr_token, sizeof(pr_labels[num_labels].name));
pr_labels[num_labels].lineno = pr_source_line; pr_labels[num_labels].lineno = pr_source_line;
pr_labels[num_labels].statementno = numstatements; pr_labels[num_labels].statementno = numstatements;
@ -11368,7 +11368,7 @@ void QCC_PR_ParseStatement (void)
pr_labels = realloc(pr_labels, sizeof(*pr_labels)*max_labels); pr_labels = realloc(pr_labels, sizeof(*pr_labels)*max_labels);
} }
strncpy(pr_labels[num_labels].name, pr_token, sizeof(pr_labels[num_labels].name) -1); QC_strlcpy(pr_labels[num_labels].name, pr_token, sizeof(pr_labels[num_labels].name));
pr_labels[num_labels].lineno = pr_source_line; pr_labels[num_labels].lineno = pr_source_line;
pr_labels[num_labels].statementno = numstatements; pr_labels[num_labels].statementno = numstatements;
@ -13588,6 +13588,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, const char *name, QCC_function_t *s
break; break;
case ev_accessor: //shouldn't happen. case ev_accessor: //shouldn't happen.
case ev_enum:
case ev_float: case ev_float:
case ev_string: case ev_string:
case ev_entity: case ev_entity:
@ -14007,6 +14008,7 @@ QCC_def_t *QCC_PR_DummyFieldDef(QCC_type_t *type, QCC_function_t *scope, int arr
break; break;
} }
//fallthrough. any named structs will become global structs that contain field references. hopefully. //fallthrough. any named structs will become global structs that contain field references. hopefully.
case ev_enum:
case ev_accessor: case ev_accessor:
case ev_float: case ev_float:
case ev_string: case ev_string:
@ -14120,15 +14122,15 @@ pbool QCC_PR_ParseInitializerType(int arraysize, QCC_def_t *basedef, QCC_sref_t
else if (pr_token_type == tt_immediate && pr_immediate_type == type_integer) else if (pr_token_type == tt_immediate && pr_immediate_type == type_integer)
binum = pr_immediate._int; binum = pr_immediate._int;
else if (pr_token_type == tt_immediate && pr_immediate_type == type_string) else if (pr_token_type == tt_immediate && pr_immediate_type == type_string)
strncpy(fname, pr_immediate_string, sizeof(fname)); QC_strlcpy(fname, pr_immediate_string, sizeof(fname));
else if (pr_token_type == tt_name) else if (pr_token_type == tt_name)
strncpy(fname, pr_token, sizeof(fname)); QC_strlcpy(fname, pr_token, sizeof(fname));
else else
QCC_PR_ParseError (ERR_BADBUILTINIMMEDIATE, "Bad builtin immediate"); QCC_PR_ParseError (ERR_BADBUILTINIMMEDIATE, "Bad builtin immediate");
QCC_PR_Lex(); QCC_PR_Lex();
if (!*fname && QCC_PR_CheckToken (":")) if (!*fname && QCC_PR_CheckToken (":"))
strncpy(fname, QCC_PR_ParseName(), sizeof(fname)); QC_strlcpy(fname, QCC_PR_ParseName(), sizeof(fname));
//if the builtin already exists, just use that dfunction instead //if the builtin already exists, just use that dfunction instead
if (basedef && basedef->initialized) if (basedef && basedef->initialized)

View file

@ -5271,7 +5271,6 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail)
pbool redeclaration; pbool redeclaration;
int basicindex; int basicindex;
QCC_def_t *d; QCC_def_t *d;
int d_offset = 0;
QCC_type_t *pc; QCC_type_t *pc;
pbool found = false; pbool found = false;
int assumevirtual = 0; //0=erk, 1=yes, -1=no int assumevirtual = 0; //0=erk, 1=yes, -1=no

View file

@ -4375,7 +4375,7 @@ int qccmline;
char *qccmsrc; char *qccmsrc;
//char *qccmsrc2; //char *qccmsrc2;
char qccmfilename[1024]; char qccmfilename[1024];
char qccmprogsdat[1024]; char qccmprogsdat[1024*2];
void QCC_FinishCompile(void); void QCC_FinishCompile(void);
@ -4930,14 +4930,15 @@ memset(pr_immediate_string, 0, sizeof(pr_immediate_string));
{ {
p = QCC_CheckParm ("-qc"); p = QCC_CheckParm ("-qc");
if (p && p < argc-1 ) if (p && p < argc-1 )
sprintf (qccmprogsdat, "%s", argv[p+1]); QC_strlcpy(qccmprogsdat, argv[p+1], sizeof(qccmprogsdat));
else else
{ //look for a preprogs.src... :o) { //look for a preprogs.src... :o)
sprintf (qccmprogsdat, "%spreprogs.src", qccmsourcedir); char tmp[sizeof(qccmsourcedir)+16];
if (externs->FileSize(qccmprogsdat) <= 0) QC_snprintfz (tmp, sizeof(tmp), "%spreprogs.src", qccmsourcedir);
sprintf (qccmprogsdat, "progs.src"); if (externs->FileSize(tmp) <= 0)
QC_snprintfz (qccmprogsdat, sizeof(qccmprogsdat), "progs.src");
else else
sprintf (qccmprogsdat, "preprogs.src"); QC_snprintfz (qccmprogsdat, sizeof(qccmprogsdat), "preprogs.src");
} }
numsourcefiles = 0; numsourcefiles = 0;
@ -4958,7 +4959,7 @@ memset(pr_immediate_string, 0, sizeof(pr_immediate_string));
else else
printf("%s\n", QCC_VersionString()); printf("%s\n", QCC_VersionString());
sprintf (qccmprogsdat, "%s%s", qccmsourcedir, sourcefileslist[currentsourcefile++]); QC_snprintfz (qccmprogsdat, sizeof(qccmprogsdat), "%s%s", qccmsourcedir, sourcefileslist[currentsourcefile++]);
printf ("Source file: %s\n", qccmprogsdat); printf ("Source file: %s\n", qccmprogsdat);
QC_strlcpy(compilingrootfile, qccmprogsdat, sizeof(compilingrootfile)); QC_strlcpy(compilingrootfile, qccmprogsdat, sizeof(compilingrootfile));

View file

@ -462,7 +462,7 @@ void SV_Map_f (void)
{ {
char level[MAX_QPATH]; char level[MAX_QPATH];
char spot[MAX_QPATH]; char spot[MAX_QPATH];
char expanded[MAX_QPATH]; char expanded[MAX_QPATH+64];
char *nextserver; char *nextserver;
qboolean preserveplayers= false; qboolean preserveplayers= false;
qboolean isrestart = false; //don't hurt settings qboolean isrestart = false; //don't hurt settings

View file

@ -323,7 +323,7 @@ int sql_serverworker(void *sref)
if (qres) if (qres)
{ {
if (qerror) if (qerror)
Q_strncpy(qres->error, qerror, qesize); Q_strncpyz(qres->error, qerror, qesize);
qres->result = res; qres->result = res;
qres->rows = rows; qres->rows = rows;
qres->columns = columns; qres->columns = columns;
@ -491,7 +491,7 @@ int sql_serverworker(void *sref)
if (qres) if (qres)
{ // hopefully the qmysql_close gained us some memory otherwise we're pretty screwed { // hopefully the qmysql_close gained us some memory otherwise we're pretty screwed
qres->rows = qres->columns = -1; qres->rows = qres->columns = -1;
Q_strncpy(qres->error, error, esize); Q_strncpyz(qres->error, error, esize);
SQL_PushResult(server, qres); SQL_PushResult(server, qres);
} }
@ -872,14 +872,14 @@ int SQL_NewServer(const char *driver, const char **paramstr)
for (i = 0; i < SQL_CONNECT_STRUCTPARAMS; i++) for (i = 0; i < SQL_CONNECT_STRUCTPARAMS; i++)
{ {
server->connectparams[i] = ((char *)(server + 1)) + tsize; server->connectparams[i] = ((char *)(server + 1)) + tsize;
Q_strncpy(server->connectparams[i], paramstr[i], paramsize[i]); Q_strncpyz(server->connectparams[i], paramstr[i], paramsize[i]);
// string should be null-terminated due to Z_Malloc // string should be null-terminated due to Z_Malloc
tsize += paramsize[i] + 1; tsize += paramsize[i] + 1;
} }
for (i = SQL_CONNECT_STRUCTPARAMS; i < SQL_CONNECT_PARAMS; i++) for (i = SQL_CONNECT_STRUCTPARAMS; i < SQL_CONNECT_PARAMS; i++)
{ {
server->connectparams[i] = (char *)Z_Malloc(sizeof(char) * (paramsize[i] + 1)); server->connectparams[i] = (char *)Z_Malloc(sizeof(char) * (paramsize[i] + 1));
Q_strncpy(server->connectparams[i], paramstr[i], paramsize[i]); Q_strncpyz(server->connectparams[i], paramstr[i], paramsize[i]);
// string should be null-terminated due to Z_Malloc // string should be null-terminated due to Z_Malloc
} }
@ -936,7 +936,7 @@ int SQL_NewQuery(sqlserver_t *server, qboolean (*callback)(queryrequest_t *req,
} }
qreq->callback = callback; qreq->callback = callback;
Q_strncpy(qreq->query, str, qsize); Q_strncpyz(qreq->query, str, qsize);
qreq->nextreq = server->requests; qreq->nextreq = server->requests;
server->requests = qreq; server->requests = qreq;

View file

@ -1231,9 +1231,9 @@ void SV_SendClientPrespawnInfo(client_t *client)
{ {
//grab the model name... without a progs/ prefix if it has one //grab the model name... without a progs/ prefix if it has one
if (!strncmp(sv.strings.vw_model_precache[i], "progs/", 6)) if (!strncmp(sv.strings.vw_model_precache[i], "progs/", 6))
Q_strncpy(mname, sv.strings.vw_model_precache[i]+6, sizeof(mname)); Q_strncpyz(mname, sv.strings.vw_model_precache[i]+6, sizeof(mname));
else else
Q_strncpy(mname, sv.strings.vw_model_precache[i], sizeof(mname)); Q_strncpyz(mname, sv.strings.vw_model_precache[i], sizeof(mname));
//strip .mdl extensions, for compat with ezquake //strip .mdl extensions, for compat with ezquake
COM_FileExtension(mname, ext, sizeof(ext)); COM_FileExtension(mname, ext, sizeof(ext));

View file

@ -72,6 +72,7 @@ PLUG_NATIVE_EXT?=_unk.so
PLUG_DEFFILE?= PLUG_DEFFILE?=
PLUG_CFLAGS?=-fPIC -Wl,--no-undefined -Bsymbolic -fvisibility=hidden PLUG_CFLAGS?=-fPIC -Wl,--no-undefined -Bsymbolic -fvisibility=hidden
PLUG_CXXFLAGS?=-fPIC -Wl,--no-undefined -Bsymbolic -fvisibility=hidden PLUG_CXXFLAGS?=-fPIC -Wl,--no-undefined -Bsymbolic -fvisibility=hidden
PLUG_CMAKE?=-DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX)
PLUG_LDFLAGS_ZLIB?= PLUG_LDFLAGS_ZLIB?=
ARCH:=$(shell $(CC) -dumpmachine) ARCH:=$(shell $(CC) -dumpmachine)
PLUG_LDFLAGS:=-L../engine/libs-$(ARCH) $(PLUG_LDFLAGS) PLUG_LDFLAGS:=-L../engine/libs-$(ARCH) $(PLUG_LDFLAGS)
@ -222,20 +223,28 @@ $(OUT_DIR)/fteplug_ode$(PLUG_NATIVE_EXT): $(ODE_FILES)
#NATIVE_PLUGINS+=ode #NATIVE_PLUGINS+=ode
BULLET_VER=2.83.7 BULLET_VER=2.87
BULLET_URL=https://github.com/bulletphysics/bullet3/archive/$(BULLET_VER).tar.gz BULLET_URL=https://github.com/bulletphysics/bullet3/archive/$(BULLET_VER).tar.gz
BULLET_BASE=$(OUT_DIR)/../bullet3-$(ODE_VER)_$(FTE_TARGET)/ BULLET_BASE=$(OUT_DIR)/../bullet3-$(BULLET_VER)_$(FTE_TARGET)/
BULLET_LIB=$(ODE_BASE)bullet3-$(ODE_VER)/ode/src/.libs/libode.a BULLET_LIBS= \
$(BULLET_BASE)bullet3-$(BULLET_VER)/src/BulletDynamics/libBulletDynamics.a \
$(BULLET_BASE)bullet3-$(BULLET_VER)/src/BulletCollision/libBulletCollision.a \
$(BULLET_BASE)bullet3-$(BULLET_VER)/src/LinearMath/libLinearMath.a
BULLET_CFLAGS=-I$(BULLET_BASE)bullet3-$(BULLET_VER)/src
$(OUT_DIR)/../bullet3-$(BULLET_VER).tar.gz: $(OUT_DIR)/../bullet3-$(BULLET_VER).tar.gz:
mkdir -p $(BULLET_BASE) mkdir -p $(BULLET_BASE)
wget -N $(BULLET_URL) -O $@ wget -N $(BULLET_URL) -O $@
BULLET_LIB=$(BULLET_BASE)bullet3-$(BULLET_VER)/src/LinearMath/libLinearMath.a
$(BULLET_BASE)bullet3-$(BULLET_VER)/src/BulletDynamics/libBulletDynamics.a $(BULLET_BASE)bullet3-$(BULLET_VER)/src/BulletCollision/libBulletCollision.a: $(BULLET_LIB)
$(BULLET_LIB): $(OUT_DIR)/../bullet3-$(BULLET_VER).tar.gz $(BULLET_LIB): $(OUT_DIR)/../bullet3-$(BULLET_VER).tar.gz
mkdir -p $(BULLET_BASE) && cd $(BULLET_BASE) && tar xvfz $< mkdir -p $(BULLET_BASE) && cd $(BULLET_BASE) && tar xvfz $<
cd $(BULLET_BASE)bullet3-$(BULLET_VER)/ && ./bootstrap && ./configure --enable-double-precision --disable-demos --without-x CXX="$(CC)" CFLAGS="$(PLUG_CFLAGS)" CXXFLAGS="$(PLUG_CXXFLAGS)" --host=`$(CC) -dumpmachine` && make cd $(BULLET_BASE)bullet3-$(BULLET_VER)/ && cmake $(PLUG_CMAKE) . && $(MAKE) LinearMath BulletDynamics BulletCollision
#./configure --enable-double-precision --disable-demos --without-x CXX="$(CC)" CFLAGS="$(PLUG_CFLAGS)" CXXFLAGS="$(PLUG_CXXFLAGS)" --host=`$(CC) -dumpmachine` && make
$(OUT_DIR)/fteplug_bullet$(PLUG_NATIVE_EXT): bullet/bulletplug.c plugin.c qvm_api.c $(BULLET_LIB) $(OUT_DIR)/fteplug_bullet$(PLUG_NATIVE_EXT): bullet/bulletplug.cpp plugin.c qvm_api.c $(BULLET_LIBS)
$(CC) $(BASE_CFLAGS) $(CFLAGS) -DFTEPLUGIN -o $@ -shared $(PLUG_CFLAGS) $^ $(PLUG_DEFFILE) $(PLUG_LDFLAGS) $(CXX) $(BASE_CFLAGS) $(CFLAGS) -DFTEPLUGIN -o $@ -shared $(PLUG_CFLAGS) $^ $(PLUG_DEFFILE) $(PLUG_LDFLAGS) $(BULLET_CFLAGS)
#NATIVE_PLUGINS+=bullet #NATIVE_PLUGINS+=bullet

View file

@ -41,7 +41,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define BZ_Malloc malloc #define BZ_Malloc malloc
#define BZ_Free free #define BZ_Free free
#define Z_Free BZ_Free #define Z_Free BZ_Free
static vec3_t vec3_origin; //#define vec3_origin vec3_origin_
//static vec3_t vec3_origin;
#define VectorCompare VectorCompare_
static int VectorCompare (const vec3_t v1, const vec3_t v2) static int VectorCompare (const vec3_t v1, const vec3_t v2)
{ {
int i; int i;
@ -62,7 +64,7 @@ static rbeplugfuncs_t *rbefuncs;
#define DEG2RAD(d) (d * M_PI * (1/180.0f)) #define DEG2RAD(d) (d * M_PI * (1/180.0f))
#define RAD2DEG(d) ((d*180) / M_PI) #define RAD2DEG(d) ((d*180) / M_PI)
#include <btBulletDynamicsCommon.h> #include "btBulletDynamicsCommon.h"
static void World_Bullet_RunCmd(world_t *world, rbecommandqueue_t *cmd); static void World_Bullet_RunCmd(world_t *world, rbecommandqueue_t *cmd);
@ -176,13 +178,13 @@ static void QDECL World_Bullet_RemoveFromEntity(world_t *world, wedict_t *ed)
ed->rbe.physics = qfalse; ed->rbe.physics = qfalse;
body = (btRigidBody*)ed->rbe.body.body; body = (btRigidBody*)ed->rbe.body.body;
ed->rbe.body = NULL; ed->rbe.body.body = NULL;
if (body) if (body)
ctx->dworld->removeRigidBody (body); ctx->dworld->removeRigidBody (body);
geom = (btCollisionShape*)ed->rbe.geom; geom = (btCollisionShape*)ed->rbe.body.geom;
ed->rbe.geom = NULL; ed->rbe.body.geom = NULL;
if (ed->rbe.geom) if (ed->rbe.body.geom)
delete geom; delete geom;
//FIXME: joints //FIXME: joints
@ -202,7 +204,7 @@ static void World_Bullet_Frame_BodyToEntity(world_t *world, wedict_t *ed)
const float *o; const float *o;
const float *r; // for some reason dBodyGetRotation returns a [3][4] matrix const float *r; // for some reason dBodyGetRotation returns a [3][4] matrix
const float *vel; const float *vel;
btRigidBody *body = (btRigidBody*)ed->rbe.body; btRigidBody *body = (btRigidBody*)ed->rbe.body.body;
int movetype; int movetype;
float bodymatrix[16]; float bodymatrix[16];
float entitymatrix[16]; float entitymatrix[16];
@ -352,11 +354,11 @@ static void World_Bullet_Frame_JointFromEntity(world_t *world, wedict_t *ed)
jointtype = 0; // can't have both jointtype = 0; // can't have both
e1 = (wedict_t*)PROG_TO_EDICT(world->progs, enemy); e1 = (wedict_t*)PROG_TO_EDICT(world->progs, enemy);
b1 = (btRigidBody*)e1->rbe.body; b1 = (btRigidBody*)e1->rbe.body.body;
if(ED_ISFREE(e1) || !b1) if(ED_ISFREE(e1) || !b1)
enemy = 0; enemy = 0;
e2 = (wedict_t*)PROG_TO_EDICT(world->progs, aiment); e2 = (wedict_t*)PROG_TO_EDICT(world->progs, aiment);
b2 = (btRigidBody*)e2->rbe.body; b2 = (btRigidBody*)e2->rbe.body.body;
if(ED_ISFREE(e2) || !b2) if(ED_ISFREE(e2) || !b2)
aiment = 0; aiment = 0;
// see http://www.ode.org/old_list_archives/2006-January/017614.html // see http://www.ode.org/old_list_archives/2006-January/017614.html
@ -364,9 +366,9 @@ static void World_Bullet_Frame_JointFromEntity(world_t *world, wedict_t *ed)
// note: if movedir[2] is 0, it becomes ERP = 1, CFM = 1.0 / (H * K) // note: if movedir[2] is 0, it becomes ERP = 1, CFM = 1.0 / (H * K)
if(movedir[0] > 0 && movedir[1] > 0) if(movedir[0] > 0 && movedir[1] > 0)
{ {
float K = movedir[0]; // float K = movedir[0];
float D = movedir[1]; // float D = movedir[1];
float R = 2.0 * D * sqrt(K); // we assume D is premultiplied by sqrt(sprungMass) // float R = 2.0 * D * sqrt(K); // we assume D is premultiplied by sqrt(sprungMass)
// CFM = 1.0 / (rbe->ode_step * K + R); // always > 0 // CFM = 1.0 / (rbe->ode_step * K + R); // always > 0
// ERP = rbe->ode_step * K * CFM; // ERP = rbe->ode_step * K * CFM;
Vel = 0; Vel = 0;
@ -392,11 +394,11 @@ static void World_Bullet_Frame_JointFromEntity(world_t *world, wedict_t *ed)
if(jointtype == ed->rbe.joint_type && VectorCompare(origin, ed->rbe.joint_origin) && VectorCompare(velocity, ed->rbe.joint_velocity) && VectorCompare(ed->v->angles, ed->rbe.joint_angles) && enemy == ed->rbe.joint_enemy && aiment == ed->rbe.joint_aiment && VectorCompare(movedir, ed->rbe.joint_movedir)) if(jointtype == ed->rbe.joint_type && VectorCompare(origin, ed->rbe.joint_origin) && VectorCompare(velocity, ed->rbe.joint_velocity) && VectorCompare(ed->v->angles, ed->rbe.joint_angles) && enemy == ed->rbe.joint_enemy && aiment == ed->rbe.joint_aiment && VectorCompare(movedir, ed->rbe.joint_movedir))
return; // nothing to do return; // nothing to do
if(ed->rbe.joint) if(ed->rbe.joint.joint)
{ {
j = (btTypedConstraint*)ed->rbe.joint; j = (btTypedConstraint*)ed->rbe.joint.joint;
rbe->dworld->removeConstraint(j); rbe->dworld->removeConstraint(j);
ed->rbe.joint = NULL; ed->rbe.joint.joint = NULL;
delete j; delete j;
} }
if (!jointtype) if (!jointtype)
@ -523,7 +525,7 @@ static void World_Bullet_Frame_JointFromEntity(world_t *world, wedict_t *ed)
break; break;
} }
ed->rbe.joint = (void *) j; ed->rbe.joint.joint = (void *) j;
if (j) if (j)
{ {
j->setUserConstraintPtr((void *) ed); j->setUserConstraintPtr((void *) ed);
@ -575,7 +577,7 @@ static qboolean QDECL World_Bullet_RagCreateBody(world_t *world, rbebody_t *body
bulletcontext_t *ctx = (bulletcontext_t*)world->rbe; bulletcontext_t *ctx = (bulletcontext_t*)world->rbe;
int axisindex; int axisindex;
ctx->hasextraobjs = true; ctx->hasextraobjs = true;
switch(bodyinfo->geomshape) switch(bodyinfo->geomshape)
{ {
/* /*
@ -953,7 +955,7 @@ public:
rbefuncs->VectorAngles(fwd, up, edict->v->angles, (qboolean)NegativeMeshPitch(world, edict)); rbefuncs->VectorAngles(fwd, up, edict->v->angles, (qboolean)NegativeMeshPitch(world, edict));
const btVector3 &vel = ((btRigidBody*)edict->rbe.body)->getLinearVelocity(); const btVector3 &vel = ((btRigidBody*)edict->rbe.body.body)->getLinearVelocity();
VectorCopy(vel.m_floats, edict->v->velocity); VectorCopy(vel.m_floats, edict->v->velocity);
//so it doesn't get rebuilt //so it doesn't get rebuilt
@ -1218,7 +1220,7 @@ static void World_Bullet_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
// ed->rbe.massbuf = BZ_Malloc(sizeof(dMass)); // ed->rbe.massbuf = BZ_Malloc(sizeof(dMass));
// memcpy(ed->rbe.massbuf, &mass, sizeof(dMass)); // memcpy(ed->rbe.massbuf, &mass, sizeof(dMass));
ed->rbe.geom = (void *)geom; ed->rbe.body.geom = (void *)geom;
} }
//non-moving objects need to be static objects (and thus need 0 mass) //non-moving objects need to be static objects (and thus need 0 mass)
@ -1229,32 +1231,32 @@ static void World_Bullet_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
if (ed->rbe.mass != massval) if (ed->rbe.mass != massval)
{ {
ed->rbe.mass = massval; ed->rbe.mass = massval;
body = (btRigidBody*)ed->rbe.body; body = (btRigidBody*)ed->rbe.body.body;
if (body) if (body)
ctx->dworld->removeRigidBody(body); ctx->dworld->removeRigidBody(body);
ed->rbe.body = NULL; ed->rbe.body.body = NULL;
} }
// if(ed->rbe.geom) // if(ed->rbe.body.geom)
// dGeomSetData(ed->rbe.geom, (void*)ed); // dGeomSetData(ed->rbe.body.geom, (void*)ed);
if (movetype == MOVETYPE_PHYSICS && ed->rbe.mass) if (movetype == MOVETYPE_PHYSICS && ed->rbe.mass)
{ {
if (ed->rbe.body == NULL) if (ed->rbe.body.body == NULL)
{ {
// ed->rbe.body = (void *)(body = dBodyCreate(world->rbe.world)); // ed->rbe.body.body = (void *)(body = dBodyCreate(world->rbe.world));
// dGeomSetBody(ed->rbe.geom, body); // dGeomSetBody(ed->rbe.body.geom, body);
// dBodySetData(body, (void*)ed); // dBodySetData(body, (void*)ed);
// dBodySetMass(body, (dMass *) ed->rbe.massbuf); // dBodySetMass(body, (dMass *) ed->rbe.massbuf);
btVector3 fallInertia(0, 0, 0); btVector3 fallInertia(0, 0, 0);
((btCollisionShape*)ed->rbe.geom)->calculateLocalInertia(ed->rbe.mass, fallInertia); ((btCollisionShape*)ed->rbe.body.geom)->calculateLocalInertia(ed->rbe.mass, fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(ed->rbe.mass, new QCMotionState(ed,world), (btCollisionShape*)ed->rbe.geom, fallInertia); btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(ed->rbe.mass, new QCMotionState(ed,world), (btCollisionShape*)ed->rbe.body.geom, fallInertia);
body = new btRigidBody(fallRigidBodyCI); body = new btRigidBody(fallRigidBodyCI);
body->setUserPointer(ed); body->setUserPointer(ed);
// btTransform trans; // btTransform trans;
// trans.setFromOpenGLMatrix(ed->rbe.offsetmatrix); // trans.setFromOpenGLMatrix(ed->rbe.offsetmatrix);
// body->setCenterOfMassTransform(trans); // body->setCenterOfMassTransform(trans);
ed->rbe.body = (void*)body; ed->rbe.body.body = (void*)body;
//motion threshhold should be speed/physicsframerate. //motion threshhold should be speed/physicsframerate.
//FIXME: recalculate... //FIXME: recalculate...
@ -1269,15 +1271,15 @@ static void World_Bullet_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
} }
else else
{ {
if (ed->rbe.body == NULL) if (ed->rbe.body.body == NULL)
{ {
btRigidBody::btRigidBodyConstructionInfo rbci(ed->rbe.mass, new QCMotionState(ed,world), (btCollisionShape*)ed->rbe.geom, btVector3(0, 0, 0)); btRigidBody::btRigidBodyConstructionInfo rbci(ed->rbe.mass, new QCMotionState(ed,world), (btCollisionShape*)ed->rbe.body.geom, btVector3(0, 0, 0));
body = new btRigidBody(rbci); body = new btRigidBody(rbci);
body->setUserPointer(ed); body->setUserPointer(ed);
// btTransform trans; // btTransform trans;
// trans.setFromOpenGLMatrix(ed->rbe.offsetmatrix); // trans.setFromOpenGLMatrix(ed->rbe.offsetmatrix);
// body->setCenterOfMassTransform(trans); // body->setCenterOfMassTransform(trans);
ed->rbe.body = (void*)body; ed->rbe.body.body = (void*)body;
if (ed->rbe.mass) if (ed->rbe.mass)
body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
else else
@ -1288,7 +1290,7 @@ static void World_Bullet_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
} }
} }
body = (btRigidBody*)ed->rbe.body; body = (btRigidBody*)ed->rbe.body.body;
// get current data from entity // get current data from entity
gravity = qtrue; gravity = qtrue;
@ -1376,7 +1378,7 @@ static void World_Bullet_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
modified = qtrue; modified = qtrue;
// store the qc values into the physics engine // store the qc values into the physics engine
body = (btRigidBody*)ed->rbe.body; body = (btRigidBody*)ed->rbe.body.body;
if (modified && body) if (modified && body)
{ {
// dVector3 r[3]; // dVector3 r[3];
@ -1508,7 +1510,7 @@ static void VARGS nearCallback (void *data, dGeomID o1, dGeomID o2)
//ragdolls don't make contact with the bbox of the doll entity //ragdolls don't make contact with the bbox of the doll entity
//the origional entity should probably not be solid anyway. //the origional entity should probably not be solid anyway.
//these bodies should probably not collide against bboxes of other entities with ragdolls either, but meh. //these bodies should probably not collide against bboxes of other entities with ragdolls either, but meh.
if (ed1->rbe.body == b1 || ed2->rbe.body == b2) if (ed1->rbe.body.body == b1 || ed2->rbe.body == b2)
return; return;
} }
if(!ed1 || ed1->isfree) if(!ed1 || ed1->isfree)
@ -1605,7 +1607,7 @@ static void QDECL World_Bullet_Frame(world_t *world, double frametime, double gr
struct bulletcontext_s *ctx = (struct bulletcontext_s*)world->rbe; struct bulletcontext_s *ctx = (struct bulletcontext_s*)world->rbe;
if (world->rbe_hasphysicsents || ctx->hasextraobjs) if (world->rbe_hasphysicsents || ctx->hasextraobjs)
{ {
int i; unsigned int i;
wedict_t *ed; wedict_t *ed;
// world->rbe.iterations = bound(1, physics_bullet_iterationsperframe.ival, 1000); // world->rbe.iterations = bound(1, physics_bullet_iterationsperframe.ival, 1000);
@ -1674,7 +1676,7 @@ static void QDECL World_Bullet_Frame(world_t *world, double frametime, double gr
static void World_Bullet_RunCmd(world_t *world, rbecommandqueue_t *cmd) static void World_Bullet_RunCmd(world_t *world, rbecommandqueue_t *cmd)
{ {
btRigidBody *body = (btRigidBody*)(cmd->edict->rbe.body); btRigidBody *body = (btRigidBody*)(cmd->edict->rbe.body.body);
switch(cmd->command) switch(cmd->command)
{ {
case RBECMD_ENABLE: case RBECMD_ENABLE:
@ -1693,7 +1695,7 @@ static void World_Bullet_RunCmd(world_t *world, rbecommandqueue_t *cmd)
} }
break; break;
case RBECMD_TORQUE: case RBECMD_TORQUE:
if (cmd->edict->rbe.body) if (cmd->edict->rbe.body.body)
{ {
body->setActivationState(1); body->setActivationState(1);
body->applyTorque(btVector3(cmd->v1[0], cmd->v1[1], cmd->v1[2])); body->applyTorque(btVector3(cmd->v1[0], cmd->v1[1], cmd->v1[2]));
@ -1722,7 +1724,7 @@ static void QDECL World_Bullet_PushCommand(world_t *world, rbecommandqueue_t *va
static void QDECL World_Bullet_TraceEntity(world_t *world, vec3_t start, vec3_t end, wedict_t *ed) static void QDECL World_Bullet_TraceEntity(world_t *world, vec3_t start, vec3_t end, wedict_t *ed)
{ {
struct bulletcontext_s *ctx = (struct bulletcontext_s*)world->rbe; struct bulletcontext_s *ctx = (struct bulletcontext_s*)world->rbe;
btCollisionShape *shape = (btCollisionShape*)ed->rbe.geom; btCollisionShape *shape = (btCollisionShape*)ed->rbe.body.geom;
class myConvexResultCallback : public btCollisionWorld::ConvexResultCallback class myConvexResultCallback : public btCollisionWorld::ConvexResultCallback
{ {

View file

@ -150,9 +150,9 @@ void SCR_HUD_DrawBar(int direction, int value, float max_value, float *rgba, int
if(direction >= 2) if(direction >= 2)
// top-down // top-down
amount = Q_rint(abs((height * value) / max_value)); amount = Q_rint(fabs((height * value) / max_value));
else// left-right else// left-right
amount = Q_rint(abs((width * value) / max_value)); amount = Q_rint(fabs((width * value) / max_value));
pDraw_Colour4f(rgba[0]/255.0, rgba[1]/255.0, rgba[2]/255.0, rgba[3]/255.0 * alphamul); pDraw_Colour4f(rgba[0]/255.0, rgba[1]/255.0, rgba[2]/255.0, rgba[3]/255.0 * alphamul);
if(direction == 0) if(direction == 0)
@ -390,7 +390,7 @@ char *SCR_GetGameTime(int t, char *buffer, size_t buffersize)
if (cl.countdown || cl.standby) if (cl.countdown || cl.standby)
SecondsToMinutesString(timelimit, buffer, buffersize); SecondsToMinutesString(timelimit, buffer, buffersize);
else else
SecondsToMinutesString((int) abs(timelimit - (cl.time - cl.matchstart)), buffer, buffersize); SecondsToMinutesString((int) fabs(timelimit - (cl.time - cl.matchstart)), buffer, buffersize);
return buffer; return buffer;
} }

View file

@ -64,8 +64,8 @@ BUILTINR(qhandle_t, Con_POpen, (const char *conname, quintptr_t flags));
#define ARGNAMES ,conname,text #define ARGNAMES ,conname,text
BUILTIN(void, Con_SubPrint, (const char *conname, const char *text)); //on to named sub console (creating it too). BUILTIN(void, Con_SubPrint, (const char *conname, const char *text)); //on to named sub console (creating it too).
#undef ARGNAMES #undef ARGNAMES
#define ARGNAMES ,old,new #define ARGNAMES ,old,newname
BUILTIN(void, Con_RenameSub, (const char *old, const char *new)); //rename a subconsole BUILTIN(void, Con_RenameSub, (const char *old, const char *newname)); //rename a subconsole
#undef ARGNAMES #undef ARGNAMES
#define ARGNAMES ,conname #define ARGNAMES ,conname
BUILTINR(int, Con_IsActive, (const char *conname)); BUILTINR(int, Con_IsActive, (const char *conname));
@ -565,18 +565,18 @@ qintptr_t QDECL Plug_InitAPI(qintptr_t *args)
qboolean Plug_Export(const char *name, export_t func) qboolean Plug_Export(const char *name, export_t func)
{ {
int i; size_t i;
for (i = 0; i < sizeof(exports)/sizeof(exports[0]); i++) for (i = 0; i < sizeof(exports)/sizeof(exports[0]); i++)
{ {
if (!exports[i].name) if (!exports[i].name)
{ {
exports[i].name = name; exports[i].name = name;
exports[i].func = func; exports[i].func = func;
return pPlug_ExportToEngine(name, i); return pPlug_ExportToEngine(name, i)?qtrue:qfalse;
} }
} }
pSys_Error("Plugin exports too many functions"); pSys_Error("Plugin exports too many functions");
return 0; return qfalse;
} }

View file

@ -277,7 +277,7 @@ void QI_RefreshMapList(qboolean forcedisplay)
tech = XML_ChildOfTree(file, "techinfo", 0); tech = XML_ChildOfTree(file, "techinfo", 0);
//if the filter isn't contained in the id/desc then don't display it. //if the filter isn't contained in the id/desc then don't display it.
if (filters.namefilter) if (*filters.namefilter)
{ {
if (!QI_strcasestr(id, filters.namefilter) && !QI_strcasestr(desc, filters.namefilter) && !QI_strcasestr(author, filters.namefilter)) if (!QI_strcasestr(id, filters.namefilter) && !QI_strcasestr(desc, filters.namefilter) && !QI_strcasestr(author, filters.namefilter))
{ {

View file

@ -13,12 +13,13 @@ You can probably get a better version from somewhere.
int Q_vsnprintf(char *buffer, size_t maxlen, const char *format, va_list vargs) int Q_vsnprintf(char *buffer, size_t maxlen, const char *format, va_list vargs)
{ {
int tokens=0; int tokens=0;
const char *string_;
char *string; char *string;
char tempbuffer[64]; char tempbuffer[64];
char sign; char sign;
unsigned int _uint; unsigned int uint_;
int _int; int int_;
float _float; float float_;
int i; int i;
int use0s; int use0s;
int width, useprepad, plus; int width, useprepad, plus;
@ -75,50 +76,50 @@ retry:
*buffer++ = *format; *buffer++ = *format;
break; break;
case 's': case 's':
string = va_arg(vargs, char *); string_ = va_arg(vargs, char *);
if (!string) if (!string_)
string = "(null)"; string_ = "(null)";
if (width) if (width)
{ {
while (*string && width--) while (*string_ && width--)
{ {
if (maxlen-- == 0) if (maxlen-- == 0)
{*buffer++='\0';return tokens;} {*buffer++='\0';return tokens;}
*buffer++ = *string++; *buffer++ = *string_++;
} }
} }
else else
{ {
while (*string) while (*string_)
{ {
if (maxlen-- == 0) if (maxlen-- == 0)
{*buffer++='\0';return tokens;} {*buffer++='\0';return tokens;}
*buffer++ = *string++; *buffer++ = *string_++;
} }
} }
tokens++; tokens++;
break; break;
case 'c': case 'c':
_int = va_arg(vargs, int); int_ = va_arg(vargs, int);
if (maxlen-- == 0) if (maxlen-- == 0)
{*buffer++='\0';return tokens;} {*buffer++='\0';return tokens;}
*buffer++ = _int; *buffer++ = int_;
tokens++; tokens++;
break; break;
case 'p': case 'p':
if (1) if (1)
_uint = (size_t)va_arg(vargs, void*); uint_ = (size_t)va_arg(vargs, void*);
else else
case 'x': case 'x':
_uint = va_arg(vargs, unsigned int); uint_ = va_arg(vargs, unsigned int);
i = sizeof(tempbuffer)-2; i = sizeof(tempbuffer)-2;
tempbuffer[i+1] = '\0'; tempbuffer[i+1] = '\0';
while(_uint) while(uint_)
{ {
tempbuffer[i] = (_uint&0xf) + '0'; tempbuffer[i] = (uint_&0xf) + '0';
if (tempbuffer[i] > '9') if (tempbuffer[i] > '9')
tempbuffer[i] = tempbuffer[i] - ':' + 'a'; tempbuffer[i] = tempbuffer[i] - ':' + 'a';
_uint/=16; uint_/=16;
i--; i--;
} }
string = tempbuffer+i+1; string = tempbuffer+i+1;
@ -153,23 +154,23 @@ retry:
case 'd': case 'd':
case 'u': case 'u':
case 'i': case 'i':
_int = va_arg(vargs, int); int_ = va_arg(vargs, int);
if (useprepad) if (useprepad)
{ {
/* /*
if (_int >= 1000) if (int_ >= 1000)
useprepad = 4; useprepad = 4;
else if (_int >= 100) else if (int_ >= 100)
useprepad = 3; useprepad = 3;
else if (_int >= 10) else if (int_ >= 10)
useprepad = 2; useprepad = 2;
else if (_int >= 0) else if (int_ >= 0)
useprepad = 1; useprepad = 1;
else if (_int <= -1000) else if (int_ <= -1000)
useprepad = 5; useprepad = 5;
else if (_int <= -100) else if (int_ <= -100)
useprepad = 4; useprepad = 4;
else if (_int <= -10) else if (int_ <= -10)
useprepad = 3; useprepad = 3;
else else
useprepad = 2; useprepad = 2;
@ -186,10 +187,10 @@ Con_Printf("add %i chars\n", useprepad);
Con_Printf("%i bytes left\n", maxlen); Con_Printf("%i bytes left\n", maxlen);
*/ */
} }
if (_int < 0) if (int_ < 0)
{ {
sign = '-'; sign = '-';
_int *= -1; int_ *= -1;
} }
else if (plus) else if (plus)
sign = '+'; sign = '+';
@ -197,10 +198,10 @@ Con_Printf("%i bytes left\n", maxlen);
sign = 0; sign = 0;
i = sizeof(tempbuffer)-2; i = sizeof(tempbuffer)-2;
tempbuffer[sizeof(tempbuffer)-1] = '\0'; tempbuffer[sizeof(tempbuffer)-1] = '\0';
while(_int) while(int_)
{ {
tempbuffer[i--] = _int%10 + '0'; tempbuffer[i--] = int_%10 + '0';
_int/=10; int_/=10;
} }
if (sign) if (sign)
tempbuffer[i--] = sign; tempbuffer[i--] = sign;
@ -242,29 +243,29 @@ Con_Printf("%i bytes left\n", maxlen);
tokens++; tokens++;
break; break;
case 'f': case 'f':
_float = (float)va_arg(vargs, double); float_ = (float)va_arg(vargs, double);
//integer part. //integer part.
_int = (int)_float; int_ = (int)float_;
if (_int < 0) if (int_ < 0)
{ {
if (maxlen-- == 0) if (maxlen-- == 0)
{*buffer++='\0';return tokens;} {*buffer++='\0';return tokens;}
*buffer++ = '-'; *buffer++ = '-';
_int *= -1; int_ *= -1;
} }
i = sizeof(tempbuffer)-2; i = sizeof(tempbuffer)-2;
tempbuffer[sizeof(tempbuffer)-1] = '\0'; tempbuffer[sizeof(tempbuffer)-1] = '\0';
if (!_int) if (!int_)
{ {
tempbuffer[i--] = '0'; tempbuffer[i--] = '0';
} }
else else
{ {
while(_int) while(int_)
{ {
tempbuffer[i--] = _int%10 + '0'; tempbuffer[i--] = int_%10 + '0';
_int/=10; int_/=10;
} }
} }
string = tempbuffer+i+1; string = tempbuffer+i+1;
@ -275,21 +276,21 @@ Con_Printf("%i bytes left\n", maxlen);
*buffer++ = *string++; *buffer++ = *string++;
} }
_int = sizeof(tempbuffer)-2-i; int_ = sizeof(tempbuffer)-2-i;
//floating point part. //floating point part.
_float -= (int)_float; float_ -= (int)float_;
i = 0; i = 0;
tempbuffer[i++] = '.'; tempbuffer[i++] = '.';
if (precision < 0) if (precision < 0)
precision = 7; precision = 7;
while(_float - (int)_float) while(float_ - (int)float_)
{ {
if (i > precision) //remove the excess presision. if (i > precision) //remove the excess presision.
break; break;
_float*=10; float_*=10;
tempbuffer[i++] = (int)_float%10 + '0'; tempbuffer[i++] = (int)float_%10 + '0';
} }
if (i == 1) //no actual fractional part if (i == 1) //no actual fractional part
{ {
@ -310,12 +311,12 @@ Con_Printf("%i bytes left\n", maxlen);
tokens++; tokens++;
break; break;
default: default:
string = "ERROR IN FORMAT"; string_ = "ERROR IN FORMAT";
while (*string) while (*string_)
{ {
if (maxlen-- == 0) if (maxlen-- == 0)
{*buffer++='\0';return tokens;} {*buffer++='\0';return tokens;}
*buffer++ = *string++; *buffer++ = *string_++;
} }
break; break;
} }
@ -635,7 +636,7 @@ char *Plug_Info_ValueForKey (const char *s, const char *key, char *out, size_t o
isvalue = !isvalue; isvalue = !isvalue;
if (isvalue) if (isvalue)
{ {
if (strlen(key) == s - start && !strncmp(start, key, s - start)) if (strlen(key) == (size_t)(s - start) && !strncmp(start, key, s - start))
{ {
s++; s++;
while (outsize --> 1) while (outsize --> 1)