15185a700Sflorian /*
25185a700Sflorian * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
35185a700Sflorian *
45185a700Sflorian * Permission to use, copy, modify, and/or distribute this software for any
55185a700Sflorian * purpose with or without fee is hereby granted, provided that the above
65185a700Sflorian * copyright notice and this permission notice appear in all copies.
75185a700Sflorian *
85185a700Sflorian * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
95185a700Sflorian * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
105185a700Sflorian * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
115185a700Sflorian * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
125185a700Sflorian * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
135185a700Sflorian * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
145185a700Sflorian * PERFORMANCE OF THIS SOFTWARE.
155185a700Sflorian */
165185a700Sflorian
17*b9558d14Sjsg /* $Id: assertions.c,v 1.5 2020/02/25 05:00:43 jsg Exp $ */
185185a700Sflorian
195185a700Sflorian /*! \file */
205185a700Sflorian
215185a700Sflorian #include <stdio.h>
225185a700Sflorian #include <stdlib.h>
235185a700Sflorian
245185a700Sflorian #include <isc/assertions.h>
255185a700Sflorian
265185a700Sflorian /*%
275185a700Sflorian * Forward.
285185a700Sflorian */
295185a700Sflorian static void
305185a700Sflorian default_callback(const char *, int, isc_assertiontype_t, const char *);
315185a700Sflorian
325185a700Sflorian static isc_assertioncallback_t isc_assertion_failed_cb = default_callback;
335185a700Sflorian
345185a700Sflorian /*%
355185a700Sflorian * Public.
365185a700Sflorian */
375185a700Sflorian
385185a700Sflorian /*% assertion failed handler */
395185a700Sflorian void
isc_assertion_failed(const char * file,int line,isc_assertiontype_t type,const char * cond)405185a700Sflorian isc_assertion_failed(const char *file, int line, isc_assertiontype_t type,
415185a700Sflorian const char *cond)
425185a700Sflorian {
435185a700Sflorian isc_assertion_failed_cb(file, line, type, cond);
445185a700Sflorian abort();
455185a700Sflorian /* NOTREACHED */
465185a700Sflorian }
475185a700Sflorian
485185a700Sflorian /*% Type to Text */
495185a700Sflorian const char *
isc_assertion_typetotext(isc_assertiontype_t type)505185a700Sflorian isc_assertion_typetotext(isc_assertiontype_t type) {
515185a700Sflorian const char *result;
525185a700Sflorian
535185a700Sflorian /*
545185a700Sflorian * These strings have purposefully not been internationalized
555185a700Sflorian * because they are considered to essentially be keywords of
565185a700Sflorian * the ISC development environment.
575185a700Sflorian */
585185a700Sflorian switch (type) {
595185a700Sflorian case isc_assertiontype_require:
605185a700Sflorian result = "REQUIRE";
615185a700Sflorian break;
625185a700Sflorian case isc_assertiontype_ensure:
635185a700Sflorian result = "ENSURE";
645185a700Sflorian break;
655185a700Sflorian case isc_assertiontype_insist:
665185a700Sflorian result = "INSIST";
675185a700Sflorian break;
685185a700Sflorian case isc_assertiontype_invariant:
695185a700Sflorian result = "INVARIANT";
705185a700Sflorian break;
715185a700Sflorian default:
725185a700Sflorian result = NULL;
735185a700Sflorian }
745185a700Sflorian return (result);
755185a700Sflorian }
765185a700Sflorian
775185a700Sflorian /*
785185a700Sflorian * Private.
795185a700Sflorian */
805185a700Sflorian
815185a700Sflorian static void
default_callback(const char * file,int line,isc_assertiontype_t type,const char * cond)825185a700Sflorian default_callback(const char *file, int line, isc_assertiontype_t type,
835185a700Sflorian const char *cond)
845185a700Sflorian {
855185a700Sflorian fprintf(stderr, "%s:%d: %s(%s) %s\n",
865185a700Sflorian file, line, isc_assertion_typetotext(type), cond, "failed");
875185a700Sflorian fflush(stderr);
885185a700Sflorian }
89