You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
5.2 KiB
322 lines
5.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include <windows.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include <stdlib.h> |
|
#include <stdarg.h> |
|
#include "goldsrc_standin.h" |
|
|
|
|
|
extern int errno; |
|
|
|
|
|
static unsigned short g_InitialColor = 0xFFFF; |
|
static unsigned short g_LastColor = 0xFFFF; |
|
static unsigned short g_BadColor = 0xFFFF; |
|
static WORD g_BackgroundFlags = 0xFFFF; |
|
static bool g_bGotInitialColors = false; |
|
|
|
static void GetInitialColors( ) |
|
{ |
|
if ( g_bGotInitialColors ) |
|
return; |
|
|
|
g_bGotInitialColors = true; |
|
|
|
// Get the old background attributes. |
|
CONSOLE_SCREEN_BUFFER_INFO oldInfo; |
|
GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &oldInfo ); |
|
g_InitialColor = g_LastColor = oldInfo.wAttributes & (FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY); |
|
g_BackgroundFlags = oldInfo.wAttributes & (BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_INTENSITY); |
|
|
|
g_BadColor = 0; |
|
if (g_BackgroundFlags & BACKGROUND_RED) |
|
g_BadColor |= FOREGROUND_RED; |
|
if (g_BackgroundFlags & BACKGROUND_GREEN) |
|
g_BadColor |= FOREGROUND_GREEN; |
|
if (g_BackgroundFlags & BACKGROUND_BLUE) |
|
g_BadColor |= FOREGROUND_BLUE; |
|
if (g_BackgroundFlags & BACKGROUND_INTENSITY) |
|
g_BadColor |= FOREGROUND_INTENSITY; |
|
} |
|
|
|
static WORD SetConsoleTextColor( int red, int green, int blue, int intensity ) |
|
{ |
|
GetInitialColors(); |
|
|
|
WORD ret = g_LastColor; |
|
|
|
g_LastColor = 0; |
|
if( red ) g_LastColor |= FOREGROUND_RED; |
|
if( green ) g_LastColor |= FOREGROUND_GREEN; |
|
if( blue ) g_LastColor |= FOREGROUND_BLUE; |
|
if( intensity ) g_LastColor |= FOREGROUND_INTENSITY; |
|
|
|
// Just use the initial color if there's a match... |
|
if (g_LastColor == g_BadColor) |
|
g_LastColor = g_InitialColor; |
|
|
|
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), g_LastColor | g_BackgroundFlags ); |
|
return ret; |
|
} |
|
|
|
|
|
static void RestoreConsoleTextColor( WORD color ) |
|
{ |
|
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), color | g_BackgroundFlags ); |
|
g_LastColor = color; |
|
} |
|
|
|
|
|
void Msg( const char *pMsg, ... ) |
|
{ |
|
va_list marker; |
|
va_start( marker, pMsg ); |
|
vprintf( pMsg, marker ); |
|
va_end( marker ); |
|
} |
|
|
|
|
|
void Warning( const char *pMsg, ... ) |
|
{ |
|
WORD old = SetConsoleTextColor( 1, 1, 0, 1 ); |
|
|
|
va_list marker; |
|
va_start( marker, pMsg ); |
|
vprintf( pMsg, marker ); |
|
va_end( marker ); |
|
|
|
RestoreConsoleTextColor( old ); |
|
} |
|
|
|
|
|
void Error (const char *error, ...) |
|
{ |
|
WORD old = SetConsoleTextColor( 1, 0, 0, 1 ); |
|
|
|
va_list argptr; |
|
|
|
printf ("\n************ ERROR ************\n"); |
|
|
|
va_start (argptr,error); |
|
vprintf (error,argptr); |
|
va_end (argptr); |
|
printf ("\n"); |
|
|
|
extern void PrintExitStuff(); |
|
PrintExitStuff(); |
|
|
|
RestoreConsoleTextColor( old ); |
|
|
|
TerminateProcess( GetCurrentProcess(), 100 ); |
|
} |
|
|
|
|
|
/* |
|
================ |
|
filelength |
|
================ |
|
*/ |
|
int filelength (FILE *f) |
|
{ |
|
int pos; |
|
int end; |
|
|
|
pos = ftell (f); |
|
fseek (f, 0, SEEK_END); |
|
end = ftell (f); |
|
fseek (f, pos, SEEK_SET); |
|
|
|
return end; |
|
} |
|
|
|
|
|
FILE *SafeOpenWrite (char *filename) |
|
{ |
|
FILE *f; |
|
|
|
f = fopen(filename, "wb"); |
|
|
|
if (!f) |
|
Error ("Error opening %s: %s",filename,strerror(errno)); |
|
|
|
return f; |
|
} |
|
|
|
FILE *SafeOpenRead (char *filename) |
|
{ |
|
FILE *f; |
|
|
|
f = fopen(filename, "rb"); |
|
|
|
if (!f) |
|
Error ("Error opening %s: %s",filename,strerror(errno)); |
|
|
|
return f; |
|
} |
|
|
|
|
|
void SafeRead (FILE *f, void *buffer, int count) |
|
{ |
|
if ( fread (buffer, 1, count, f) != (size_t)count) |
|
Error ("File read failure"); |
|
} |
|
|
|
|
|
void SafeWrite (FILE *f, void *buffer, int count) |
|
{ |
|
if (fwrite (buffer, 1, count, f) != (size_t)count) |
|
Error ("File read failure"); |
|
} |
|
|
|
|
|
|
|
/* |
|
============== |
|
LoadFile |
|
============== |
|
*/ |
|
int LoadFile (char *filename, void **bufferptr) |
|
{ |
|
FILE *f; |
|
int length; |
|
void *buffer; |
|
|
|
f = SafeOpenRead (filename); |
|
length = filelength (f); |
|
buffer = malloc (length+1); |
|
((char *)buffer)[length] = 0; |
|
SafeRead (f, buffer, length); |
|
fclose (f); |
|
|
|
*bufferptr = buffer; |
|
return length; |
|
} |
|
|
|
|
|
void SaveFile (char *filename, void *buffer, int count) |
|
{ |
|
FILE *f; |
|
|
|
f = SafeOpenWrite (filename); |
|
SafeWrite (f, buffer, count); |
|
fclose (f); |
|
} |
|
|
|
|
|
#ifdef __BIG_ENDIAN__ |
|
|
|
short LittleShort (short l) |
|
{ |
|
byte b1,b2; |
|
|
|
b1 = l&255; |
|
b2 = (l>>8)&255; |
|
|
|
return (b1<<8) + b2; |
|
} |
|
|
|
short BigShort (short l) |
|
{ |
|
return l; |
|
} |
|
|
|
|
|
int LittleLong (int l) |
|
{ |
|
byte b1,b2,b3,b4; |
|
|
|
b1 = l&255; |
|
b2 = (l>>8)&255; |
|
b3 = (l>>16)&255; |
|
b4 = (l>>24)&255; |
|
|
|
return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; |
|
} |
|
|
|
int BigLong (int l) |
|
{ |
|
return l; |
|
} |
|
|
|
|
|
float LittleFloat (float l) |
|
{ |
|
union {byte b[4]; float f;} in, out; |
|
|
|
in.f = l; |
|
out.b[0] = in.b[3]; |
|
out.b[1] = in.b[2]; |
|
out.b[2] = in.b[1]; |
|
out.b[3] = in.b[0]; |
|
|
|
return out.f; |
|
} |
|
|
|
float BigFloat (float l) |
|
{ |
|
return l; |
|
} |
|
|
|
|
|
#else |
|
|
|
|
|
short BigShort (short l) |
|
{ |
|
byte b1,b2; |
|
|
|
b1 = l&255; |
|
b2 = (l>>8)&255; |
|
|
|
return (b1<<8) + b2; |
|
} |
|
|
|
short LittleShort (short l) |
|
{ |
|
return l; |
|
} |
|
|
|
|
|
int BigLong (int l) |
|
{ |
|
byte b1,b2,b3,b4; |
|
|
|
b1 = l&255; |
|
b2 = (l>>8)&255; |
|
b3 = (l>>16)&255; |
|
b4 = (l>>24)&255; |
|
|
|
return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; |
|
} |
|
|
|
int LittleLong (int l) |
|
{ |
|
return l; |
|
} |
|
|
|
float BigFloat (float l) |
|
{ |
|
union {byte b[4]; float f;} in, out; |
|
|
|
in.f = l; |
|
out.b[0] = in.b[3]; |
|
out.b[1] = in.b[2]; |
|
out.b[2] = in.b[1]; |
|
out.b[3] = in.b[0]; |
|
|
|
return out.f; |
|
} |
|
|
|
float LittleFloat (float l) |
|
{ |
|
return l; |
|
} |
|
|
|
|
|
#endif
|
|
|