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