aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/assert/parc_Assert.h
diff options
context:
space:
mode:
Diffstat (limited to 'libparc/parc/assert/parc_Assert.h')
-rw-r--r--libparc/parc/assert/parc_Assert.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/libparc/parc/assert/parc_Assert.h b/libparc/parc/assert/parc_Assert.h
new file mode 100644
index 00000000..46e3e2f0
--- /dev/null
+++ b/libparc/parc/assert/parc_Assert.h
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NDEBUG
+
+#define parcClean_errno() (errno == 0 ? "None" : strerror(errno))
+#define parcLog_PrintError(M, ...) \
+ fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\nExit (Failure)\n", \
+ __FILE__, __LINE__, parcClean_errno(), ##__VA_ARGS__);
+
+#define parcAssertTrue(A, M, ...) \
+ if (!(A)) { \
+ assert(A); \
+ }
+#define parcAssertFalse(A, M, ...) \
+ if ((A)) { \
+ assert(!(A)); \
+ }
+#define parcAssertNotNull(A, M, ...) \
+ if (A == NULL) { \
+ assert(A != NULL); \
+ }
+#define parcAssertNull(A, M, ...) \
+ if (A != NULL) { \
+ assert(A == NULL); \
+ }
+
+#define parcTrapIllegalValueIf(A, M, ...) \
+ if ((A)) { \
+ assert(!(A)); \
+ }
+#define parcTrapIllegalValue(A, M, ...) \
+ { \
+ parcLog_PrintError("Illegal value: " M, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapNotImplemented(M, ...) \
+ { \
+ parcLog_PrintError("Feature not implemented: " M, ##__VA_ARGS__); \
+ assert(0); \
+ }
+#define parcTrapOutOfBounds(A, M, ...) \
+ { \
+ parcLog_PrintError("Element out of bounds, %zu :" M, A, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapOutOfBoundsIf(A, M, ...) \
+ { assert(!(A)); }
+#define parcTrapOutOfMemory(M, ...) \
+ { \
+ parcLog_PrintError("Out of memory. " M, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapOutOfMemoryIf(A, M, ...) \
+ { assert(!(A)); }
+#define parcTrapUnexpectedState(M, ...) \
+ { \
+ parcLog_PrintError("Unexpected state. " M, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapUnexpectedStateIf(A, M, ...) \
+ { assert(!(A)); }
+#define parcTrapUnrecoverableState(M, ...) \
+ { \
+ parcLog_PrintError("Unrecoverable State: " M, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapInvalidValueIf(A, M, ...) \
+ { assert(!(A)); }
+#define parcTrapCannotObtainLock(M, ...) \
+ { \
+ parcLog_PrintError("Cannot obtain lock: " M, ##__VA_ARGS__); \
+ assert(0); \
+ exit(1); \
+ }
+#define parcTrapCannotObtainLockIf(A, M, ...) \
+ { assert(!(A)); }
+#define parcAssertAligned(address, alignment, ...) \
+ { \
+ assert(((alignment & (~alignment + 1)) == alignment) \
+ ? (((uintptr_t)address) % alignment) == 0 ? 1 : 0 \
+ : 0); \
+ }
+
+#else
+
+#define parcLog_PrintError(M, ...) \
+ fprintf(stderr, "[ERROR] " M "\n", ##__VA_ARGS__);
+
+#define parcAssertTrue(A, M, ...) \
+ if (!(A)) { \
+ parcLog_PrintError(M, ##__VA_ARGS__); \
+ assert(A); \
+ }
+#define parcAssertFalse(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError(M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcAssertNotNull(A, M, ...) \
+ if (A == NULL) { \
+ parcLog_PrintError(M, ##__VA_ARGS__); \
+ assert(A != NULL); \
+ }
+#define parcAssertNull(A, M, ...) \
+ if (A != NULL) { \
+ parcLog_PrintError(M, ##__VA_ARGS__); \
+ assert(A == NULL); \
+ }
+
+#define parcTrapIllegalValueIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Illegal value: " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcTrapIllegalValue(A, M, ...) \
+ parcLog_PrintError("Illegal value: " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapNotImplemented(M, ...) \
+ parcLog_PrintError("Feature not implemented: " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapOutOfBounds(A, M, ...) \
+ parcLog_PrintError("Element out of bounds, %zu :" M, A, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapOutOfBoundsIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Out of bounds: " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcTrapOutOfMemory(M, ...) \
+ parcLog_PrintError("Out of memory. " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapOutOfMemoryIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Out of memory. " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcTrapUnexpectedState(M, ...) \
+ parcLog_PrintError("Unexpected state. " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapUnexpectedStateIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Unexpected state: " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcTrapUnrecoverableState(M, ...) \
+ parcLog_PrintError("Unrecoverable State: " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapInvalidValueIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Invalid value: " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcTrapCannotObtainLock(M, ...) \
+ parcLog_PrintError("Cannot obtain lock: " M, ##__VA_ARGS__); \
+ assert(0);
+#define parcTrapCannotObtainLockIf(A, M, ...) \
+ if ((A)) { \
+ parcLog_PrintError("Cannot obtain lock: " M, ##__VA_ARGS__); \
+ assert(!(A)); \
+ }
+#define parcAssertAligned(address, alignment, ...) \
+ parcLog_PrintError(__VA_ARGS__); \
+ assert(((alignment & (~alignment + 1)) == alignment) \
+ ? (((uintptr_t)address) % alignment) == 0 ? 1 : 0 \
+ : 0);
+
+#endif