⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _file.h

📁 realview22.rar
💻 H
📖 第 1 页 / 共 2 页
字号:
    long _C_seek (long __offset, int __origin) {
        int __rc = fseek (_C_fptr, __offset, __origin);
        if (__rc != 0)
            return -1;
        return ftell (_C_fptr);
    }

    int _C_flush () {
        return _C_is_open () ? fflush(_C_fptr) : EOF;
    }

#endif   //_RWSTD_NO_NATIVE_IO

private:

    FILE *_C_fptr;   // file pointer - used if _RWSTD_NO_NATIVE_IO is undef'd
    int   _C_fdsc;   // file descriptor - used otherwise (default)
};



inline int __rw_file_t::_C_get_mode (int __fd)
{
// FIXME -- need to have equivalent of fcntl() on win32.
#if defined (_RWSTD_NO_NATIVE_IO) 
    return __fd == STDIN_FILENO
               ? _RWSTD_IOS_IN
               : __fd == STDOUT_FILENO || __fd == STDERR_FILENO
                   ? _RWSTD_IOS_OUT : _RWSTD_IOS_OUT | _RWSTD_IOS_IN;
#else    
   int __m = fcntl (__fd, F_GETFL);

   if (__m == -1)
       return _RWSTD_INVALID_OPENMODE;

   int __mode = __m & O_APPEND ? _RWSTD_IOS_APP : 0;

   switch (__m & O_ACCMODE) {
       case O_RDONLY: __mode |= _RWSTD_IOS_IN; break;
       case O_WRONLY: __mode |= _RWSTD_IOS_OUT; break;
       case O_RDWR:   __mode |= _RWSTD_IOS_IN | _RWSTD_IOS_OUT; break;
   }

   return __mode;
#endif
}


inline int __rw_file_t::_C_get_mode (FILE *__fp)
{
    return _C_get_mode (_C_fileno (__fp));
}


#ifndef _RWSTD_NO_NATIVE_IO

#ifdef _INLINE_WITH_STATICS

_INLINE_WITH_STATICS int
__rw_file_t::_C_get_mode_arg (int __index) const
{
#if    !(defined (__osf__) && defined (__GNUG__) \
    && __GNUG__ == 2 && __GNUG_MINOR__ < 96)
    // static not used to prevent a g++ 2.95.2 warning on Tru64
    // sorry: semantics of inline function static data are wrong
    // (you'll wind up with multiple copies)
    static
#endif
    const int __modetbl [] = {
        -1,                                        // no flags error
        O_WRONLY | O_APPEND | O_CREAT,             // app
        -1 | _BINARY,                              // binary
        O_WRONLY | _BINARY |  O_APPEND | O_CREAT,  // binary|app
        O_RDONLY,                                  // in
        O_RDONLY | O_APPEND,                       // in|app
        O_RDONLY | _BINARY,                        // in|binary
        O_RDONLY | _BINARY | O_APPEND | O_CREAT,   // in|binary|app
        O_TRUNC  | O_WRONLY | O_CREAT,             // out
        O_WRONLY | O_APPEND | O_CREAT,             // out|app
        O_TRUNC | O_WRONLY | O_CREAT | _BINARY,    // out|binary
        O_WRONLY | _BINARY | O_APPEND | O_CREAT,   // out|binary|app
        O_RDWR,                                    // out|in
        O_RDWR | O_APPEND | O_CREAT,               // out|in|app
        O_RDWR | _BINARY,                          // out|in|binary
        O_RDWR | _BINARY  | O_APPEND | O_CREAT,    // out|in|binary|app
        O_TRUNC,                                   // trunc
        O_TRUNC | O_APPEND,                        // trunc|app
        O_TRUNC | _BINARY,                         // trunc|binary
        O_TRUNC | O_APPEND | _BINARY,              // trunc|binary|app
        O_TRUNC | O_RDONLY,                        // trunc|in
        O_TRUNC | O_RDONLY | O_APPEND,             // trunc|in|app
        O_TRUNC | O_RDONLY | _BINARY,              // trunc|in|binary
        O_TRUNC | O_RDONLY | _BINARY  | O_APPEND,  // trunc|in|binary|app
        O_TRUNC | O_WRONLY | O_CREAT,              // trunc|out
        O_TRUNC | O_WRONLY | O_APPEND | O_CREAT,   // trunc|out|app
        O_TRUNC | O_WRONLY | _BINARY  | O_CREAT,   // trunc|out|binary
        O_TRUNC | O_WRONLY | _BINARY  | O_APPEND| O_CREAT,// trunc|out|binary|app
        O_TRUNC | O_RDWR | O_CREAT,                // trunc|out|in
        O_TRUNC | O_RDWR | O_APPEND | O_CREAT,     // trunc|out|in|app
        O_TRUNC | O_RDWR | O_CREAT  | _BINARY,     // trunc|out|in|binary
        O_TRUNC | O_RDWR | _BINARY  | O_APPEND | O_CREAT  // trunc|out|in|binary|app
    };

    if (   0 > __index
        || int (sizeof __modetbl / sizeof *__modetbl) <= __index)
        return _RWSTD_INVALID_OPENMODE;

    return __modetbl[__index];
}

#endif   // _INLINE_WITH_STATICS


inline __rw_file_t&
__rw_file_t::_C_open (const char *__name, int __mode, long __prot)
{
    int __m = _C_get_mode_arg (  __mode
                               & ~(_RWSTD_IOS_NOCREATE | _RWSTD_IOS_NOREPLACE));
        
    if (__m == _RWSTD_INVALID_OPENMODE){
      _C_fdsc = _RWSTD_INVALID_FILE_DESC;
      return *this;
    }
    
    if (__mode & _RWSTD_IOS_OUT) {
        if (__mode & _RWSTD_IOS_NOCREATE)
            __m &= ~O_CREAT;
        if (__mode & _RWSTD_IOS_NOREPLACE)
            __m |= O_EXCL;
    }

    _C_fdsc = open (__name, __m, __prot); 

    return *this;
}


inline int __rw_file_t::_C_get_mode () const
{
    return _C_get_mode (_C_fdsc);
}


#else   // if defined (_RWSTD_NO_NATIVE_IO)

inline const char* __rw_file_t::_C_get_mode_arg (int __index) const
{
#if    !(defined (__osf__) && defined (__GNUG__) \
    && __GNUG__ == 2 && __GNUG_MINOR__ < 96)
    // static not used to prevent a g++ 2.95.2 warning on Tru64
    // sorry: semantics of inline function static data are wrong
    // (you'll wind up with multiple copies)
    static
#endif
    const char __modetbl [][4] = {
        "",             // no flags error            0
        "a",            // app                       1
        "",             // binary                    2
        "ab",           // binary|app                3
        "r",            // in                        4
        "a",            // in|app                    5
        "rb",           // in|binary                 6
        "ab",           // in|binary|app             7
        "w",            // out                       8
        "a",            // out|app                   9
        "wb",           // out|binary                10
        "ab",           // out|binary|app            11
        "r+",           // out|in                    12
        "a+",           // out|in|app                13
        "r+b",          // out|in|binary             14
        "a+b",          // out|in|binary|app         15
        "w",            // trunc                     16
        "w",            // trunc|app                 17
        "wb",           // trunc|binary              18
        "wb",           // trunc|binary|app          19
        "",             // trunc|in                  20
        "",             // trunc|in|app              21
        "",             // trunc|in|binary           22
        "",             // trunc|in|binary|app       23
        "w",            // trunc|out                 24
        "w",            // trunc|out|app             25
        "wb",           // trunc|out|binary          26
        "wb",           // trunc|out|binary|app      27  
        "w+",           // trunc|out|in              28
        "w+",           // trunc|out|in|app          29
        "w+b",          // trunc|out|in|binary       30
        "w+b"           // trunc|out|in|binary|app   31
    };

    if (  0 > __index
       || int (sizeof __modetbl / sizeof *__modetbl) <= __index)
        return 0;

    return __modetbl[__index];
}

#ifndef _RWSTD_NO_FILENO
inline __rw_file_t::__rw_file_t (int __fd)
{
    const char *__mode = _C_get_mode_arg (_C_get_mode (__fd));
    _C_fptr = __mode && __fd > -1 ? fdopen (__fd, __mode) : 0;
}
#else
inline __rw_file_t::__rw_file_t (int __fd)
{
    _C_fptr = (__fd == STDIN_FILENO) ? &std::__stdin :
            ((__fd == STDOUT_FILENO) ? &std::__stdout :
            ((__fd == STDERR_FILENO) ? &std::__stderr : 0));
    if (_C_fptr == 0)
        _RW::__rw_throw (_RWSTD_ERROR_RUNTIME_ERROR, "possix _C_get_mode not supported");
}
#endif //_RWSTD_NO_FILENO

inline __rw_file_t& __rw_file_t::_C_open (const char *__name, int __mode, long)
{
    const char *__m = _C_get_mode_arg (__mode);

    if (!__m) {
        _C_fptr = 0;
        return *this;
    }
    
    _C_fptr = fopen (__name, __m);

#ifndef __ARM_DONT_WANT_IONBF
    if (_C_is_open ( ))
        setvbuf (_C_fptr, 0, _IONBF, 0);
#endif

    return *this;
}


inline int __rw_file_t::_C_get_mode () const
{
    return _C_get_mode (_C_fptr);
}

#endif // _RWSTD_NO_NATIVE_IO


_RWSTD_NAMESPACE_END   // __rw

#endif // _RWSTD_FILE_H_INCLUDED

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -