xref: /freebsd/contrib/ncurses/ncurses/tinfo/comp_error.c (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
10e3d5408SPeter Wemm /****************************************************************************
2*21817992SBaptiste Daroussin  * Copyright 2019-2020,2023 Thomas E. Dickey                                *
3e1865124SBaptiste Daroussin  * Copyright 1998-2012,2016 Free Software Foundation, Inc.                  *
40e3d5408SPeter Wemm  *                                                                          *
50e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
60e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
70e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
80e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
90e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
100e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
110e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
120e3d5408SPeter Wemm  *                                                                          *
130e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
140e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
150e3d5408SPeter Wemm  *                                                                          *
160e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
170e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
180e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
190e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
200e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
210e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
220e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
230e3d5408SPeter Wemm  *                                                                          *
240e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
250e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
260e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
270e3d5408SPeter Wemm  * authorization.                                                           *
280e3d5408SPeter Wemm  ****************************************************************************/
290e3d5408SPeter Wemm 
300e3d5408SPeter Wemm /****************************************************************************
310e3d5408SPeter Wemm  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
320e3d5408SPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
334a1a9510SRong-En Fan  *     and: Thomas E. Dickey                        1996-on                 *
340e3d5408SPeter Wemm  ****************************************************************************/
350e3d5408SPeter Wemm 
360e3d5408SPeter Wemm /*
370e3d5408SPeter Wemm  *	comp_error.c -- Error message routines
380e3d5408SPeter Wemm  *
390e3d5408SPeter Wemm  */
400e3d5408SPeter Wemm 
410e3d5408SPeter Wemm #include <curses.priv.h>
420e3d5408SPeter Wemm 
430e3d5408SPeter Wemm #include <tic.h>
440e3d5408SPeter Wemm 
45*21817992SBaptiste Daroussin MODULE_ID("$Id: comp_error.c,v 1.44 2023/06/15 20:27:02 tom Exp $")
460e3d5408SPeter Wemm 
477a69bbfbSPeter Wemm NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings = FALSE;
4839f2269fSPeter Wemm NCURSES_EXPORT_VAR(int) _nc_curr_line = 0; /* current line # in input */
4939f2269fSPeter Wemm NCURSES_EXPORT_VAR(int) _nc_curr_col = 0; /* current column # in input */
500e3d5408SPeter Wemm 
515ca44d1cSRong-En Fan #define SourceName	_nc_globals.comp_sourcename
525ca44d1cSRong-En Fan #define TermType	_nc_globals.comp_termtype
530e3d5408SPeter Wemm 
544a1a9510SRong-En Fan NCURSES_EXPORT(const char *)
_nc_get_source(void)554a1a9510SRong-En Fan _nc_get_source(void)
564a1a9510SRong-En Fan {
575ca44d1cSRong-En Fan     return SourceName;
584a1a9510SRong-En Fan }
594a1a9510SRong-En Fan 
607a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_set_source(const char * const name)617a69bbfbSPeter Wemm _nc_set_source(const char *const name)
620e3d5408SPeter Wemm {
63*21817992SBaptiste Daroussin     if (name == NULL) {
64*21817992SBaptiste Daroussin 	free(SourceName);
65*21817992SBaptiste Daroussin 	SourceName = NULL;
66*21817992SBaptiste Daroussin     } else if (SourceName == NULL) {
6773f0a83dSXin LI 	SourceName = strdup(name);
68*21817992SBaptiste Daroussin     } else if (strcmp(name, SourceName)) {
69*21817992SBaptiste Daroussin 	free(SourceName);
70*21817992SBaptiste Daroussin 	SourceName = strdup(name);
71*21817992SBaptiste Daroussin     }
720e3d5408SPeter Wemm }
730e3d5408SPeter Wemm 
747a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_set_type(const char * const name)757a69bbfbSPeter Wemm _nc_set_type(const char *const name)
760e3d5408SPeter Wemm {
77aae38d10SBaptiste Daroussin #define MY_SIZE (size_t) MAX_NAME_SIZE
785ca44d1cSRong-En Fan     if (TermType == 0)
79aae38d10SBaptiste Daroussin 	TermType = typeMalloc(char, MY_SIZE + 1);
805ca44d1cSRong-En Fan     if (TermType != 0) {
815ca44d1cSRong-En Fan 	TermType[0] = '\0';
82aae38d10SBaptiste Daroussin 	if (name) {
83aae38d10SBaptiste Daroussin 	    _nc_STRNCAT(TermType, name, MY_SIZE, MY_SIZE);
84aae38d10SBaptiste Daroussin 	}
850e3d5408SPeter Wemm     }
864a1a9510SRong-En Fan }
870e3d5408SPeter Wemm 
887a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_get_type(char * name)897a69bbfbSPeter Wemm _nc_get_type(char *name)
900e3d5408SPeter Wemm {
914a1a9510SRong-En Fan #if NO_LEAKS
925ca44d1cSRong-En Fan     if (name == 0 && TermType != 0) {
935ca44d1cSRong-En Fan 	FreeAndNull(TermType);
944a1a9510SRong-En Fan 	return;
954a1a9510SRong-En Fan     }
964a1a9510SRong-En Fan #endif
974a1a9510SRong-En Fan     if (name != 0)
9873f0a83dSXin LI 	_nc_STRCPY(name, TermType != 0 ? TermType : "", MAX_NAME_SIZE);
990e3d5408SPeter Wemm }
1000e3d5408SPeter Wemm 
1014a1a9510SRong-En Fan static NCURSES_INLINE void
where_is_problem(void)1027a69bbfbSPeter Wemm where_is_problem(void)
1030e3d5408SPeter Wemm {
1045ca44d1cSRong-En Fan     fprintf(stderr, "\"%s\"", SourceName ? SourceName : "?");
105*21817992SBaptiste Daroussin     if (_nc_curr_line > 0)
1060e3d5408SPeter Wemm 	fprintf(stderr, ", line %d", _nc_curr_line);
107*21817992SBaptiste Daroussin     if (_nc_curr_col > 0)
1080e3d5408SPeter Wemm 	fprintf(stderr, ", col %d", _nc_curr_col);
1095ca44d1cSRong-En Fan     if (TermType != 0 && TermType[0] != '\0')
1105ca44d1cSRong-En Fan 	fprintf(stderr, ", terminal '%s'", TermType);
1110e3d5408SPeter Wemm     fputc(':', stderr);
1120e3d5408SPeter Wemm     fputc(' ', stderr);
1130e3d5408SPeter Wemm }
1140e3d5408SPeter Wemm 
1157a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_warning(const char * const fmt,...)1167a69bbfbSPeter Wemm _nc_warning(const char *const fmt, ...)
1170e3d5408SPeter Wemm {
1180e3d5408SPeter Wemm     va_list argp;
1190e3d5408SPeter Wemm 
1200e3d5408SPeter Wemm     if (_nc_suppress_warnings)
1210e3d5408SPeter Wemm 	return;
1220e3d5408SPeter Wemm 
1230e3d5408SPeter Wemm     where_is_problem();
1240e3d5408SPeter Wemm     va_start(argp, fmt);
1250e3d5408SPeter Wemm     vfprintf(stderr, fmt, argp);
1260e3d5408SPeter Wemm     fprintf(stderr, "\n");
1270e3d5408SPeter Wemm     va_end(argp);
1280e3d5408SPeter Wemm }
1290e3d5408SPeter Wemm 
1307a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_err_abort(const char * const fmt,...)1317a69bbfbSPeter Wemm _nc_err_abort(const char *const fmt, ...)
1320e3d5408SPeter Wemm {
1330e3d5408SPeter Wemm     va_list argp;
1340e3d5408SPeter Wemm 
1350e3d5408SPeter Wemm     where_is_problem();
1360e3d5408SPeter Wemm     va_start(argp, fmt);
1370e3d5408SPeter Wemm     vfprintf(stderr, fmt, argp);
1380e3d5408SPeter Wemm     fprintf(stderr, "\n");
1390e3d5408SPeter Wemm     va_end(argp);
1400e3d5408SPeter Wemm     exit(EXIT_FAILURE);
1410e3d5408SPeter Wemm }
1420e3d5408SPeter Wemm 
1437a69bbfbSPeter Wemm NCURSES_EXPORT(void)
_nc_syserr_abort(const char * const fmt,...)1447a69bbfbSPeter Wemm _nc_syserr_abort(const char *const fmt, ...)
1450e3d5408SPeter Wemm {
1460e3d5408SPeter Wemm     va_list argp;
1470e3d5408SPeter Wemm 
1480e3d5408SPeter Wemm     where_is_problem();
1490e3d5408SPeter Wemm     va_start(argp, fmt);
1500e3d5408SPeter Wemm     vfprintf(stderr, fmt, argp);
1510e3d5408SPeter Wemm     fprintf(stderr, "\n");
1520e3d5408SPeter Wemm     va_end(argp);
1530e3d5408SPeter Wemm 
154aae38d10SBaptiste Daroussin #if defined(TRACE) || !defined(NDEBUG)
1550e3d5408SPeter Wemm     /* If we're debugging, try to show where the problem occurred - this
1560e3d5408SPeter Wemm      * will dump core.
1570e3d5408SPeter Wemm      */
158*21817992SBaptiste Daroussin     if (_nc_env_access())
1590e3d5408SPeter Wemm 	abort();
160aae38d10SBaptiste Daroussin #endif
1610e3d5408SPeter Wemm     /* Dumping core in production code is not a good idea.
1620e3d5408SPeter Wemm      */
1630e3d5408SPeter Wemm     exit(EXIT_FAILURE);
1640e3d5408SPeter Wemm }
16573f0a83dSXin LI 
16673f0a83dSXin LI #if NO_LEAKS
16773f0a83dSXin LI NCURSES_EXPORT(void)
_nc_comp_error_leaks(void)16873f0a83dSXin LI _nc_comp_error_leaks(void)
16973f0a83dSXin LI {
17073f0a83dSXin LI     FreeAndNull(SourceName);
17173f0a83dSXin LI     FreeAndNull(TermType);
17273f0a83dSXin LI }
17373f0a83dSXin LI #endif
174