WIP MSVC support

This commit is contained in:
Eric Wasylishen 2015-11-19 14:38:50 -08:00
parent b3472d89e7
commit f70557ea85
14 changed files with 192 additions and 91 deletions

View File

@ -18,7 +18,10 @@
*/
#include <stdint.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include <common/cmdlib.h>
#include <common/bspfile.h>

View File

@ -23,21 +23,20 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#ifdef WIN32
#include <direct.h>
#endif
#ifdef NeXT
#include <libc.h>
#include <windows.h>
#endif
#ifdef LINUX
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#endif
#include <stdint.h>
#define PATHSEPERATOR '/'
/* set these before calling CheckParm */
@ -161,7 +160,7 @@ ExpandPathAndArchive(char *path)
if (archive) {
sprintf(archivename, "%s/%s", archivedir, path);
CopyFile(expanded, archivename);
Q_CopyFile(expanded, archivename);
}
return expanded;
}
@ -185,11 +184,19 @@ copystring(const char *s)
double
I_FloatTime(void)
{
#ifdef WIN32
FILETIME ft;
uint64_t hundred_ns;
GetSystemTimeAsFileTime(&ft);
hundred_ns = (((uint64_t)ft.dwHighDateTime) << 32) + ((uint64_t)ft.dwLowDateTime);
return (double)hundred_ns / 10000000.0;
#else
struct timeval tv;
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + (tv.tv_usec / 1000000.0);
#endif
}
void
@ -903,12 +910,12 @@ CreatePath(char *path)
/*
* ============
* CopyFile
* Q_CopyFile
* Used to archive source files
*============
*/
void
CopyFile(const char *from, char *to)
Q_CopyFile(const char *from, char *to)
{
void *buffer;
int length;

View File

@ -27,13 +27,23 @@
#include <ctype.h>
#include <time.h>
#include <stdarg.h>
#include <stdbool.h>
#define stringify__(x) #x
#define stringify(x) stringify__(x)
typedef enum { false, true } qboolean;
typedef bool qboolean;
typedef unsigned char byte;
#ifndef __GNUC__
#define __attribute__(x)
#endif
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
#ifdef __GNUC__
/* min and max macros with type checking */
#define qmax(a,b) ({ \
typeof(a) a_ = (a); \
@ -47,6 +57,10 @@ typedef unsigned char byte;
(void)(&a_ == &b_); \
(a_ < b_) ? a_ : b_; \
})
#else
#define qmax(a,b) (((a)>(b)) ? (a) : (b))
#define qmin(a,b) (((a)>(b)) ? (b) : (a))
#endif
/* set these before calling CheckParm */
extern int myargc;
@ -115,7 +129,7 @@ void CRC_ProcessByte(unsigned short *crcvalue, byte data);
unsigned short CRC_Value(unsigned short crcvalue);
void CreatePath(char *path);
void CopyFile(const char *from, char *to);
void Q_CopyFile(const char *from, char *to);
extern qboolean archive;
extern char archivedir[1024];

View File

@ -29,6 +29,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <common/cmdlib.h>
void init_log(const char *filename);
void close_log();

View File

@ -24,9 +24,19 @@
#include <string.h>
/* Use some GCC builtins */
#ifndef ffsl
#if !defined(ffsl) && defined(__GNUC__)
#define ffsl __builtin_ffsl
#elif defined(WIN32)
inline int ffsl(long int val)
{
unsigned long indexout;
unsigned char res = _BitScanForward(&indexout, val);
if (!res) return 0;
else return indexout + 1;
}
#endif
#ifndef offsetof
#define offsetof(type, member) __builtin_offsetof(type, member)
#endif

View File

@ -1146,7 +1146,7 @@ static void SubdividePolygon (const bsp2_dface_t *face, const bsp2_t *bsp, int n
const char *texname = miptex->name;
for (i=0; i<num_surfacelight_templates; i++) {
if (!strcasecmp(texname, ValueForKey(surfacelight_templates[i], "_surface"))) {
if (!Q_strcasecmp(texname, ValueForKey(surfacelight_templates[i], "_surface"))) {
CreateSurfaceLightOnFaceSubdivision(face, surfacelight_templates[i], bsp, numverts, verts);
}
}

View File

@ -307,7 +307,7 @@ FindTargetEntity(const char *target)
for (i = 0, entity = map.entities; i < map.numentities; i++, entity++) {
name = ValueForKey(entity, "targetname");
if (!strcasecmp(target, name))
if (!Q_strcasecmp(target, name))
return entity;
}
@ -378,7 +378,7 @@ CreateBrushFaces(hullbrush_t *hullbrush, const vec3_t rotate_offset,
/* Don't generate hintskip faces */
const texinfo_t *texinfo = pWorldEnt->lumps[LUMP_TEXINFO].data;
const char *texname = map.miptex[texinfo[mapface->texinfo].miptex];
if (!strcasecmp(texname, "hintskip"))
if (!Q_strcasecmp(texname, "hintskip"))
continue;
}
@ -787,20 +787,20 @@ Brush_GetContents(const mapbrush_t *mapbrush)
mapface = mapbrush->faces;
texname = map.miptex[texinfo[mapface->texinfo].miptex];
if (!strcasecmp(texname, "hint") || !strcasecmp(texname, "hintskip"))
if (!Q_strcasecmp(texname, "hint") || !Q_strcasecmp(texname, "hintskip"))
return CONTENTS_HINT;
if (!strcasecmp(texname, "clip"))
if (!Q_strcasecmp(texname, "clip"))
return CONTENTS_CLIP;
if (texname[0] == '*') {
if (!strncasecmp(texname + 1, "lava", 4))
if (!Q_strncasecmp(texname + 1, "lava", 4))
return CONTENTS_LAVA;
if (!strncasecmp(texname + 1, "slime", 5))
if (!Q_strncasecmp(texname + 1, "slime", 5))
return CONTENTS_SLIME;
return CONTENTS_WATER;
}
if (!strncasecmp(texname, "sky", 3))
if (!Q_strncasecmp(texname, "sky", 3))
return CONTENTS_SKY;
return CONTENTS_SOLID;
@ -948,7 +948,7 @@ Brush_LoadEntity(mapentity_t *dst, const mapentity_t *src, const int hullnum)
}
/* If the source entity is func_detail, set the content flag */
if (!strcasecmp(classname, "func_detail"))
if (!Q_strcasecmp(classname, "func_detail"))
cflags |= CFLAGS_DETAIL;
mapbrush = src->mapbrushes;

View File

@ -23,9 +23,16 @@
#include "qbsp.h"
#include <sys/types.h>
#include <sys/time.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#endif
#ifdef LINUX
#include <sys/time.h>
#endif
#define PATHSEPERATOR '/'
char *
@ -48,11 +55,19 @@ I_FloatTime
double
I_FloatTime(void)
{
struct timeval tv;
#ifdef WIN32
FILETIME ft;
uint64_t hundred_ns;
GetSystemTimeAsFileTime(&ft);
hundred_ns = (((uint64_t)ft.dwHighDateTime) << 32) + ((uint64_t)ft.dwLowDateTime);
return (double)hundred_ns / 10000000.0;
#else
struct timeval tv;
gettimeofday(&tv, NULL);
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + (tv.tv_usec / 1000000.0);
return (double)tv.tv_sec + (tv.tv_usec / 1000000.0);
#endif
}
@ -117,3 +132,36 @@ IsAbsolutePath(const char *path)
{
return path[0] == PATHSEPERATOR || (isalpha(path[0]) && path[1] == ':');
}
int
Q_strncasecmp(const char *s1, const char *s2, int n)
{
int c1, c2;
while (1) {
c1 = *s1++;
c2 = *s2++;
if (!n--)
return 0; /* strings are equal until end point */
if (c1 != c2) {
if (c1 >= 'a' && c1 <= 'z')
c1 -= ('a' - 'A');
if (c2 >= 'a' && c2 <= 'z')
c2 -= ('a' - 'A');
if (c1 != c2)
return -1; /* strings not equal */
}
if (!c1)
return 0; /* strings are equal */
}
return -1;
}
int
Q_strcasecmp(const char *s1, const char *s2)
{
return Q_strncasecmp(s1, s2, 99999);
}

View File

@ -60,7 +60,7 @@ AddAnimTex(const char *name)
for (i = 0; i < frame; i++) {
framename[1] = basechar + i;
for (j = 0; j < map.nummiptex; j++) {
if (!strcasecmp(framename, map.miptex[j]))
if (!Q_strcasecmp(framename, map.miptex[j]))
break;
}
if (j < map.nummiptex)
@ -85,7 +85,7 @@ FindMiptex(const char *name)
name = pathsep + 1;
for (i = 0; i < map.nummiptex; i++) {
if (!strcasecmp(name, map.miptex[i]))
if (!Q_strcasecmp(name, map.miptex[i]))
return i;
}
if (map.nummiptex == map.maxmiptex)
@ -108,13 +108,13 @@ IsSkipName(const char *name)
{
if (options.fNoskip)
return false;
if (!strcasecmp(name, "skip"))
if (!Q_strcasecmp(name, "skip"))
return true;
if (!strcasecmp(name, "*waterskip"))
if (!Q_strcasecmp(name, "*waterskip"))
return true;
if (!strcasecmp(name, "*slimeskip"))
if (!Q_strcasecmp(name, "*slimeskip"))
return true;
if (!strcasecmp(name, "*lavaskip"))
if (!Q_strcasecmp(name, "*lavaskip"))
return true;
return false;
}
@ -124,7 +124,7 @@ IsSplitName(const char *name)
{
if (options.fSplitspecial)
return false;
if (name[0] == '*' || !strncasecmp(name, "sky", 3))
if (name[0] == '*' || !Q_strncasecmp(name, "sky", 3))
return true;
return false;
}
@ -132,9 +132,9 @@ IsSplitName(const char *name)
static bool
IsHintName(const char *name)
{
if (!strcasecmp(name, "hint"))
if (!Q_strcasecmp(name, "hint"))
return true;
if (!strcasecmp(name, "hintskip"))
if (!Q_strcasecmp(name, "hintskip"))
return true;
return false;
}
@ -216,16 +216,16 @@ ParseEpair(parser_t *parser, mapentity_t *entity)
goto parse_error;
epair->value = copystring(parser->token);
if (!strcasecmp(epair->key, "origin")) {
if (!Q_strcasecmp(epair->key, "origin")) {
GetVectorForKey(entity, epair->key, entity->origin);
} else if (!strcasecmp(epair->key, "classname")) {
if (!strcasecmp(epair->value, "info_player_start")) {
} else if (!Q_strcasecmp(epair->key, "classname")) {
if (!Q_strcasecmp(epair->value, "info_player_start")) {
if (rgfStartSpots & info_player_start)
Message(msgWarning, warnMultipleStarts);
rgfStartSpots |= info_player_start;
} else if (!strcasecmp(epair->value, "info_player_deathmatch")) {
} else if (!Q_strcasecmp(epair->value, "info_player_deathmatch")) {
rgfStartSpots |= info_player_deathmatch;
} else if (!strcasecmp(epair->value, "info_player_coop")) {
} else if (!Q_strcasecmp(epair->value, "info_player_coop")) {
rgfStartSpots |= info_player_coop;
}
}
@ -712,9 +712,9 @@ IsWorldBrushEntity(const mapentity_t *entity)
{
const char *classname = ValueForKey(entity, "classname");
if (!strcasecmp(classname, "func_detail"))
if (!Q_strcasecmp(classname, "func_detail"))
return true;
if (!strcasecmp(classname, "func_group"))
if (!Q_strcasecmp(classname, "func_group"))
return true;
return false;
}
@ -786,7 +786,7 @@ ValueForKey(const mapentity_t *entity, const char *key)
const epair_t *ep;
for (ep = entity->epairs; ep; ep = ep->next)
if (!strcasecmp(ep->key, key))
if (!Q_strcasecmp(ep->key, key))
return ep->value;
return "";
@ -799,7 +799,7 @@ SetKeyValue(mapentity_t *entity, const char *key, const char *value)
epair_t *ep;
for (ep = entity->epairs; ep; ep = ep->next)
if (!strcasecmp(ep->key, key)) {
if (!Q_strcasecmp(ep->key, key)) {
free(ep->value); /* FIXME */
ep->value = copystring(value);
return;

View File

@ -53,9 +53,9 @@ ProcessEntity(mapentity_t *entity, const int hullnum)
* worldspawn
*/
classname = ValueForKey(entity, "classname");
if (!strcasecmp(classname, "func_group"))
if (!Q_strcasecmp(classname, "func_group"))
return;
if (!strcasecmp(classname, "func_detail"))
if (!Q_strcasecmp(classname, "func_detail"))
return;
if (entity != pWorldEnt) {
@ -104,7 +104,7 @@ ProcessEntity(mapentity_t *entity, const int hullnum)
source = map.entities + 1;
for (i = 1; i < map.numentities; i++, source++) {
classname = ValueForKey(source, "classname");
if (!strcasecmp(classname, "func_group"))
if (!Q_strcasecmp(classname, "func_group"))
Brush_LoadEntity(entity, source, hullnum);
}
@ -113,7 +113,7 @@ ProcessEntity(mapentity_t *entity, const int hullnum)
source = map.entities + 1;
for (i = 1; i < map.numentities; i++, source++) {
classname = ValueForKey(source, "classname");
if (!strcasecmp(classname, "func_detail")) {
if (!Q_strcasecmp(classname, "func_detail")) {
int detailstart = entity->numbrushes;
Brush_LoadEntity(entity, source, hullnum);
detailcount += entity->numbrushes - detailstart;
@ -220,9 +220,9 @@ UpdateEntLump(void)
if (!entity->nummapbrushes)
continue;
classname = ValueForKey(entity, "classname");
if (!strcasecmp(classname, "func_detail"))
if (!Q_strcasecmp(classname, "func_detail"))
continue;
if (!strcasecmp(classname, "func_group"))
if (!Q_strcasecmp(classname, "func_group"))
continue;
snprintf(modname, sizeof(modname), "*%d", modnum);
@ -479,59 +479,59 @@ ParseOptions(char *szOptions)
NameCount++;
} else {
szTok++;
if (!strcasecmp(szTok, "nofill"))
if (!Q_strcasecmp(szTok, "nofill"))
options.fNofill = true;
else if (!strcasecmp(szTok, "noclip"))
else if (!Q_strcasecmp(szTok, "noclip"))
options.fNoclip = true;
else if (!strcasecmp(szTok, "noskip"))
else if (!Q_strcasecmp(szTok, "noskip"))
options.fNoskip = true;
else if (!strcasecmp(szTok, "onlyents"))
else if (!Q_strcasecmp(szTok, "onlyents"))
options.fOnlyents = true;
else if (!strcasecmp(szTok, "verbose"))
else if (!Q_strcasecmp(szTok, "verbose"))
options.fAllverbose = true;
else if (!strcasecmp(szTok, "splitspecial"))
else if (!Q_strcasecmp(szTok, "splitspecial"))
options.fSplitspecial = true;
else if (!strcasecmp(szTok, "notranswater"))
else if (!Q_strcasecmp(szTok, "notranswater"))
options.fTranswater = false;
else if (!strcasecmp(szTok, "transwater"))
else if (!Q_strcasecmp(szTok, "transwater"))
options.fTranswater = true;
else if (!strcasecmp(szTok, "transsky"))
else if (!Q_strcasecmp(szTok, "transsky"))
options.fTranssky = true;
else if (!strcasecmp(szTok, "oldaxis"))
else if (!Q_strcasecmp(szTok, "oldaxis"))
logprint("-oldaxis is now the default and the flag is ignored.\nUse -nooldaxis to get the alternate behaviour.\n");
else if (!strcasecmp(szTok, "nooldaxis"))
else if (!Q_strcasecmp(szTok, "nooldaxis"))
options.fOldaxis = false;
else if (!strcasecmp(szTok, "forcegoodtree"))
else if (!Q_strcasecmp(szTok, "forcegoodtree"))
options.forceGoodTree = true;
else if (!strcasecmp(szTok, "bspleak"))
else if (!Q_strcasecmp(szTok, "bspleak"))
options.fBspleak = true;
else if (!strcasecmp(szTok, "noverbose"))
else if (!Q_strcasecmp(szTok, "noverbose"))
options.fNoverbose = true;
else if (!strcasecmp(szTok, "oldleak"))
else if (!Q_strcasecmp(szTok, "oldleak"))
options.fOldleak = true;
else if (!strcasecmp(szTok, "nopercent"))
else if (!Q_strcasecmp(szTok, "nopercent"))
options.fNopercent = true;
else if (!strcasecmp(szTok, "hexen2"))
else if (!Q_strcasecmp(szTok, "hexen2"))
options.hexen2 = true;
else if (!strcasecmp(szTok, "bsp2")) {
else if (!Q_strcasecmp(szTok, "bsp2")) {
options.BSPVersion = BSP2VERSION;
MemSize = MemSize_BSP2;
} else if (!strcasecmp(szTok, "2psb")) {
} else if (!Q_strcasecmp(szTok, "2psb")) {
options.BSPVersion = BSP2RMQVERSION;
MemSize = MemSize_BSP2rmq;
} else if (!strcasecmp(szTok, "leakdist")) {
} else if (!Q_strcasecmp(szTok, "leakdist")) {
szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
if (!szTok2)
Error("Invalid argument to option %s", szTok);
options.dxLeakDist = atoi(szTok2);
szTok = szTok2;
} else if (!strcasecmp(szTok, "subdivide")) {
} else if (!Q_strcasecmp(szTok, "subdivide")) {
szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
if (!szTok2)
Error("Invalid argument to option %s", szTok);
options.dxSubdivide = atoi(szTok2);
szTok = szTok2;
} else if (!strcasecmp(szTok, "wadpath")) {
} else if (!Q_strcasecmp(szTok, "wadpath")) {
szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
if (!szTok2)
Error("Invalid argument to option %s", szTok);
@ -540,21 +540,21 @@ ParseOptions(char *szOptions)
/* Remove trailing /, if any */
if (options.wadPath[strlen(options.wadPath) - 1] == '/')
options.wadPath[strlen(options.wadPath) - 1] = 0;
} else if (!strcasecmp(szTok, "oldrottex")) {
} else if (!Q_strcasecmp(szTok, "oldrottex")) {
options.fixRotateObjTexture = false;
} else if (!strcasecmp(szTok, "maxnodesize")) {
} else if (!Q_strcasecmp(szTok, "maxnodesize")) {
szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
if (!szTok2)
Error("Invalid argument to option %s", szTok);
options.maxNodeSize= atoi(szTok2);
szTok = szTok2;
} else if (!strcasecmp(szTok, "epsilon")) {
} else if (!Q_strcasecmp(szTok, "epsilon")) {
szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
if (!szTok2)
Error("Invalid argument to option %s", szTok);
options.on_epsilon= atof(szTok2);
szTok = szTok2;
} else if (!strcasecmp(szTok, "?") || !strcasecmp(szTok, "help"))
} else if (!Q_strcasecmp(szTok, "?") || !Q_strcasecmp(szTok, "help"))
PrintOptions();
else
Error("Unknown option '%s'", szTok);

View File

@ -42,6 +42,14 @@
#define offsetof(type, member) __builtin_offsetof(type, member)
#endif
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
#ifndef __GNUC__
#define __attribute__(x)
#endif
//===== cmdlib.h
/*
@ -173,6 +181,7 @@ void DefaultExtension(char *path, const char *extension);
void StripExtension(char *path);
void StripFilename(char *path);
int IsAbsolutePath(const char *path);
int Q_strcasecmp(const char *s1, const char *s2);
char *copystring(const char *s);
@ -207,18 +216,24 @@ vec_t VectorNormalize(vec3_t v);
void VectorInverse(vec3_t v);
void VectorScale(const vec3_t v, const vec_t scale, vec3_t out);
#define min(a,b) ({ \
typeof(a) a_ = (a); \
typeof(b) b_ = (b); \
(void)(&a_ == &b_); \
(a_ < b_) ? a_ : b_; \
#ifdef __GNUC__
/* min and max macros with type checking */
#define max(a,b) ({ \
typeof(a) a_ = (a); \
typeof(b) b_ = (b); \
(void)(&a_ == &b_); \
(a_ > b_) ? a_ : b_; \
})
#define max(a,b) ({ \
typeof(a) a_ = (a); \
typeof(b) b_ = (b); \
(void)(&a_ == &b_); \
(a_ > b_) ? a_ : b_; \
#define min(a,b) ({ \
typeof(a) a_ = (a); \
typeof(b) b_ = (b); \
(void)(&a_ == &b_); \
(a_ < b_) ? a_ : b_; \
})
#else
#define max(a,b) (((a)>(b)) ? (a) : (b))
#define min(a,b) (((a)>(b)) ? (b) : (a))
#endif
#define stringify__(x) #x
#define stringify(x) stringify__(x)

View File

@ -147,7 +147,7 @@ WADList_FindTexture(const wad_t *wadlist, const char *name)
for (wad = wadlist; wad; wad = wad->next)
for (i = 0; i < wad->header.numlumps; i++)
if (!strcasecmp(name, wad->lumps[i].name))
if (!Q_strcasecmp(name, wad->lumps[i].name))
return &wad->lumps[i];
return NULL;
@ -225,7 +225,7 @@ WAD_LoadLump(const wad_t *wad, const char *name, byte *dest)
int size;
for (i = 0; i < wad->header.numlumps; i++) {
if (!strcasecmp(name, wad->lumps[i].name)) {
if (!Q_strcasecmp(name, wad->lumps[i].name)) {
fseek(wad->file, wad->lumps[i].filepos, SEEK_SET);
size = fread(dest, 1, wad->lumps[i].disksize, wad->file);
if (size != wad->lumps[i].disksize)

View File

@ -111,15 +111,15 @@ CalcAmbientSounds(bsp2_t *bsp)
ofs = bsp->dtexdata.header->dataofs[info->miptex];
miptex = (const miptex_t *)(bsp->dtexdata.base + ofs);
if (!strncasecmp(miptex->name, "sky", 3) && ambientsky)
if (!Q_strncasecmp(miptex->name, "sky", 3) && ambientsky)
ambient_type = AMBIENT_SKY;
else if (!strncasecmp(miptex->name, "*water", 6) && ambientwater)
else if (!Q_strncasecmp(miptex->name, "*water", 6) && ambientwater)
ambient_type = AMBIENT_WATER;
else if (!strncasecmp(miptex->name, "*04water", 8) && ambientwater)
else if (!Q_strncasecmp(miptex->name, "*04water", 8) && ambientwater)
ambient_type = AMBIENT_WATER;
else if (!strncasecmp(miptex->name, "*slime", 6) && ambientslime)
else if (!Q_strncasecmp(miptex->name, "*slime", 6) && ambientslime)
ambient_type = AMBIENT_WATER; // AMBIENT_SLIME;
else if (!strncasecmp(miptex->name, "*lava", 5) && ambientlava)
else if (!Q_strncasecmp(miptex->name, "*lava", 5) && ambientlava)
ambient_type = AMBIENT_LAVA;
else
continue;

View File

@ -19,7 +19,10 @@
#include <stdint.h>
#include <stdio.h>
#ifdef LINUX
#include <unistd.h>
#endif
#include <vis/vis.h>
#include <common/cmdlib.h>