summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2013-02-27 14:27:58 -0800
committerBen Longbons <b.r.longbons@gmail.com>2013-02-27 14:28:38 -0800
commitbb4becfbf3cdfa9e3b4320ce72fd7e7a57c34ad2 (patch)
treea6f4272eb53f4f7d5c1eb4c0e8cddf8071deeda8
parente885f2d08fa4c8ba08a14b87ec20dd24806b5f6b (diff)
downloadtmwa-bb4becfbf3cdfa9e3b4320ce72fd7e7a57c34ad2.tar.gz
tmwa-bb4becfbf3cdfa9e3b4320ce72fd7e7a57c34ad2.tar.bz2
tmwa-bb4becfbf3cdfa9e3b4320ce72fd7e7a57c34ad2.tar.xz
tmwa-bb4becfbf3cdfa9e3b4320ce72fd7e7a57c34ad2.zip
Reimplement CREATE/RECREATE and allow NULL on size 0
-rw-r--r--src/common/utils.hpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/common/utils.hpp b/src/common/utils.hpp
index 7ebd978..a9d0244 100644
--- a/src/common/utils.hpp
+++ b/src/common/utils.hpp
@@ -18,13 +18,32 @@ a{C,M,Re}alloc in common/malloc.{h,c}, and direct calls.
I deleted malloc.{h,c} because it was redundant;
future calls should either use this or depend on the coming segfault.
*/
+template<class T>
+void create_impl(T *& result, size_t number)
+{
+ result = (T *)calloc(number, sizeof(T));
+ if (!result && number)
+ {
+ perror("SYSERR: malloc failure");
+ abort();
+ }
+}
+template<class T>
+void recreate_impl(T *& result, size_t number)
+{
+ result = (T *)realloc(result, sizeof(T) * number);
+ if (!result && number)
+ {
+ perror("SYSERR: realloc failure");
+ abort();
+ }
+}
+
# define CREATE(result, type, number) \
- if (!((result) = (type *) calloc((number), sizeof(type)))) \
- { perror("SYSERR: malloc failure"); abort(); } else (void)0
+ create_impl<type>(result, number)
# define RECREATE(result, type, number) \
- if (!((result) = (type *) realloc((result), sizeof(type) * (number))))\
- { perror("SYSERR: realloc failure"); abort(); } else (void)0
+ recreate_impl<type>(result, number)
int remove_control_chars(char *str);
int e_mail_check(const char *email);