diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-04 08:48:23 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-04 08:48:23 +0000 |
commit | b1fa75dfe08461c0f1349093266bcdc852bcd713 (patch) | |
tree | f9d3d7950c6e72d1c0d05d6ea4f0a6dff2346ab9 /src/htsbase.h | |
parent | 4da59a639962cecf3599f19813b00f2ab065e089 (diff) |
Big cleanup in string primitives and abort functions
Diffstat (limited to 'src/htsbase.h')
-rw-r--r-- | src/htsbase.h | 225 |
1 files changed, 1 insertions, 224 deletions
diff --git a/src/htsbase.h b/src/htsbase.h index fcda7a8..a3d7743 100644 --- a/src/htsbase.h +++ b/src/htsbase.h @@ -40,6 +40,7 @@ extern "C" { #include "htsglobal.h" #include "htsstrings.h" +#include "htssafe.h" #include <string.h> #include <time.h> @@ -106,230 +107,6 @@ extern "C" { #define DynamicGet(handle, sym) dlsym(handle, sym) #endif -// emergency log - typedef void (*t_abortLog) (char *msg, char *file, int line); - extern HTSEXT_API t_abortLog abortLog__; -#define abortLog(a) abortLog__(a, __FILE__, __LINE__) -#define _ , -#define abortLogFmt(a) do { \ - FILE* fp = fopen("CRASH.TXT", "wb"); \ - if (!fp) fp = fopen("/tmp/CRASH.TXT", "wb"); \ - if (!fp) fp = fopen("C:\\CRASH.TXT", "wb"); \ - if (!fp) fp = fopen("\\Temp\\CRASH.TXT", "wb"); \ - if (!fp) fp = fopen("\\CRASH.TXT", "wb"); \ - if (!fp) fp = fopen("CRASH.TXT", "wb"); \ - if (fp) { \ - fprintf(fp, "HTTrack " HTTRACK_VERSIONID " closed at '" __FILE__ "', line %d\r\n", __LINE__); \ - fprintf(fp, "Reason:\r\n"); \ - fprintf(fp, a); \ - fprintf(fp, "\r\n"); \ - fflush(fp); \ - fclose(fp); \ - } \ -} while(0) - -#define assertf(exp) do { \ - if (! ( exp ) ) { \ - abortLog("assert failed: " #exp); \ - if (htsCallbackErr != NULL) { \ - htsCallbackErr("assert failed: " #exp, __FILE__ , __LINE__ ); \ - } \ - abort(); \ - } \ -} while(0) -/* non-fatal assert */ -#define assertnf(exp) do { \ - if (! ( exp ) ) { \ - abortLog("assert failed: " #exp); \ - if (htsCallbackErr != NULL) { \ - htsCallbackErr("assert failed: " #exp, __FILE__ , __LINE__ ); \ - } \ - } \ -} while(0) - -/* regular malloc's() */ -#ifndef HTS_TRACE_MALLOC -#define malloct(A) malloc(A) -#define calloct(A,B) calloc((A), (B)) -#define freet(A) do { assertnf((A) != NULL); if ((A) != NULL) { free(A); (A) = NULL; } } while(0) -#define strdupt(A) strdup(A) -#define realloct(A,B) ( ((A) != NULL) ? realloc((A), (B)) : malloc(B) ) -#define memcpybuff(A, B, N) memcpy((A), (B), (N)) -#else -/* debug version */ -#define malloct(A) hts_malloc(A) -#define calloct(A,B) hts_calloc(A,B) -#define strdupt(A) hts_strdup(A) -#define freet(A) do { hts_free(A); (A) = NULL; } while(0) -#define realloct(A,B) hts_realloc(A,B) - void hts_freeall(); - void *hts_malloc(size_t); - void *hts_calloc(size_t, size_t); - char *hts_strdup(char *); - void *hts_xmalloc(size_t, size_t); - void hts_free(void *); - void *hts_realloc(void *, size_t); - mlink *hts_find(char *adr); -/* protected memcpy */ -#define memcpybuff(A, B, N) do { \ - mlink* lnk = hts_find((void*)(A)); \ - if (lnk != NULL) { \ - assertf(lnk != NULL); \ - assertf( * ( (t_htsboundary*) ( ((char*) lnk->adr) - sizeof(htsboundary) ) ) == htsboundary ); \ - assertf( * ( (t_htsboundary*) ( ((char*) lnk->adr) + lnk->len ) ) == htsboundary ); \ - assertf( ( ((char*)(A)) + (N)) < (char*) (lnk->adr + lnk->len) ); \ - } \ - memcpy(A, B, N); \ -} while(0) - -#endif - - typedef void (*htsErrorCallback) (char *msg, char *file, int line); - extern HTSEXT_API htsErrorCallback htsCallbackErr; - extern HTSEXT_API int htsMemoryFastXfr; - -/* -*/ - -#define stringdup() - -#ifdef STRDEBUG - -/* protected strcat, strncat and strcpy - definitely useful */ -#define strcatbuff(A, B) do { \ - assertf( (A) != NULL ); \ - assertf( (B) != NULL ); \ - if (htsMemoryFastXfr) { \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strcat(A, B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ - } else { \ - unsigned int sz = (unsigned int) strlen(A); \ - unsigned int szf = (unsigned int) strlen(B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf(sz + szf + 1 < sizeof(A)); \ - if (szf > 0) { \ - if (sz + szf + 1 < sizeof(A)) { \ - memcpy((A) + sz, (B), szf + 1); \ - } \ - } \ - } else if (szf > 0) { \ - memcpybuff((A) + sz, (B), szf + 1); \ - } \ - } \ -} while(0) -#define strncatbuff(A, B, N) do { \ - assertf( (A) != NULL ); \ - assertf( (B) != NULL ); \ - if (htsMemoryFastXfr) { \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strncat(A, B, N); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ - } else { \ - unsigned int sz = (unsigned int) strlen(A); \ - unsigned int szf = (unsigned int) strlen(B); \ - if (szf > (unsigned int) (N)) szf = (unsigned int) (N); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf(sz + szf + 1 < sizeof(A)); \ - if (szf > 0) { \ - if (sz + szf + 1 < sizeof(A)) { \ - memcpy((A) + sz, (B), szf); \ - * ( (A) + sz + szf) = '\0'; \ - } \ - } \ - } else if (szf > 0) { \ - memcpybuff((A) + sz, (B), szf); \ - * ( (A) + sz + szf) = '\0'; \ - } \ - } \ -} while(0) -#define strcpybuff(A, B) do { \ - assertf( (A) != NULL ); \ - assertf( (const char*) (B) != NULL ); \ - if (htsMemoryFastXfr) { \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strcpy(A, B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ - } else { \ - unsigned int szf = (unsigned int) strlen(B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf(szf + 1 < sizeof(A)); \ - if (szf > 0) { \ - if (szf + 1 < sizeof(A)) { \ - memcpy((A), (B), szf + 1); \ - } else { \ - * (A) = '\0'; \ - } \ - } else { \ - * (A) = '\0'; \ - } \ - } else { \ - memcpybuff((A), (B), szf + 1); \ - } \ - } \ -} while(0) - -#else - -#ifdef STRDEBUGFAST - -/* protected strcat, strncat and strcpy - definitely useful */ -#define strcatbuff(A, B) do { \ - assertf( (A) != NULL ); \ - assertf( (B) != NULL ); \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strcat(A, B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ -} while(0) -#define strncatbuff(A, B, N) do { \ - assertf( (A) != NULL ); \ - assertf( (B) != NULL ); \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strncat(A, B, N); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ -} while(0) -#define strcpybuff(A, B) do { \ - assertf( (A) != NULL ); \ - assertf( (B) != NULL ); \ - if (sizeof(A) != sizeof(char*)) { \ - (A)[sizeof(A) - 1] = '\0'; \ - } \ - strcpy(A, B); \ - if (sizeof(A) != sizeof(char*)) { \ - assertf((A)[sizeof(A) - 1] == '\0'); \ - } \ -} while(0) - -#else - -#define strcatbuff strcat -#define strncatbuff strncat -#define strcpybuff strcpy - -#endif - -#endif - #endif #ifdef __cplusplus |