icedb  version 0.5.1
Snow particle scattering database API
util.cpp
Go to the documentation of this file.
1 #include "../icedb/defs.h"
2 #include "../icedb/util.h"
3 #include "../icedb/util.hpp"
4 #include <cstring>
5 #include <cwchar>
6 #if defined(_WIN32)
7 #include <Windows.h>
8 #else
9 #include <signal.h>
10 #endif
11 
13 
15  char * dest, size_t destSz,
16  const char * src, size_t srcSz)
17 {
26  if (!dest || !src)ICEDB_DEBUG_RAISE_EXCEPTION();
27 #if ICEDB_USING_SECURE_STRINGS
28  strncpy_s(dest, destSz, src, srcSz);
29 #else
30  if (srcSz <= destSz) {
31  strncpy(dest, src, srcSz);
32  }
33  else {
34  strncpy(dest, src, destSz);
35  }
36 #endif
37  dest[destSz - 1] = 0;
38  for (size_t i = 0; i < destSz; ++i) if (dest[i] == '\0') return i;
39  return 0; // Should never be reached
40 }
41 
42 ICEDB_SYMBOL_SHARED char * ICEDB_COMPAT_strdup_s(const char * src, size_t srcSz)
43 {
45  if (!src) ICEDB_DEBUG_RAISE_EXCEPTION();
46  char* res = (char*)ICEDB_malloc(sizeof(char)*(srcSz + 1));
47  ICEDB_COMPAT_strncpy_s(res, srcSz + 1, src, srcSz + 1);
48  return res;
49 }
50 
51 
53  wchar_t * dest, size_t destSz,
54  const wchar_t * src, size_t srcSz)
55 {
64  if (!dest || !src)ICEDB_DEBUG_RAISE_EXCEPTION();
65 #if ICEDB_USING_SECURE_STRINGS
66  wcsncpy_s(dest, destSz, src, srcSz);
67 #else
68  if (srcSz <= destSz) {
69  wcsncpy(dest, src, srcSz);
70  }
71  else {
72  wcsncpy(dest, src, destSz);
73  }
74 #endif
75  dest[destSz - 1] = 0;
76  for (size_t i = 0; i < destSz; ++i) if (dest[i] == '\0') return i;
77  return 0; // Should never be reached
78 }
79 
80 ICEDB_SYMBOL_SHARED wchar_t * ICEDB_COMPAT_wcsdup_s(const wchar_t * src, size_t srcSz)
81 {
83  if (!src) ICEDB_DEBUG_RAISE_EXCEPTION();
84  wchar_t* res = (wchar_t*)ICEDB_malloc(sizeof(wchar_t)*(srcSz + 1));
85  ICEDB_COMPAT_wcsncpy_s(res, srcSz + 1, src, srcSz + 1);
86  return res;
87 }
88 
89 
90 ICEDB_SYMBOL_SHARED void * ICEDB_malloc(size_t numBytes)
91 {
92  void* res = malloc(numBytes);
93  if (!res) ICEDB_DEBUG_RAISE_EXCEPTION();
94  return res;
95 }
96 
98 {
99  if (!obj) ICEDB_DEBUG_RAISE_EXCEPTION();
100  free(obj);
101 }
102 ICEDB_SYMBOL_SHARED void ICEDB_DEBUG_RAISE_EXCEPTION_HANDLER_WC(const wchar_t* file, int line, const wchar_t* fsig)
103 {
104  ICEDB_COMPAT_fwprintf_s(stderr, L"Exception raised in file %s, line %d, function %s.\n", file, line, fsig);
105 
106 #ifdef _WIN32
107  DebugBreak();
108 #else
109  raise(SIGTRAP);
110  exit(999);
111 #endif
112 }
113 ICEDB_SYMBOL_SHARED void ICEDB_DEBUG_RAISE_EXCEPTION_HANDLER_A(const char* file, int line, const char* fsig)
114 {
115  ICEDB_COMPAT_fprintf_s(stderr, "Exception raised in file %s, line %d, function %s.\n", file, line, fsig);
116 
117 #ifdef _WIN32
118  DebugBreak();
119 #else
120  raise(SIGTRAP);
121  exit(999);
122 #endif
123 }
125 
126 
128 namespace icedb {
129  ICEDB_SYMBOL_SHARED void* _malloc(size_t numBytes) { return ICEDB_malloc(numBytes); }
130  ICEDB_SYMBOL_SHARED void _free(void* obj) { return ICEDB_free(obj); }
131 }
#define ICEDB_DEBUG_RAISE_EXCEPTION()
Definition: defs.h:151
void free(T *obj)
Definition: util.hpp:21
#define ICEDB_END_DECL
Definition: defs.h:12
ICEDB_SYMBOL_SHARED void ICEDB_DEBUG_RAISE_EXCEPTION_HANDLER_WC(const wchar_t *file, int line, const wchar_t *fsig)
Definition: util.cpp:102
ICEDB_SYMBOL_SHARED void ICEDB_free(void *obj)
Free memory region. Should not be double-freed.
Definition: util.cpp:97
ICEDB_SYMBOL_SHARED void ICEDB_DEBUG_RAISE_EXCEPTION_HANDLER_A(const char *file, int line, const char *fsig)
Definition: util.cpp:113
ICEDB_SYMBOL_SHARED wchar_t * ICEDB_COMPAT_wcsdup_s(const wchar_t *src, size_t srcSz)
Definition: util.cpp:80
#define ICEDB_BEGIN_DECL_C
Definition: defs.h:20
#define ICEDB_COMPAT_fwprintf_s
Definition: util.h:27
ICEDB_SYMBOL_SHARED void _free(void *obj)
Definition: util.cpp:130
#define ICEDB_END_DECL_C
Definition: defs.h:21
ICEDB_BEGIN_DECL_C ICEDB_SYMBOL_SHARED size_t ICEDB_COMPAT_strncpy_s(char *dest, size_t destSz, const char *src, size_t srcSz)
Definition: util.cpp:14
ICEDB_SYMBOL_SHARED char * ICEDB_COMPAT_strdup_s(const char *src, size_t srcSz)
Definition: util.cpp:42
T * malloc(size_t numBytes)
Definition: util.hpp:13
ICEDB_SYMBOL_SHARED void * ICEDB_malloc(size_t numBytes)
Allocate memory in bytes. Generally this is just malloced, but a custom allocator may be substituted...
Definition: util.cpp:90
#define ICEDB_BEGIN_DECL
Definition: defs.h:11
#define ICEDB_SYMBOL_SHARED
Definition: defs.h:127
ICEDB_SYMBOL_SHARED size_t ICEDB_COMPAT_wcsncpy_s(wchar_t *dest, size_t destSz, const wchar_t *src, size_t srcSz)
Definition: util.cpp:52
ICEDB_SYMBOL_SHARED void * _malloc(size_t numBytes)
Definition: util.cpp:129
#define ICEDB_COMPAT_fprintf_s
Definition: util.h:26