1 /* 2 * Copyright (c) 1999 3 * Silicon Graphics Computer Systems, Inc. 4 * 5 * Copyright (c) 1999 6 * Boris Fomitchev 7 * 8 * This material is provided "as is", with absolutely no warranty expressed 9 * or implied. Any use is at your own risk. 10 * 11 * Permission to use or copy this software for any purpose is hereby granted 12 * without fee, provided the above notices are retained on all copies. 13 * Permission to modify the code and to distribute modified code is granted, 14 * provided the above notices are retained, and a notice that the code was 15 * modified is included with the above copyright notice. 16 * 17 */ 18 19 #ifndef _STLP_STDIO_FILE_H 20 #define _STLP_STDIO_FILE_H 21 22 /* This file provides a low-level interface between the internal 23 * representation of struct FILE, from the C stdio library, and 24 * the C++ I/O library. */ 25 26 #ifndef _STLP_CSTDIO 27 # include <cstdio> 28 #endif 29 #ifndef _STLP_CSTDDEF 30 # include <cstddef> 31 #endif 32 33 #if defined (__MSL__) 34 # include <unix.h> /* get the definition of fileno */ 35 #endif 36 37 _STLP_BEGIN_NAMESPACE 38 39 #if defined (_STLP_WCE) 40 41 inline int _FILE_fd(const FILE *__f) { 42 /* Check if FILE is one of the three standard streams 43 We do this check first, because invoking _fileno() on one of them 44 causes a terminal window to be created. This also happens if you do 45 any IO on them, but merely retrieving the filedescriptor shouldn't 46 already do that. 47 48 Obviously this is pretty implementation-specific because it requires 49 that indeed the first three FDs are always the same, but that is not 50 only common but almost guaranteed. */ 51 for (int __fd = 0; __fd != 3; ++__fd) { 52 if (__f == _getstdfilex(__fd)) 53 return __fd; 54 } 55 56 /* Normal files. */ 57 return (int)::_fileno((FILE*)__f); 58 } 59 60 # elif defined (_STLP_SCO_OPENSERVER) || defined (__NCR_SVR) 61 62 inline int _FILE_fd(const FILE *__f) { return __f->__file; } 63 64 # elif defined (__sun) && defined (_LP64) 65 66 inline int _FILE_fd(const FILE *__f) { return (int) __f->__pad[2]; } 67 68 #elif defined (__hpux) /* && defined(__hppa) && defined(__HP_aCC)) */ || \ 69 defined (__MVS__) || \ 70 defined (_STLP_USE_UCLIBC) /* should be before _STLP_USE_GLIBC */ 71 72 inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE*, __f)); } 73 74 #elif defined (_STLP_USE_GLIBC) 75 76 inline int _FILE_fd(const FILE *__f) { return __f->_fileno; } 77 78 #elif defined (__BORLANDC__) 79 80 inline int _FILE_fd(const FILE *__f) { return __f->fd; } 81 82 #elif defined (__MWERKS__) 83 84 /* using MWERKS-specific defines here to detect other OS targets 85 * dwa: I'm not sure they provide fileno for all OS's, but this should 86 * work for Win32 and WinCE 87 88 * Hmm, at least for Novell NetWare __dest_os == __mac_os true too.. 89 * May be both __dest_os and __mac_os defined and empty? - ptr */ 90 # if __dest_os == __mac_os 91 inline int _FILE_fd(const FILE *__f) { return ::fileno(__CONST_CAST(FILE*, __f)); } 92 # else 93 inline int _FILE_fd(const FILE *__f) { return ::_fileno(__CONST_CAST(FILE*, __f)); } 94 # endif 95 96 #elif defined (__QNXNTO__) || defined (__WATCOMC__) || defined (__EMX__) 97 98 inline int _FILE_fd(const FILE *__f) { return __f->_handle; } 99 100 #elif defined (__Lynx__) 101 102 /* the prototypes are taken from LynxOS patch for STLport 4.0 */ 103 inline int _FILE_fd(const FILE *__f) { return __f->_fd; } 104 105 #else /* The most common access to file descriptor. */ 106 107 inline int _FILE_fd(const FILE *__f) { return __f->_file; } 108 109 #endif 110 111 _STLP_END_NAMESPACE 112 113 #endif /* _STLP_STDIO_FILE_H */ 114 115 /* Local Variables: 116 * mode:C++ 117 * End: */ 118