diff options
Diffstat (limited to 'libparc/parc/assert')
-rw-r--r-- | libparc/parc/assert/parc_Assert.h | 191 |
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 |