q3rally/engine/code/sys/con_log.c
zturtleman 95fbb18fa1 ioquake3 resync to revision 3385 from 3347.
Fix going to previous browser source in q3_ui
Limit ui_smallFont/ui_bigFont/cg_noTaunt cvars to missionpack
Fix team chat box for spectators
Don't draw crosshair 0 in Team Arena setup menu
Make client for Windows x86_64 use OpenAL64.dll by default
Fix loading renderer DLLs on Windows x86
Add Windows application manifest
Disable DPI scaling on Windows
ignore window resize event on fullscreen
Don't reload arenas.txt/*.arena files in Team Arena UI
Fix crash when out of memory in Team Arena's String_Alloc
Fix in_nograb not releasing the mouse cursor
Update UI player animation handling to match CGame
Fix specifying minimum mac os version in make-macosx.sh
Fix listen server sending snapshots each client frame
Statically link libgcc on Windows
Fix hit accuracy stats for lightning gun and shotgun kills
Don't link to libGL at compile time
Add common OpenGL version parsing + OpenGL 3 fixes
Support parsing OpenGL ES version strings
Fix setting cflags/libs from sdl2-config
Load OpenGL ES 1.1 function procs
[qcommon] Use unsigned types where wrapping arithmetic is intended
OpenGL2: Fix brightness when r_autoExposure is disabled
OpenGL2: Fix MD3 surface with zero shaders dividing by zero
[botlib/be_aas_def.h] Change array size from MAX_PATH to MAX_QPATH
Don't redefine MAX_PATH in bot code
Fix memory leak in (unused) AAS_FloodAreas()
Fix compiling GLSL shaders under Windows.
Only draw cm_patch/bot debug polygons in world scenes
Fix reading crash log when log wraps around buffer
Don't send team overlay info to bots
Fix a race condition in the makedirs target
Fix shader corruption on OpenBSD
2017-11-04 11:30:30 +00:00

129 lines
2.9 KiB
C

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#include "../qcommon/q_shared.h"
#include "../qcommon/qcommon.h"
#include "sys_local.h"
#define MAX_LOG 32768
static char consoleLog[ MAX_LOG ];
static unsigned int writePos = 0;
static unsigned int readPos = 0;
/*
==================
CON_LogSize
==================
*/
unsigned int CON_LogSize( void )
{
if( readPos <= writePos )
return writePos - readPos;
else
return writePos + MAX_LOG - readPos;
}
/*
==================
CON_LogFree
==================
*/
static unsigned int CON_LogFree( void )
{
return MAX_LOG - CON_LogSize( ) - 1;
}
/*
==================
CON_LogWrite
==================
*/
unsigned int CON_LogWrite( const char *in )
{
unsigned int length = strlen( in );
unsigned int firstChunk;
unsigned int secondChunk;
while( CON_LogFree( ) < length && CON_LogSize( ) > 0 )
{
// Free enough space
while( consoleLog[ readPos ] != '\n' && CON_LogSize( ) > 1 )
readPos = ( readPos + 1 ) % MAX_LOG;
// Skip past the '\n'
readPos = ( readPos + 1 ) % MAX_LOG;
}
if( CON_LogFree( ) < length )
return 0;
if( writePos + length > MAX_LOG )
{
firstChunk = MAX_LOG - writePos;
secondChunk = length - firstChunk;
}
else
{
firstChunk = length;
secondChunk = 0;
}
Com_Memcpy( consoleLog + writePos, in, firstChunk );
Com_Memcpy( consoleLog, in + firstChunk, secondChunk );
writePos = ( writePos + length ) % MAX_LOG;
return length;
}
/*
==================
CON_LogRead
==================
*/
unsigned int CON_LogRead( char *out, unsigned int outSize )
{
unsigned int firstChunk;
unsigned int secondChunk;
if( CON_LogSize( ) < outSize )
outSize = CON_LogSize( );
if( readPos + outSize > MAX_LOG )
{
firstChunk = MAX_LOG - readPos;
secondChunk = outSize - firstChunk;
}
else
{
firstChunk = outSize;
secondChunk = 0;
}
Com_Memcpy( out, consoleLog + readPos, firstChunk );
Com_Memcpy( out + firstChunk, consoleLog, secondChunk );
readPos = ( readPos + outSize ) % MAX_LOG;
return outSize;
}