#ifndef cathlibcpp_extinsutil_H
#define cathlibcpp_extinsutil_H

// File:       extinsutil.h
// Author:     (c) Miles Sabin, 1997
// Purpose:    boilerplate for extracters/inserters


#define EXTRACTER_PROLOGUE(is, noskipws, state)    \
state = ios::goodbit;                              \
try                                                \
{                                                  \
  basic_istream_char_sentry sentry(is, noskipws);  \
  DESTROY_ON_THROW(sentry);                        \
                                                   \
  if(!sentry)                                      \
    state |= ios::failbit;                         \
  else                                             \
  {


#define EXTRACTER_EPILOGUE(is, state)              \
  }                                                \
}                                                  \
BEGIN_HANDLERS                                     \
catch_DOTS                                         \
{                                                  \
  try                                              \
  {                                                \
    is.setstate(state|ios::badbit);                \
  }                                                \
  BEGIN_HANDLERS                                   \
  catch_DOTS                                       \
  {}                                               \
  END_HANDLERS                                     \
                                                   \
  if((is.exceptions()&ios::badbit) != 0)           \
    rethrow;                                       \
}                                                  \
END_HANDLERS                                       \
                                                   \
if(state != ios::goodbit)                          \
  is.setstate(state);


#define INSERTER_PROLOGUE(os, state)               \
state = ios::goodbit;                              \
try                                                \
{                                                  \
  basic_ostream_char_sentry sentry(os);            \
  DESTROY_ON_THROW(sentry);                        \
                                                   \
  if(!sentry)                                      \
    state |= ios::failbit;                         \
  else                                             \
  {

#define INSERTER_EPILOGUE(os, state)               \
  }                                                \
}                                                  \
BEGIN_HANDLERS                                     \
catch_DOTS                                         \
{                                                  \
  try                                              \
  {                                                \
    os.setstate(state|ios::badbit);                \
  }                                                \
  BEGIN_HANDLERS                                   \
  catch_DOTS                                       \
  {}                                               \
  END_HANDLERS                                     \
                                                   \
  if((os.exceptions()&ios::badbit) != 0)           \
    rethrow;                                       \
}                                                  \
END_HANDLERS                                       \
                                                   \
if(state != ios::goodbit)                          \
  os.setstate(state);

#endif
