Home | History | Annotate | Line # | Download | only in gen
assert.c revision 1.16
      1  1.16    kleink /*	$NetBSD: assert.c,v 1.16 2005/02/09 21:35:46 kleink Exp $	*/
      2   1.6       cgd 
      3   1.5       cgd /*-
      4   1.5       cgd  * Copyright (c) 1992, 1993
      5   1.5       cgd  *	The Regents of the University of California.  All rights reserved.
      6   1.1       jtc  *
      7   1.1       jtc  * Redistribution and use in source and binary forms, with or without
      8   1.1       jtc  * modification, are permitted provided that the following conditions
      9   1.1       jtc  * are met:
     10   1.1       jtc  * 1. Redistributions of source code must retain the above copyright
     11   1.1       jtc  *    notice, this list of conditions and the following disclaimer.
     12   1.1       jtc  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1       jtc  *    notice, this list of conditions and the following disclaimer in the
     14   1.1       jtc  *    documentation and/or other materials provided with the distribution.
     15  1.15       agc  * 3. Neither the name of the University nor the names of its contributors
     16   1.5       cgd  *    may be used to endorse or promote products derived from this software
     17   1.5       cgd  *    without specific prior written permission.
     18   1.1       jtc  *
     19   1.5       cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20   1.5       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21   1.5       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22   1.5       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23   1.5       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24   1.5       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25   1.5       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26   1.5       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27   1.5       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28   1.5       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29   1.5       cgd  * SUCH DAMAGE.
     30   1.1       jtc  */
     31   1.1       jtc 
     32   1.7  christos #include <sys/cdefs.h>
     33   1.2   mycroft #if defined(LIBC_SCCS) && !defined(lint)
     34   1.6       cgd #if 0
     35   1.6       cgd static char sccsid[] = "@(#)assert.c	8.1 (Berkeley) 6/4/93";
     36   1.6       cgd #else
     37  1.16    kleink __RCSID("$NetBSD: assert.c,v 1.16 2005/02/09 21:35:46 kleink Exp $");
     38   1.6       cgd #endif
     39   1.2   mycroft #endif /* LIBC_SCCS and not lint */
     40   1.2   mycroft 
     41  1.16    kleink #include "namespace.h"
     42   1.5       cgd #include <sys/types.h>
     43   1.8     lukem 
     44   1.5       cgd #include <assert.h>
     45   1.1       jtc #include <stdio.h>
     46   1.1       jtc #include <stdlib.h>
     47   1.8     lukem #include <syslog.h>
     48   1.9  christos 
     49   1.1       jtc void
     50  1.10    kleink __assert13(file, line, function, failedexpr)
     51  1.10    kleink 	const char *file, *function, *failedexpr;
     52  1.10    kleink 	int line;
     53  1.10    kleink {
     54  1.12     lukem 
     55  1.10    kleink 	(void)fprintf(stderr,
     56  1.10    kleink 	    "assertion \"%s\" failed: file \"%s\", line %d%s%s%s\n",
     57  1.10    kleink 	    failedexpr, file, line,
     58  1.10    kleink 	    function ? ", function \"" : "",
     59  1.10    kleink 	    function ? function : "",
     60  1.10    kleink 	    function ? "\"" : "");
     61  1.10    kleink 	abort();
     62  1.10    kleink 	/* NOTREACHED */
     63  1.10    kleink }
     64  1.10    kleink 
     65  1.10    kleink void
     66   1.5       cgd __assert(file, line, failedexpr)
     67   1.5       cgd 	const char *file, *failedexpr;
     68   1.1       jtc 	int line;
     69   1.1       jtc {
     70  1.12     lukem 
     71  1.12     lukem 	__assert13(file, line, NULL, failedexpr);
     72   1.5       cgd 	/* NOTREACHED */
     73  1.10    kleink }
     74  1.10    kleink 
     75  1.12     lukem 
     76  1.12     lukem enum {
     77  1.12     lukem 	DIAGASSERT_ABORT =	1<<0,
     78  1.12     lukem 	DIAGASSERT_STDERR =	1<<1,
     79  1.12     lukem 	DIAGASSERT_SYSLOG =	1<<2
     80  1.12     lukem };
     81  1.12     lukem 
     82  1.12     lukem static int	diagassert_flags = -1;
     83  1.12     lukem 
     84  1.10    kleink void
     85  1.10    kleink __diagassert13(file, line, function, failedexpr)
     86  1.10    kleink 	const char *file, *function, *failedexpr;
     87  1.10    kleink 	int line;
     88  1.10    kleink {
     89  1.12     lukem 	char buf[1024];
     90  1.12     lukem 
     91  1.12     lukem 	if (diagassert_flags == -1) {
     92  1.12     lukem 		char *p;
     93  1.12     lukem 
     94  1.12     lukem 		diagassert_flags = DIAGASSERT_SYSLOG;
     95  1.12     lukem 
     96  1.12     lukem 		for (p = getenv("LIBC_DIAGASSERT"); p && *p; p++) {
     97  1.12     lukem 			switch (*p) {
     98  1.12     lukem 			case 'a':
     99  1.12     lukem 				diagassert_flags |= DIAGASSERT_ABORT;
    100  1.12     lukem 				break;
    101  1.12     lukem 			case 'A':
    102  1.12     lukem 				diagassert_flags &= ~DIAGASSERT_ABORT;
    103  1.12     lukem 				break;
    104  1.12     lukem 			case 'e':
    105  1.12     lukem 				diagassert_flags |= DIAGASSERT_STDERR;
    106  1.12     lukem 				break;
    107  1.12     lukem 			case 'E':
    108  1.12     lukem 				diagassert_flags &= ~DIAGASSERT_STDERR;
    109  1.12     lukem 				break;
    110  1.12     lukem 			case 'l':
    111  1.12     lukem 				diagassert_flags |= DIAGASSERT_SYSLOG;
    112  1.12     lukem 				break;
    113  1.12     lukem 			case 'L':
    114  1.12     lukem 				diagassert_flags &= ~DIAGASSERT_SYSLOG;
    115  1.12     lukem 				break;
    116  1.12     lukem 			}
    117  1.12     lukem 		}
    118  1.12     lukem 	}
    119  1.12     lukem 
    120  1.12     lukem 	snprintf(buf, sizeof(buf),
    121  1.10    kleink 	    "assertion \"%s\" failed: file \"%s\", line %d%s%s%s",
    122  1.10    kleink 	    failedexpr, file, line,
    123  1.10    kleink 	    function ? ", function \"" : "",
    124  1.10    kleink 	    function ? function : "",
    125  1.10    kleink 	    function ? "\"" : "");
    126  1.12     lukem 	if (diagassert_flags & DIAGASSERT_STDERR)
    127  1.13       cgd 		(void)fprintf(stderr, "%s: %s\n", getprogname(), buf);
    128  1.12     lukem 	if (diagassert_flags & DIAGASSERT_SYSLOG)
    129  1.12     lukem 		syslog(LOG_DEBUG | LOG_USER, "%s", buf);
    130  1.12     lukem 	if (diagassert_flags & DIAGASSERT_ABORT)
    131  1.12     lukem 		abort();
    132   1.8     lukem }
    133   1.8     lukem 
    134   1.8     lukem void
    135   1.8     lukem __diagassert(file, line, failedexpr)
    136   1.8     lukem 	const char *file, *failedexpr;
    137   1.8     lukem 	int line;
    138   1.8     lukem {
    139  1.12     lukem 
    140  1.12     lukem 	__diagassert13(file, line, NULL, failedexpr);
    141   1.1       jtc }
    142