[Change] Much better OS compatibility macros.

This commit is contained in:
Allanis 2014-07-22 14:03:42 +01:00
parent 96f0b1295b
commit 58e28df6bb
8 changed files with 119 additions and 105 deletions

View File

@ -38,18 +38,6 @@ ifdef LDATA_DEF
CFLAGS += -DLDATA_DEF=$(LDATA_DEF)
endif
# OS Stuff.
# Linux Stuff.
ifeq ($(OS),LINUX)
CFLAGS += -D_POSIX_SOURCE
endif
# FreeBSD stuff.
ifeq ($(OS),FREEBSD)
CFLAGS += -D_POSIX_SOURCE -D__BSD_VISIBLE
endif
# Debug stuff.
ifdef DEBUG
CFLAGS += -W -Wall -Wextra -Wunused -Wshadow -Wpointer-arith -Wmissing-prototypes \
@ -67,11 +55,6 @@ ifeq ($(OS), LINUX)
LDFLAGS += -rdynamic
endif # Linux.
# FreeBSD stuff.
ifeq ($(OS), FREEBSD)
LDFLAGS += -rdynamic
endif
else # DEBUG
CFLAGS += -O2 -funroll-loops -pipe -std=c99
endif

11
src/lcompat.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
/* System specific. */
#define HAS_LINUX (defined(linux) || defined(__linux) || defined(__linux__))
#define HAS_FREEBSD (defined(__FreeBSD__))
#define HAS_HAS_WIN32 (defined(__WIN32))
/* Standard specific. */
#define HAS_POSIX HAS_UNIX /* (defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L)) */
#define HAS_UNIX (defined(__unix__) || defined(__unix))

View File

@ -11,14 +11,16 @@
#include <SDL/SDL.h>
#include "lcompat.h"
/* Global. */
#include <string.h>
#if defined(LINUX) && !defined(DEBUGGING)
#if HAS_LINUX && defined(DEBUG) /* DEBUGGING isn't defined yet. */
#include <signal.h>
#include <execinfo.h>
#include <stdlib.h>
#include <unistd.h>
#endif /* defined(LINUX) && !defined(DEBUGGING) */
#endif /* HAS_LINUX && defined(DEBUG) */
/* Local. */
#include "lephisto.h"
@ -606,7 +608,7 @@ static void print_SDLversion(void) {
WARN("SDL is older than compiled version.");
}
#if defined(LINUX) && !defined(DEBUGGING)
#if HAS_LINUX && defined(DEBUGGING)
/**
* @brief Get the string related to the signal code.
* @param sig Signal to which code belongs.
@ -667,13 +669,13 @@ static void debug_sigHandler(int sig, siginfo_t* info, void* unused) {
exit(1);
}
#endif /* defined(LINUX) && !defined(DEBUG) */
#endif /* HAS_LINUX && defined(DEBUGGING) */
/**
* @brief Set up the SignalHandler for Linux.
*/
static void debug_sigInit(void) {
#if defined(LINUX) && !defined(DEBUGGING)
#if HAS_LINUX && defined(DEBUGGING)
struct sigaction sa, so;
/* Set up handler. */
@ -692,6 +694,6 @@ static void debug_sigInit(void) {
sigaction(SIGABRT, &sa, &so);
if(so.sa_handler == SIG_IGN)
DEBUG("Unable to get set up SIGABRT signal handler.");
#endif /* #if defined(LINUX) && !defined(DEBUGGING) */
#endif /* #if HAS_LINUX && defined(DEBUGGING) */
}

View File

@ -6,17 +6,19 @@
* @todo Add support for windows and mac OS.
*/
#include "lcompat.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#ifdef _POSIX_SOURCE
#if HAS_POSIX
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#endif
#endif /* HAS_POSIX */
#include "lephisto.h"
#include "log.h"
@ -33,10 +35,10 @@ char* lfile_basePath(void) {
char* home;
if(lephisto_base[0] == '\0') {
#if defined(LINUX) || defined(FREEBSD)
#if HAS_UNIX
home = getenv("HOME");
snprintf(lephisto_base, PATH_MAX, "%s/.lephisto/", home);
#else
#else /* HAS_UNIX */
FILE* f;
/* Try to open the file, C89 compliant, but not as precise as stat. */
@ -69,7 +71,7 @@ int lfile_dirMakeExist(const char* path, ...) {
va_end(ap);
}
#ifdef _POSIX_SOURCE
#if HAS_POSIX
struct stat buf;
stat(file, &buf);
@ -78,9 +80,9 @@ int lfile_dirMakeExist(const char* path, ...) {
WARN("Dir '%s' does not exist and unable to create", file);
return -1;
}
#else
#error "Needs implentation."
#endif
#else /* HAS_POSIX */
#error "Feature needs implementation on this Operating System for Lephisto to work."
#endif /* HAS_POSIX */
return 0;
}
@ -101,14 +103,21 @@ int lfile_fileExists(const char* path, ...) {
va_end(ap);
}
#ifdef _POSIX_SOURCE
#if HAS_POSIX
struct stat buf;
if(stat(file, &buf)==0) /* Stat worked, file must exist. */
return 1;
#else
#error "Needs implementation."
#endif
#else /* HAS_POSIX */
FILE* f;
/* Try to open the file, C89 compliant, but not as precise as stat. */
f = fopen(file, 'r');
if(f != NULL) {
fclose(f);
return 1;
}
#endif /* HAS_POSIX */
return 0;
}
@ -134,7 +143,7 @@ char** lfile_readDir(int* lfiles, const char* path, ...) {
va_end(ap);
}
#ifdef _POSIX_SOURCE
#if HAS_POSIX
int i, j, k, n;
DIR* d;
struct dirent *dir;
@ -216,9 +225,9 @@ char** lfile_readDir(int* lfiles, const char* path, ...) {
free(tfiles);
free(tt);
#else
#error "Needs implementation."
#endif
#else /* HAS_POSIX */
#error "Feature needs implementation on this Operating System for Lephito to work."
#endif /* HAS_POSIX
/* What if we find nothing? */
if((*lfiles) == 0) {

View File

@ -1,5 +1,10 @@
#include <stdio.h>
#include <sys/stat.h> /* S_IRUSR */
#include <fcntl.h> /* creat() etc. */
#include <stdint.h> /* uint32_t */
#if HAS_POSIX
#include <sys/types.h> /* ssize_t */
#include <sys/stat.h> /* S_IRUSR */
#endif /* HAS_POSIX */
#include <unistd.h>
#include <errno.h>
#include <string.h>
@ -36,11 +41,11 @@
* @brief Abstracts around packfiles.
*/
struct Packfile_s {
#ifdef _POSIX_SOURCE
#if HAS_POSIX
int fd; /**< File descriptor. */
#else
FILE* fp; /**< For non-posix. */
#endif
#endif /* HAS_POSIX */
uint32_t pos; /**< Cursor position. */
uint32_t start; /**< File start. */
uint32_t end; /**< File end. */
@ -52,11 +57,11 @@ struct Packfile_s {
* @brief Allows much faster creation of packfiles.
*/
struct Packcache_s {
#ifdef _POSIX_SOURCE
#if HAS_POSIX
int fd; /**< File descriptor. */
#else
FILE* fp; /* For non-posix. */
#endif
#endif /* HAS_POSIX */
char** index; /**< Cached index for faster lookups. */
uint32_t* start; /**< Cached index starts. */
@ -64,7 +69,7 @@ struct Packcache_s {
};
/* Helper defines. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
#define READ(f, b, n) if(read((f)->fd, (b), (n)) != (n)) { \
ERR("Fewer bytes read then expected"); \
return NULL; }
@ -72,7 +77,7 @@ struct Packcache_s {
#define READ(f, b, n) if(fread((b), 1, (n),(f)->fp) != (n)) { \
ERR("Fewer bytes read then expected"); \
return NULL; }
#endif
#endif /* HAS_POSIX */
#undef DEBUG /* This will be spammy. */
#define DEBUG(str, args...) do{;} while(0) /**< Hack to disable debugging. */
@ -112,13 +117,13 @@ Packcache_t* pack_openCache(const char* packfile) {
}
/* Open file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
cache->fd = open(packfile, O_RDONLY);
if(cache->fd == -1) {
#else
cache->fp = fopen(packfile, "rb");
if(cache->fp == NULL) {
#endif
#endif /* HAS_POSIX */
ERR("Error opening %s: %s", packfile, strerror(errno));
return NULL;
}
@ -157,11 +162,11 @@ void pack_closeCache(Packcache_t* cache) {
uint32_t i;
/* Close file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
close(cache->fd);
#else
fclose(cache->fp);
#endif
#endif /* HAS_POSIX */
/* Free memory. */
if(cache->nindex > 0) {
@ -188,7 +193,7 @@ Packfile_t* pack_openFromCache(Packcache_t* cache, const char* filename) {
for(i = 0; i < cache->nindex; i++) {
if(strcmp(cache->index[i], filename)==0) {
/* Copy file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
file->fd = dup(cache->fd);
#else
file->fp = cache->fp;
@ -200,12 +205,12 @@ Packfile_t* pack_openFromCache(Packcache_t* cache, const char* filename) {
/* Seek. */
if(file->start) { /* Go to the beginning of the file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
if((uint32_t)lseek(file->fd, file->start, SEEK_SET) != file->start) {
#else
fseek(file->fp, file->start, SEEK_SET);
if(errno) {
#endif
#endif /* HAS_POSIX */
ERR("Failure to seek to file start: %s", strerror(errno));
return NULL;
}
@ -231,7 +236,7 @@ Packfile_t* pack_openFromCache(Packcache_t* cache, const char* filename) {
* @return The size of the file.
*/
static off_t getfilesize(const char* filename) {
#ifdef _POSIX_SOURCE
#if HAS_POSIX
struct stat file;
if(!stat(filename, &file))
@ -250,7 +255,7 @@ static off_t getfilesize(const char* filename) {
fclose(fp);
return size;
#endif
#endif /* HAS_POSIX */
}
/**
@ -266,7 +271,7 @@ int pack_check(const char* filename) {
buf = malloc(sizeof(magic));
#ifdef _POSIX_SOURCE
#if HAS_POSIX
int fd = open(filename, O_RDONLY);
if(fd == -1) {
ERR("Error opening %s: %s", filename, strerror(errno));
@ -296,13 +301,13 @@ int pack_check(const char* filename) {
ret = (memcmp(buf, &magic, sizeof(magic))==0) ? 0 : 1;
fclose(file);
#endif
#endif /* HAS_POSIX */
free(buf);
return ret;
}
#ifdef _POSIX_SOURCE
#if HAS_POSIX
#define WRITE(b,n) if(write(outfd, b, n)==-1) { \
ERR("Error writing to file: %s", strerror(errno)); \
free(buf); return -1; } /**< Macro to help check for errors.
@ -310,7 +315,7 @@ int pack_check(const char* filename) {
#define WRITE(b,n) if(fwrite(b, 1, n, outf)==0) { \
ERR("Error writing to file: %s", strerror(errno)); \
free(buf); return -1; } /**< Macro to help check for errors. */
#endif
#endif /* HAS_POSIX */
/**
* @brief Packages files into a packfile.
@ -321,12 +326,12 @@ int pack_check(const char* filename) {
*/
int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles) {
void* buf;
#ifdef _POSIX_SOURCE
#if HAS_POSIX
struct stat file;
int outfd, infd;
#else
FILE* outf, *inf;
#endif
#endif /* HAS_POSIX */
uint32_t i;
int namesize;
uint32_t indexsize, pointer;
@ -335,11 +340,11 @@ int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles)
for(namesize = 0, i = 0; i < nfiles; i++) {
/* Make sure file exists before writing. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
if(stat(infiles[i], &file)) {
#else
if(getfilesize(infiles[i]) == 0) {
#endif
#endif /* HAS_POSIX */
ERR("File %s does not exist", infiles[i]);
return -1;
}
@ -357,13 +362,13 @@ int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles)
DEBUG("Index size is %d", indexsize);
/* Create the output file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
outfd = creat(outfile, PERMS);
if(outfd == -1) {
#else
outf = fopen(outfile, "wb");
if(outf == NULL) {
#endif
#endif /* HAS_POSIX */
ERR("Unable to open %s for writing", outfile);
return -1;
}
@ -395,32 +400,32 @@ int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles)
WRITE(&bytes, 4); /* filesize. */
DEBUG("About to write '%s' of %d bytes", infiles[i], bytes);
md5_init(&md5);
#ifdef _POSIX_SOURCE
#if HAS_POSIX
infd = open(infiles[i], O_RDONLY);
while((bytes = read(infd, buf, BLOCKSIZE))) {
#else
inf = fopen(infiles[i], "rb");
while((bytes = fread(buf, 1, BLOCKSIZE, inf))) {
#endif
#endif /* HAS_POSIX */
WRITE(buf, bytes); /* Data. */
md5_append(&md5, buf, bytes);
}
md5_finish(&md5, md5val);
WRITE(md5val, 16);
#ifdef _POSIX_SOURCE
#if HAS_POSIX
close(infd);
#else
fclose(inf);
#endif
#endif /* HAS_POSIX */
DEBUG("Wrote file '%s'", infiles[i]);
}
free(md5val);
#ifdef _POSIX_SOURCE
#if HAS_POSIX
close(outfd);
#else
fclose(outf);
#endif
#endif /* HAS_POSIX */
free(buf);
DEBUG("Packfile success\n\t%d files\n\t%d bytes",
@ -445,13 +450,13 @@ Packfile_t* pack_open(const char* packfile, const char* filename) {
file = malloc(sizeof(Packfile_t));
memset(file, 0, sizeof(Packfile_t));
#ifdef _POSIX_SOURCE
#if HAS_POSIX
file->fd = open(packfile, O_RDONLY);
if(file->fd == -1) {
#else
file->fp = fopen(packfile, "rb");
if(file->fp == NULL) {
#endif
#endif /* HAS_POSIX */
ERR("Error opening %s: %s", filename, strerror(errno));
return NULL;
}
@ -476,21 +481,21 @@ Packfile_t* pack_open(const char* packfile, const char* filename) {
DEBUG("'%s' found at %d", filename, file->start);
break;
}
#ifdef _POSIX_SOURCE
#if HAS_POSIX
lseek(file->fd, 4, SEEK_CUR); /* Ignore the file location. */
#else
fseek(file->fp, 4, SEEK_CUR);
#endif
#endif /* HAS_POSIX */
}
if(file->start) {
/* Go to the beginning of the file. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
if((uint32_t)lseek(file->fd, file->start, SEEK_SET) != file->start) {
#else
fseek(file->fp, file->start, SEEK_SET);
if(errno) {
#endif
#endif /* HAS_POSIX */
ERR("Failure to seek to file start: %s", strerror(errno));
return NULL;
}
@ -521,11 +526,11 @@ ssize_t pack_read(Packfile_t* file, void* buf, size_t count) {
count = file->end - file->pos; /* Can't go past the end! */
if(count == 0) return 0;
#ifdef _POSIX_SOURCE
#if HAS_POSIX
if((bytes = read(file->fd, buf, count)) == -1) {
#else
if((bytes = fread(buf, 1, count, file->fp)) == -1) {
#endif
#endif /* HAS_POSIX */
ERR("Error while reading file: %s", strerror(errno));
return -1;
}
@ -549,7 +554,7 @@ off_t pack_seek(Packfile_t* file, off_t offset, int whence) {
DEBUG("Attempting to seek offset: %d, whence: %d", offset, whence);
off_t ret;
switch(whence) {
#ifdef _POSIX_SOURCE
#if HAS_POSIX
case SEEK_SET:
if((file->start + offset) > file->end) return -1;
ret = lseek(file->fd, file->start + offset, SEEK_SET);
@ -581,7 +586,7 @@ off_t pack_seek(Packfile_t* file, off_t offset, int whence) {
ret = flseek(file->fd, file->end - offset - 1, SEEK_SET);
if(ret != (file->end - offset)) return -1;
break;
#endif
#endif /* HAS_POSIX */
default:
ERR("Whence is not one of SEEK_SET, SEEK_CUR or SEEK_END");
return -1;
@ -633,11 +638,11 @@ static void* pack_readfilePack(Packfile_t* file,
md5_init(&md5);
md5_append(&md5, buf, bytes);
md5_finish(&md5, md5val);
#ifdef _POSIX_SOURCE
#if HAS_POSIX
if((bytes = read(file->fd, md5fd, 16)) == -1)
#else
if((bytes = fread(md5fd, 1, 16, file->fp)) == -1)
#endif
#endif /* HAS_POSIX */
WARN("Failure to read MD5, continuing anyway..");
else if(memcmp(md5val, md5fd, 16))
WARN("MD5 gives different value, possible memory corruption, continuing..");
@ -702,13 +707,13 @@ char** pack_listfiles(const char* packfile, uint32_t* nfiles) {
*nfiles = 0;
#ifdef _POSIX_SOURCE
#if HAS_POSIX
file.fd = open(packfile, O_RDONLY);
if(file.fd == -1) {
#else
file.fp = fopen(packfile, "rb");
if(file.fp == NULL) {
#endif
#endif /* HAS_POSIX */
ERR("opening %s: %s", packfile, strerror(errno));
return NULL;
}
@ -731,11 +736,11 @@ char** pack_listfiles(const char* packfile, uint32_t* nfiles) {
}
free(buf);
#ifdef _POSIX_SOURCE
#if HAS_POSIX
close(file.fd);
#else
fclose(file.fp);
#endif
#endif /* HAS_POSIX */
return filenames;
}
@ -772,14 +777,14 @@ int pack_close(Packfile_t* file) {
int i;
/* Close files. */
#ifdef _POSIX_SOURCE
#if HAS_POSIX
i = close(file->fd);
#else
if(file->flags & PACKFILE_FROMCACHE)
i = 0;
else
i = fclose(file->fp);
#endif
#endif /* HAS_POSIX */
/* Free memory. */
free(file);

View File

@ -1,10 +1,12 @@
#pragma once
#include "lcompat.h"
#include <fcntl.h>
#ifndef _POSIX_SOURCE /* No posix. */
#include <stdio.h>
#endif
#include <stdint.h>
#if HAS_POSIX
#include <sys/types.h>
#endif /* HAS_POSIX */
struct Packfile_s;
typedef struct Packfile_s Packfile_t;

View File

@ -100,7 +100,7 @@ double vect_dot(Vec2* a, Vec2* b) {
* SOLID!
* ================
*/
#if defined(FREEBSD)
#if HAS_FREEBSD
/**
* @brief Update the solids position using a euler integration.
*
@ -150,7 +150,7 @@ static void simple_update(Solid* obj, const double dt) {
vect_cset(&obj->vel, vx, vy);
vect_cset(&obj->pos, px, py);
}
#endif /* defined(FREEBSD) */
#endif /* HAS_FREEBSD */
/**
* @brief Runge-Kutta method of updating a solid based on it's
@ -175,7 +175,7 @@ static void simple_update(Solid* obj, const double dt) {
* a tiny staight line.
*/
#if !defined(FREEBSD)
#if !HAS_FREEBSD
#define RK4_MIN_H 0.01 /* Minimal pass we want. */
static void rk4_update(Solid* obj, const double dt) {
int i, N; /* For iteration and pass calculation. */
@ -230,7 +230,7 @@ static void rk4_update(Solid* obj, const double dt) {
}
vect_cset(&obj->pos, px, py);
}
#endif /* !defined(FREEBSD) */
#endif /* !HAS_FREEBSD */
/* Initialize a new solid. */
void solid_init(Solid* dest, const double mass, const double dir,
@ -260,11 +260,11 @@ void solid_init(Solid* dest, const double mass, const double dir,
* FreeBSD seems to have a bug with optimizations in rk4_update causing it to
* eventually become NaN.
*/
#if defined(FREEBSD)
#if HAS_FREEBSD
dest->update = simple_update;
#else
dest->update = rk4_update;
#endif
#endif /* HAS_FREEBSD */
}
/* Create a new solid. */

View File

@ -6,15 +6,17 @@
* Random numbers are currently generated using the mersenne twister.
*/
#include "lcompat.h"
#include <stdint.h>
#include <math.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#if defined _POSIX_SOURCE
#if HAS_POSIX
#include <sys/time.h>
#include <fcntl.h>
#endif
#endif /* HAS_POSIX */
#include <SDL.h>
#include "lephisto.h"
@ -40,7 +42,7 @@ void rng_init(void) {
int need_init;
need_init = 1; /* Initialize by default. */
#ifdef LINUX
#if HAS_LINUX
int fd;
fd = open("/dev/urandom", O_RDONLY); /* /dev/urandom is better then time seed. */
if(fd != -1) {
@ -54,7 +56,7 @@ void rng_init(void) {
i = rng_timeEntropy();
#else
i = rng_timeEntropy();
#endif
#endif /* HAS_LINUX */
if(need_init)
mt_initArray(i);
for(i = 0; i < 10; i++)
@ -71,16 +73,16 @@ void rng_init(void) {
static uint32_t rng_timeEntropy(void) {
int i;
#if defined(_POSIX_SOURCE)
#if HAS_POSIX
struct timeval tv;
gettimeofday(&tv, NULL);
i = tv.tv_sec * 1000000 + tv.tv_usec;
#elif defined(WIN32)
#elif HAS_WIN32
struct _timeb tb;
_ftime(&tb);
i = tb.time * 1000 + tb.millitm;
#else
#error "Needs Implmentation."
#error "Feature needs implementation on this Operating System for Lephisto to work."
#endif
return i;
}