1// * This makes emacs happy -*-Mode: C++;-*-
2/****************************************************************************
3 * Copyright 2018-2020,2021 Thomas E. Dickey                                *
4 * Copyright 1998-2012,2017 Free Software Foundation, Inc.                  *
5 *                                                                          *
6 * Permission is hereby granted, free of charge, to any person obtaining a  *
7 * copy of this software and associated documentation files (the            *
8 * "Software"), to deal in the Software without restriction, including      *
9 * without limitation the rights to use, copy, modify, merge, publish,      *
10 * distribute, distribute with modifications, sublicense, and/or sell       *
11 * copies of the Software, and to permit persons to whom the Software is    *
12 * furnished to do so, subject to the following conditions:                 *
13 *                                                                          *
14 * The above copyright notice and this permission notice shall be included  *
15 * in all copies or substantial portions of the Software.                   *
16 *                                                                          *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24 *                                                                          *
25 * Except as contained in this notice, the name(s) of the above copyright   *
26 * holders shall not be used in advertising or otherwise to promote the     *
27 * sale, use or other dealings in this Software without prior written       *
28 * authorization.                                                           *
29 ****************************************************************************/
30
31/****************************************************************************
32 *   Author: Juergen Pfeifer, 1997                                          *
33 ****************************************************************************/
34
35// $Id: etip.h.in,v 1.48 2021/06/17 21:11:08 tom Exp $
36
37#ifndef NCURSES_ETIP_H_incl
38#define NCURSES_ETIP_H_incl 1
39
40// These are substituted at configure/build time
41#ifndef HAVE_BUILTIN_H
42#define HAVE_BUILTIN_H 0
43#endif
44
45#ifndef HAVE_GXX_BUILTIN_H
46#define HAVE_GXX_BUILTIN_H 0
47#endif
48
49#ifndef HAVE_GPP_BUILTIN_H
50#define HAVE_GPP_BUILTIN_H 0
51#endif
52
53#ifndef HAVE_IOSTREAM
54#define HAVE_IOSTREAM 0
55#endif
56
57#ifndef HAVE_TYPEINFO
58#define HAVE_TYPEINFO 0
59#endif
60
61#ifndef HAVE_VALUES_H
62#define HAVE_VALUES_H 0
63#endif
64
65#ifndef ETIP_NEEDS_MATH_H
66#define ETIP_NEEDS_MATH_H 0
67#endif
68
69#ifndef ETIP_NEEDS_MATH_EXCEPTION
70#define ETIP_NEEDS_MATH_EXCEPTION 0
71#endif
72
73#ifndef CPP_HAS_PARAM_INIT
74#define CPP_HAS_PARAM_INIT 0
75#endif
76
77#ifndef CPP_HAS_STATIC_CAST
78#define CPP_HAS_STATIC_CAST 0	// workaround for g++ 2.95.3
79#endif
80
81#ifndef IOSTREAM_NAMESPACE
82#define IOSTREAM_NAMESPACE 0
83#endif
84
85#ifdef __GNUG__
86#  if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
87#    if HAVE_TYPEINFO
88#      include <typeinfo>
89#    endif
90#  endif
91#endif
92
93#if defined(__GNUG__)
94#  if HAVE_BUILTIN_H || HAVE_GXX_BUILTIN_H || HAVE_GPP_BUILTIN_H
95#    if ETIP_NEEDS_MATH_H
96#      if ETIP_NEEDS_MATH_EXCEPTION
97#        undef exception
98#        define exception math_exception
99#      endif
100#      include <math.h>
101#    endif
102#    undef exception
103#    define exception builtin_exception
104#    if HAVE_GPP_BUILTIN_H
105#     include <gpp/builtin.h>
106#    elif HAVE_GXX_BUILTIN_H
107#     include <g++/builtin.h>
108#    else
109#     include <builtin.h>
110#    endif
111#    undef exception
112#  endif
113#elif defined (__SUNPRO_CC)
114#  include <generic.h>
115#endif
116
117#include <curses.h>
118
119extern "C" {
120#if HAVE_VALUES_H
121#  include <values.h>
122#endif
123
124#include <assert.h>
125#include <eti.h>
126#include <errno.h>
127}
128
129// Language features
130#if CPP_HAS_PARAM_INIT
131#define NCURSES_PARAM_INIT(value) = value
132#else
133#define NCURSES_PARAM_INIT(value) /*nothing*/
134#endif
135
136#if CPP_HAS_STATIC_CAST
137#define STATIC_CAST(s) static_cast<s>
138#else
139#define STATIC_CAST(s) (s)
140#endif
141
142#ifndef NCURSES_CXX_IMPEXP
143#define NCURSES_CXX_IMPEXP  /* nothing */
144#endif
145
146// Forward Declarations
147class NCURSES_CXX_IMPEXP NCursesPanel;
148class NCURSES_CXX_IMPEXP NCursesMenu;
149class NCURSES_CXX_IMPEXP NCursesForm;
150
151class NCURSES_CXX_IMPEXP NCursesException
152{
153public:
154  const char *message;
155  int errorno;
156
157  NCursesException (const char* msg, int err)
158    : message(msg), errorno (err)
159    {};
160
161  explicit NCursesException (const char* msg)
162    : message(msg), errorno (E_SYSTEM_ERROR)
163    {};
164
165  NCursesException& operator=(const NCursesException& rhs)
166  {
167    message = rhs.message;
168    errorno = rhs.errorno;
169    return *this;
170  }
171
172  NCursesException(const NCursesException& rhs)
173    : message(rhs.message), errorno(rhs.errorno)
174  {
175  }
176
177  virtual const char *classname() const {
178    return "NCursesWindow";
179  }
180
181  virtual ~NCursesException()
182  {
183  }
184};
185
186class NCURSES_CXX_IMPEXP NCursesPanelException : public NCursesException
187{
188public:
189  const NCursesPanel* p;
190
191  NCursesPanelException (const char *msg, int err) :
192    NCursesException (msg, err),
193    p (0)
194    {};
195
196  NCursesPanelException (const NCursesPanel* panel,
197			 const char *msg,
198			 int err) :
199    NCursesException (msg, err),
200    p (panel)
201    {};
202
203  explicit NCursesPanelException (int err) :
204    NCursesException ("panel library error", err),
205    p (0)
206    {};
207
208  NCursesPanelException (const NCursesPanel* panel,
209			 int err) :
210    NCursesException ("panel library error", err),
211    p (panel)
212    {};
213
214  NCursesPanelException& operator=(const NCursesPanelException& rhs)
215  {
216    if (this != &rhs) {
217      NCursesException::operator=(rhs);
218      p = rhs.p;
219    }
220    return *this;
221  }
222
223  NCursesPanelException(const NCursesPanelException& rhs)
224    : NCursesException(rhs), p(rhs.p)
225  {
226  }
227
228  virtual const char *classname() const {
229    return "NCursesPanel";
230  }
231
232  virtual ~NCursesPanelException()
233  {
234  }
235};
236
237class NCURSES_CXX_IMPEXP NCursesMenuException : public NCursesException
238{
239public:
240  const NCursesMenu* m;
241
242  NCursesMenuException (const char *msg, int err) :
243    NCursesException (msg, err),
244    m (0)
245    {};
246
247  NCursesMenuException (const NCursesMenu* menu,
248			const char *msg,
249			int err) :
250    NCursesException (msg, err),
251    m (menu)
252    {};
253
254  explicit NCursesMenuException (int err) :
255    NCursesException ("menu library error", err),
256    m (0)
257    {};
258
259  NCursesMenuException (const NCursesMenu* menu,
260			int err) :
261    NCursesException ("menu library error", err),
262    m (menu)
263    {};
264
265  NCursesMenuException& operator=(const NCursesMenuException& rhs)
266  {
267    if (this != &rhs) {
268      NCursesException::operator=(rhs);
269      m = rhs.m;
270    }
271    return *this;
272  }
273
274  NCursesMenuException(const NCursesMenuException& rhs)
275    : NCursesException(rhs), m(rhs.m)
276  {
277  }
278
279  virtual const char *classname() const {
280    return "NCursesMenu";
281  }
282
283  virtual ~NCursesMenuException()
284  {
285  }
286};
287
288class NCURSES_CXX_IMPEXP NCursesFormException : public NCursesException
289{
290public:
291  const NCursesForm* f;
292
293  NCursesFormException (const char *msg, int err) :
294    NCursesException (msg, err),
295    f (0)
296    {};
297
298  NCursesFormException (const NCursesForm* form,
299			const char *msg,
300			int err) :
301    NCursesException (msg, err),
302    f (form)
303    {};
304
305  explicit NCursesFormException (int err) :
306    NCursesException ("form library error", err),
307    f (0)
308    {};
309
310  NCursesFormException (const NCursesForm* form,
311			int err) :
312    NCursesException ("form library error", err),
313    f (form)
314    {};
315
316  NCursesFormException& operator=(const NCursesFormException& rhs)
317  {
318    if (this != &rhs) {
319      NCursesException::operator=(rhs);
320      f = rhs.f;
321    }
322    return *this;
323  }
324
325  NCursesFormException(const NCursesFormException& rhs)
326    : NCursesException(rhs), f(rhs.f)
327  {
328  }
329
330  virtual const char *classname() const {
331    return "NCursesForm";
332  }
333
334  virtual ~NCursesFormException()
335  {
336  }
337};
338
339#if !((defined(__GNUG__) && defined(__EXCEPTIONS) && (__GNUG__ < 7)) || defined(__SUNPRO_CC))
340#  if HAVE_IOSTREAM
341#     include <iostream>
342#     if IOSTREAM_NAMESPACE
343using std::cerr;
344using std::endl;
345#     endif
346#  else
347#     include <iostream.h>
348#  endif
349#endif
350
351inline void THROW(const NCursesException *e) {
352#if defined(__GNUG__) && defined(__EXCEPTIONS)
353#  if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
354      (*lib_error_handler)(e ? e->classname() : "", e ? e->message : "");
355#  elif (__GNUG__ >= 7)
356     // g++ 7.0 warns about deprecation, but lacks the predefined symbols
357      ::endwin();
358      std::cerr << "Found a problem - goodbye" << std::endl;
359      exit(EXIT_FAILURE);
360#  else
361#    define CPP_HAS_TRY_CATCH 1
362#  endif
363#elif defined(__SUNPRO_CC)
364#  if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5)
365  genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
366#  else
367#    define CPP_HAS_TRY_CATCH 1
368#  endif
369#else
370  if (e)
371    cerr << e->message << endl;
372  exit(0);
373#endif
374
375#ifndef CPP_HAS_TRY_CATCH
376#define CPP_HAS_TRY_CATCH 0
377#define NCURSES_CPP_TRY		/* nothing */
378#define NCURSES_CPP_CATCH(e)	if (false)
379#define THROWS(s)		/* nothing */
380#define THROW2(s,t)		/* nothing */
381#elif CPP_HAS_TRY_CATCH
382  throw *e;
383#define NCURSES_CPP_TRY		try
384#define NCURSES_CPP_CATCH(e)	catch(e)
385#if defined(__cpp_noexcept_function_type) && (__cpp_noexcept_function_type >= 201510)
386// C++17 deprecates the usage of throw().
387#define THROWS(s)		/* nothing */
388#define THROW2(s,t)		/* nothing */
389#else
390#define THROWS(s)		throw(s)
391#define THROW2(s,t)		throw(s,t)
392#endif
393#endif
394}
395
396#endif /* NCURSES_ETIP_H_incl */
397