Directory restructuring to make it easier to version projects that don't build zdoom.exe.
SVN r4 (trunk)
This commit is contained in:
commit
cf11cbdb30
821 changed files with 361202 additions and 0 deletions
339
src/cmdlib.cpp
Normal file
339
src/cmdlib.cpp
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
// cmdlib.c (mostly borrowed from the Q2 source)
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
#include "doomtype.h"
|
||||
#include "cmdlib.h"
|
||||
#include "i_system.h"
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "m_alloc.h"
|
||||
|
||||
/*
|
||||
progdir will hold the path up to the game directory, including the slash
|
||||
|
||||
f:\quake\
|
||||
/raid/quake/
|
||||
|
||||
gamedir will hold progdir + the game directory (id1, id2, etc)
|
||||
|
||||
*/
|
||||
|
||||
char progdir[1024];
|
||||
|
||||
static inline bool IsSeperator (int c)
|
||||
{
|
||||
if (c == '/')
|
||||
return true;
|
||||
#ifdef WIN32
|
||||
if (c == '\\' || c == ':')
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
void FixPathSeperator (char *path)
|
||||
{
|
||||
while (*path)
|
||||
{
|
||||
if (*path == '\\')
|
||||
*path = '/';
|
||||
path++;
|
||||
}
|
||||
}
|
||||
|
||||
char *copystring (const char *s)
|
||||
{
|
||||
char *b;
|
||||
if (s)
|
||||
{
|
||||
size_t len = strlen (s) + 1;
|
||||
b = new char[len];
|
||||
memcpy (b, s, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
b = new char[1];
|
||||
b[0] = '\0';
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
void ReplaceString (char **ptr, const char *str)
|
||||
{
|
||||
if (*ptr)
|
||||
{
|
||||
if (*ptr == str)
|
||||
return;
|
||||
delete[] *ptr;
|
||||
}
|
||||
*ptr = copystring (str);
|
||||
}
|
||||
|
||||
/*
|
||||
=============================================================================
|
||||
|
||||
MISC FUNCTIONS
|
||||
|
||||
=============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Q_filelength
|
||||
================
|
||||
*/
|
||||
int Q_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;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
FileExists
|
||||
==============
|
||||
*/
|
||||
BOOL FileExists (const char *filename)
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
// [RH] Empty filenames are never there
|
||||
if (*filename == 0)
|
||||
return false;
|
||||
|
||||
f = fopen (filename, "r");
|
||||
if (!f)
|
||||
return false;
|
||||
fclose (f);
|
||||
return true;
|
||||
}
|
||||
|
||||
void DefaultExtension (char *path, const char *extension)
|
||||
{
|
||||
char *src;
|
||||
//
|
||||
// if path doesn't have a .EXT, append extension
|
||||
// (extension should include the .)
|
||||
//
|
||||
src = path + strlen(path) - 1;
|
||||
|
||||
while (src != path && !IsSeperator(*src))
|
||||
{
|
||||
if (*src == '.')
|
||||
return; // it has an extension
|
||||
src--;
|
||||
}
|
||||
|
||||
strcat (path, extension);
|
||||
}
|
||||
|
||||
void DefaultExtension (string &path, const char *extension)
|
||||
{
|
||||
char *src = &path[int(path.Len())-1];
|
||||
|
||||
while (src != &path[0] && !IsSeperator(*src))
|
||||
{
|
||||
if (*src == '.')
|
||||
return; // it has an extension
|
||||
src--;
|
||||
}
|
||||
|
||||
path += extension;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
====================
|
||||
Extract file parts
|
||||
====================
|
||||
*/
|
||||
// FIXME: should include the slash, otherwise
|
||||
// backing to an empty path will be wrong when appending a slash
|
||||
void ExtractFilePath (const char *path, char *dest)
|
||||
{
|
||||
const char *src;
|
||||
|
||||
src = path + strlen(path) - 1;
|
||||
|
||||
//
|
||||
// back up until a \ or the start
|
||||
//
|
||||
while (src != path && !IsSeperator(*(src-1)))
|
||||
src--;
|
||||
|
||||
memcpy (dest, path, src-path);
|
||||
dest[src-path] = 0;
|
||||
}
|
||||
|
||||
void ExtractFileBase (const char *path, char *dest)
|
||||
{
|
||||
const char *src;
|
||||
|
||||
src = path + strlen(path) - 1;
|
||||
|
||||
if (src >= path)
|
||||
{
|
||||
// back up until a / or the start
|
||||
while (src != path && !IsSeperator(*(src-1)))
|
||||
src--;
|
||||
|
||||
// Check for files with drive specification but no path
|
||||
#if defined(_WIN32) || defined(DOS)
|
||||
if (src == path && src[0] != 0)
|
||||
{
|
||||
if (src[1] == ':')
|
||||
src += 2;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (*src && *src != '.')
|
||||
{
|
||||
*dest++ = *src++;
|
||||
}
|
||||
}
|
||||
*dest = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
ParseNum / ParseHex
|
||||
==============
|
||||
*/
|
||||
int ParseHex (char *hex)
|
||||
{
|
||||
char *str;
|
||||
int num;
|
||||
|
||||
num = 0;
|
||||
str = hex;
|
||||
|
||||
while (*str)
|
||||
{
|
||||
num <<= 4;
|
||||
if (*str >= '0' && *str <= '9')
|
||||
num += *str-'0';
|
||||
else if (*str >= 'a' && *str <= 'f')
|
||||
num += 10 + *str-'a';
|
||||
else if (*str >= 'A' && *str <= 'F')
|
||||
num += 10 + *str-'A';
|
||||
else {
|
||||
Printf ("Bad hex number: %s\n",hex);
|
||||
return 0;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
int ParseNum (char *str)
|
||||
{
|
||||
if (str[0] == '$')
|
||||
return ParseHex (str+1);
|
||||
if (str[0] == '0' && str[1] == 'x')
|
||||
return ParseHex (str+2);
|
||||
return atol (str);
|
||||
}
|
||||
|
||||
|
||||
// [RH] Returns true if the specified string is a valid decimal number
|
||||
|
||||
BOOL IsNum (char *str)
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
if (((*str < '0') || (*str > '9')) && (*str != '-'))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// [RH] Checks if text matches the wildcard pattern using ? or *
|
||||
|
||||
bool CheckWildcards (const char *pattern, const char *text)
|
||||
{
|
||||
if (pattern == NULL || text == NULL)
|
||||
return true;
|
||||
|
||||
while (*pattern)
|
||||
{
|
||||
if (*pattern == '*')
|
||||
{
|
||||
char stop = tolower (*++pattern);
|
||||
while (*text && tolower(*text) != stop)
|
||||
{
|
||||
text++;
|
||||
}
|
||||
if (*text && tolower(*text) == stop)
|
||||
{
|
||||
if (CheckWildcards (pattern, text++))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
pattern--;
|
||||
}
|
||||
}
|
||||
else if (*pattern == '?' || tolower(*pattern) == tolower(*text))
|
||||
{
|
||||
pattern++;
|
||||
text++;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return (*pattern | *text) == 0;
|
||||
}
|
||||
|
||||
// [RH] Print a GUID to a text buffer using the standard format.
|
||||
|
||||
void FormatGUID (char *text, const GUID &guid)
|
||||
{
|
||||
sprintf (text, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||
guid.Data1, guid.Data2, guid.Data3,
|
||||
guid.Data4[0], guid.Data4[1],
|
||||
guid.Data4[2], guid.Data4[3],
|
||||
guid.Data4[4], guid.Data4[5],
|
||||
guid.Data4[6], guid.Data4[7]);
|
||||
}
|
||||
|
||||
// [RH] Returns the current local time as ASCII, even if it's too early
|
||||
char *myasctime ()
|
||||
{
|
||||
time_t clock;
|
||||
struct tm *lt;
|
||||
|
||||
time (&clock);
|
||||
lt = localtime (&clock);
|
||||
if (lt != NULL)
|
||||
{
|
||||
return asctime (lt);
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Pre Jan 01 00:00:00 1970\n";
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue