home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / ios.h < prev    next >
C/C++ Source or Header  |  2000-02-01  |  11KB  |  421 lines

  1. #ifndef __IOS_H
  2. #define __IOS_H
  3. #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
  4. // -*- C++ -*-
  5. #ifndef __STD_IOS__
  6. #define __STD_IOS__
  7.  
  8. /***************************************************************************
  9.  *
  10.  * ios - Declarations for the Standard Library basic stream I/O
  11.  *
  12.  ***************************************************************************
  13.  *
  14.  * Copyright (c) 1994-1999 Rogue Wave Software, Inc.  All Rights Reserved.
  15.  *
  16.  * This computer software is owned by Rogue Wave Software, Inc. and is
  17.  * protected by U.S. copyright laws and other laws and by international
  18.  * treaties.  This computer software is furnished by Rogue Wave Software,
  19.  * Inc. pursuant to a written license agreement and may be used, copied,
  20.  * transmitted, and stored only in accordance with the terms of such
  21.  * license and with the inclusion of the above copyright notice.  This
  22.  * computer software or any other copies thereof may not be provided or
  23.  * otherwise made available to any other person.
  24.  *
  25.  * U.S. Government Restricted Rights.  This computer software is provided
  26.  * with Restricted Rights.  Use, duplication, or disclosure by the
  27.  * Government is subject to restrictions as set forth in subparagraph (c)
  28.  * (1) (ii) of The Rights in Technical Data and Computer Software clause
  29.  * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
  30.  * Commercial Computer Software û Restricted Rights at 48 CFR 52.227-19,
  31.  * as applicable.  Manufacturer is Rogue Wave Software, Inc., 5500
  32.  * Flatiron Parkway, Boulder, Colorado 80301 USA.
  33.  *
  34.  **************************************************************************/
  35.  
  36. #include <stdcomp.h>
  37.  
  38. #include <rw/rwstderr.h>        // error messages
  39. #include <rw/rwlocale>          // locale class
  40. #include <rw/ctype>             // facets
  41. #include <rw/codecvt>           // code coversion facet
  42. #include <rw/numeral>           // numeric facet 
  43. #include <rw/vendor>            // standard xxx_byname facets & vendor-defined extensions
  44. #include <rw/usefacet>          // usefacet and hasfacet
  45. #ifndef _RWSTD_NO_NAMESPACE
  46. namespace __rwstd {
  47. #endif
  48.  
  49. #ifdef _RWSTD_LOCALIZED_ERRORS
  50.   extern const unsigned int _RWSTDExport rwse_failbit_set;
  51.   extern const unsigned int _RWSTDExport rwse_badbit_set;
  52.   extern const unsigned int _RWSTDExport rwse_eofbit_set;
  53. #else
  54.   extern const char _RWSTDExportFunc(*) rwse_failbit_set;
  55.   extern const char _RWSTDExportFunc(*) rwse_badbit_set;
  56.   extern const char _RWSTDExportFunc(*) rwse_eofbit_set;
  57. #endif // _RWSTD_LOCALIZED_ERRORS
  58. #ifndef _RWSTD_NO_NAMESPACE
  59. }
  60. namespace std {
  61. #endif
  62.  
  63.   /*
  64.    *    Class basic_ios
  65.    */
  66.  
  67.   template<class charT, class traits>
  68.   class _RWSTDExportTemplate basic_ios : public ios_base
  69.   { 
  70.  
  71.   public:
  72.     //
  73.     // Types:
  74.     //
  75.     typedef _TYPENAME traits::char_type        char_type;
  76.     typedef _TYPENAME traits::int_type         int_type;
  77.     typedef _TYPENAME traits::pos_type         pos_type;
  78.     typedef _TYPENAME traits::off_type         off_type;
  79.     typedef traits                             traits_type;
  80.       
  81.     typedef basic_ios<charT, traits>           ios_type;
  82.     typedef basic_streambuf<charT, traits>     streambuf_type; 
  83.     typedef basic_ostream<charT, traits>       ostream_type;
  84.  
  85.     inline operator void*() const;
  86.     inline bool operator! () const;
  87.     inline iostate rdstate() const;
  88.     inline void clear(iostate state = goodbit);
  89.     inline void setstate(iostate state);
  90.  
  91.     inline bool good() const;
  92.     inline bool eof()  const;
  93.     inline bool fail() const;
  94.     inline bool bad()  const;
  95.       
  96.     inline iostate exceptions() const;
  97.     inline void exceptions(iostate excpt);
  98.       
  99.     _EXPLICIT basic_ios(basic_streambuf<charT, traits> *sb_arg);
  100.     virtual ~basic_ios();
  101.  
  102.     inline ostream_type *tie() const;
  103.     ostream_type *tie(ostream_type *tie_arg);
  104.  
  105.     inline streambuf_type *rdbuf() const;
  106.     streambuf_type *rdbuf( streambuf_type *sb);
  107.  
  108.     ios_type& copyfmt(const ios_type& rhs);
  109.       
  110.     char_type fill() const
  111.     {
  112.       return __fillch;
  113.     }
  114.     char_type fill(char_type ch)
  115.     {
  116. #ifdef _RWSTD_MULTI_THREAD
  117.       _RWSTDGuard guard(this->__stream_mutex);
  118. #endif
  119.       char_type    temp = __fillch;
  120.       __fillch = ch;
  121.       return temp;
  122.     }
  123.     locale imbue(const locale& loc);
  124.  
  125.     inline char  narrow(charT, char) const;
  126.     inline charT widen(char) const;
  127.  
  128.   protected:
  129.     basic_ios();
  130.     basic_ios(int) : ios_base(1) {} // empty contructor for creating unitialized stream
  131.     void init(basic_streambuf<charT, traits> *sb);
  132.       
  133.     inline void _RW_UNSAFE_clear(iostate state = goodbit);
  134.  
  135.   private:
  136.     basic_ios(const basic_ios& );       //  not defined
  137.     basic_ios& operator=(const basic_ios&);     //  not defined
  138.  
  139.     streambuf_type       *__sb;    
  140.     ostream_type         *__tiestr;   
  141.     char_type            __fillch; 
  142.     iostate              __state;   
  143.     iostate              _Except; 
  144.  
  145.   };
  146.  
  147.   /*
  148.    * basic_streambuf *rdbuf() const
  149.    */
  150.  
  151.   template<class charT, class traits>
  152.   inline basic_streambuf<charT, traits> *
  153.   basic_ios<charT, traits>::rdbuf() const
  154.   {
  155.     return __sb;
  156.   }
  157.  
  158.   /*
  159.    * basic_ostream *tie() const
  160.    */
  161.  
  162.   template<class charT, class traits>
  163.   inline basic_ostream<charT, traits> *
  164.   basic_ios<charT, traits>::tie() const
  165.   {
  166.     return __tiestr;
  167.   }
  168.  
  169.   /*
  170.    * void exceptions(iostate)
  171.    */
  172.  
  173.   template<class charT, class traits>
  174.   inline void 
  175.   basic_ios<charT, traits>::exceptions(ios_base::iostate st)
  176.   {
  177. #ifdef _RWSTD_MULTI_THREAD
  178.     _RWSTDGuard guard(this->__stream_mutex);
  179. #endif
  180.     _Except = st;
  181.  
  182. #ifdef _RWSTD_MULTI_THREAD
  183.     _RW_UNSAFE_clear(rdstate()); 
  184. #else
  185.     clear(rdstate());
  186. #endif //  _RWSTD_MULTI_THREAD
  187.   }
  188.  
  189.   /*
  190.    * iostate exceptions() const
  191.    */
  192.  
  193.   template<class charT, class traits>
  194.   inline ios_base::iostate 
  195.   basic_ios<charT, traits>::exceptions() const
  196.   { 
  197.     return _Except;
  198.   }
  199.  
  200.   /*
  201.    * void clear(iostate )
  202.    */
  203.  
  204.   template<class charT, class traits>
  205.   inline void 
  206.   basic_ios<charT, traits>::clear(iostate st)
  207.   {
  208. #ifdef _RWSTD_MULTI_THREAD
  209.     _RWSTDGuard guard(this->__stream_mutex);
  210. #endif 
  211.     _RW_UNSAFE_clear(st); 
  212.   }
  213.  
  214.   /*
  215.    * void setstate(iostate)
  216.    */
  217.  
  218.   template<class charT, class traits>
  219.   inline void
  220.   basic_ios<charT, traits>::setstate(iostate st)
  221.   {
  222. #ifdef _RWSTD_MULTI_THREAD
  223.     _RWSTDGuard guard(this->__stream_mutex);
  224. #endif // _RWSTD_MULTI_THREAD
  225.  
  226. #ifdef _RWSTD_MULTI_THREAD
  227.     _RW_UNSAFE_clear(__state | st); 
  228. #else
  229.     clear(__state | st);
  230. #endif // _RWSTD_MULTI_THREAD
  231.   }
  232.  
  233.   /*
  234.    * iostate rdstate() const
  235.    */
  236.  
  237.   template<class charT, class traits>
  238.   inline ios_base::iostate 
  239.   basic_ios<charT, traits>::rdstate() const
  240.   {
  241.     return __state;
  242.   }
  243.  
  244.   /*
  245.    * operator bool() const
  246.    */
  247.  
  248.   template<class charT, class traits>
  249.   inline basic_ios<charT, traits>::operator void*() const
  250.   {
  251.     return fail() ? (void*)0 : (void*)1;
  252.   }
  253.  
  254.   /*
  255.    * bool operator!() const
  256.    */
  257.  
  258.   template<class charT, class traits>
  259.   inline bool 
  260.   basic_ios<charT, traits>::operator!() const
  261.   {
  262.     return fail();
  263.   }
  264.  
  265.   /*
  266.    * bool good() const
  267.    */
  268.  
  269.   template<class charT, class traits>
  270.   inline bool 
  271.   basic_ios<charT, traits>::good() const
  272.   {
  273.     return (__state == ios_base::goodbit);
  274.   }
  275.  
  276.   /*
  277.    * bool eof() const
  278.    */
  279.  
  280.   template<class charT, class traits>
  281.   inline bool 
  282.   basic_ios<charT, traits>::eof() const
  283.   {
  284.     return (__state & ios_base::eofbit);
  285.   }
  286.  
  287.   /*
  288.    * bool fail() const
  289.    */
  290.  
  291.   template<class charT, class traits>
  292.   inline bool 
  293.   basic_ios<charT, traits>::fail() const
  294.   {
  295.     return (__state & (ios_base::failbit | ios_base::badbit));
  296.   }
  297.  
  298.   /*
  299.    * bool bad() const
  300.    */
  301.  
  302.   template<class charT, class traits>
  303.   inline bool 
  304.   basic_ios<charT, traits>::bad() const
  305.   {
  306.     return (__state & ios_base::badbit);
  307.   }
  308.  
  309.   /*
  310.    * void _RW_UNSAFE_clear(iostate )
  311.    */
  312.  
  313.   template<class charT, class traits>
  314.   inline void 
  315.   basic_ios<charT, traits>::_RW_UNSAFE_clear(iostate st)
  316.   {
  317.     if ( !__sb ) 
  318.     {
  319.       st |= ios_base::badbit;
  320.       __state |= ios_base::badbit; 
  321.     }
  322.  
  323.     __state = st;
  324.  
  325.     if( rdstate() & exceptions() )
  326.     {
  327. #ifdef _RW_STD_EXCEPT
  328. #ifndef _RWSTD_NO_EXCEPTIONS
  329.       if ( rdstate() & exceptions() & ios_base::failbit )
  330.       { 
  331.         __state=st;
  332.         throw ios_base::failure( string(__RWSTD::except_msg_string(__RWSTD::rwse_failbit_set).msgstr()) );
  333.       }
  334.  
  335.       if ( rdstate() & exceptions() & ios_base::badbit )
  336.       { 
  337.         __state=st;
  338.         throw ios_base::failure( string(__RWSTD::except_msg_string(__RWSTD::rwse_badbit_set).msgstr()) );
  339.       }
  340.       if ( rdstate() & exceptions() & ios_base::eofbit )
  341.       { 
  342.         __state=st;
  343.         throw ios_base::failure( string(__RWSTD::except_msg_string(__RWSTD::rwse_eofbit_set).msgstr()) );
  344.       }
  345. #endif //  _RWSTD_NO_EXCEPTIONS
  346. #endif //  _RW_STD_EXCEPT
  347.     }
  348.   }
  349.  
  350.   /*
  351.    * char narrow(charT, char) const
  352.    */
  353.  
  354.   template<class charT, class traits>
  355.   inline char 
  356.   basic_ios<charT, traits>::narrow(charT c, char dfault) const
  357.   {
  358. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  359.     return use_facet< ctype<charT> >(getloc()).narrow(c,dfault);
  360. #else
  361.     return use_facet(getloc(),(ctype<charT>*)0).narrow(c,dfault);
  362. #endif
  363.      
  364.   }
  365.  
  366.   /*
  367.    * charT widen(char) const
  368.    */
  369.  
  370.   template<class charT, class traits>
  371.   inline charT 
  372.   basic_ios<charT, traits>::widen(char c) const
  373.   {
  374. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  375.     return use_facet< ctype<charT> >(getloc()).widen(c);
  376. #else
  377.     return use_facet(getloc(),(ctype<charT>*)0).widen(c);
  378. #endif
  379.      
  380.   }
  381.  
  382. #ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
  383.   typedef basic_ios<char>                          ios;
  384. #else
  385.   typedef basic_ios<char, char_traits<char> >      ios;
  386. #endif
  387.  
  388. #ifndef _RWSTD_NO_WIDE_CHAR
  389. #ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
  390.   typedef basic_ios<wchar_t>                         wios;
  391. #else
  392.   typedef basic_ios<wchar_t, char_traits<wchar_t> >  wios;
  393. #endif //  _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
  394. #endif //  _RWSTD_NO_WIDE_CHAR
  395.  
  396.   /*
  397.    *     external declarations for manipulators
  398.    */
  399.  
  400. #ifdef _RWSTD_MULTI_THREAD
  401.   template <class charT, class traits>
  402.   basic_ios<charT,traits>& __lock(basic_ios<charT,traits>&);
  403.  
  404.   template <class charT, class traits>
  405.   basic_ios<charT,traits>& __unlock(basic_ios<charT,traits>&);
  406. #endif // _RWSTD_MULTI_THREAD
  407. #ifndef _RWSTD_NO_NAMESPACE
  408. }
  409. #endif
  410.  
  411. #ifdef _RWSTD_COMPILE_INSTANTIATE
  412. #include <ios.cc>
  413. #endif // _RWSTD_COMPILE_INSTANTIATE
  414. #endif // __STD_IOS_
  415. #ifndef __USING_STD_NAMES__
  416.   using namespace std;
  417. #endif
  418.  
  419. #pragma option pop
  420. #endif /* __IOS_H */
  421.