00001 
00002 
00003 #include "ace/OS_NS_stdio.h"
00004 #include "ace/OS_NS_Thread.h"
00005 
00006 ACE_RCSID (ace,
00007            OS_NS_stdio,
00008            "OS_NS_stdio.cpp,v 1.29 2006/05/30 10:34:47 jwillemsen Exp")
00009 
00010 
00011 #if !defined (ACE_HAS_INLINED_OSCALLS)
00012 # include "ace/OS_NS_stdio.inl"
00013 #endif 
00014 
00015 # if defined (ACE_WIN32)
00016 
00017 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00018 OSVERSIONINFO ACE_OS::win32_versioninfo_;
00019 HINSTANCE ACE_OS::win32_resource_module_;
00020 ACE_END_VERSIONED_NAMESPACE_DECL
00021 
00022 #   if defined (ACE_HAS_DLL) && (ACE_HAS_DLL == 1) && !defined (ACE_HAS_WINCE)
00023 
00024 
00025 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID)
00026 {
00027   if (reason == DLL_PROCESS_ATTACH)
00028     {
00029 #     if defined (ACE_DISABLES_THREAD_LIBRARY_CALLS) && (ACE_DISABLES_THREAD_LIBRARY_CALLS == 1)
00030       ::DisableThreadLibraryCalls (instance);
00031 #     endif 
00032       ACE_OS::set_win32_resource_module(instance);
00033     }
00034   else if (reason == DLL_THREAD_DETACH)
00035     {
00036       ACE_OS::cleanup_tss (0);
00037     }
00038   return TRUE;
00039 }
00040 #   endif 
00041 # endif 
00042 
00043 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00044 
00045 void
00046 ACE_OS::ace_flock_t::dump (void) const
00047 {
00048 #if defined (ACE_HAS_DUMP)
00049   ACE_OS_TRACE ("ACE_OS::ace_flock_t::dump");
00050 
00051 # if 0
00052   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00053   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("handle_ = %u"), this->handle_));
00054 #   if defined (ACE_WIN32)
00055   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nInternal = %d"),
00056               this->overlapped_.Internal));
00057   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nInternalHigh = %d"),
00058               this->overlapped_.InternalHigh));
00059   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nOffsetHigh = %d"),
00060               this->overlapped_.OffsetHigh));
00061   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nhEvent = %d"),
00062               this->overlapped_.hEvent));
00063 #   else
00064   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nl_whence = %d"),
00065               this->lock_.l_whence));
00066   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nl_start = %d"), this->lock_.l_start));
00067   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nl_len = %d"), this->lock_.l_len));
00068   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nl_type = %d"), this->lock_.l_type));
00069 #   endif 
00070   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00071 # endif 
00072 #endif 
00073 }
00074 
00075 
00076 
00077 #if defined (ACE_USES_WCHAR)
00078 void ACE_OS::checkUnicodeFormat (FILE* fp)
00079 {
00080   if (fp != 0)
00081     {
00082       
00083       
00084       
00085       
00086       
00087       
00088       
00089 
00090       
00091       ACE_UINT16 first_two_bytes;
00092       size_t numRead =
00093         ACE_OS::fread(&first_two_bytes, sizeof (first_two_bytes), 1, fp);
00094 
00095       if (numRead == 1)
00096         {
00097           if ((first_two_bytes != 0xFFFE) && 
00098               (first_two_bytes != 0xFEFF))   
00099             {
00100               
00101 #if defined (ACE_WIN32)
00102               ACE_OS::fseek(fp, 0, FILE_BEGIN);
00103 #else
00104               ACE_OS::fseek(fp, 0, SEEK_SET);
00105 #endif 
00106             }
00107         }
00108       
00109       
00110     }
00111 }
00112 #endif  // ACE_USES_WCHAR
00113 
00114 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)
00115 FILE *
00116 ACE_OS::fopen (const char *filename,
00117                const ACE_TCHAR *mode)
00118 {
00119   ACE_OS_TRACE ("ACE_OS::fopen");
00120   int hmode = _O_TEXT;
00121 
00122   for (const ACE_TCHAR *mode_ptr = mode; *mode_ptr != 0; mode_ptr++)
00123     ACE_OS::fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00124 
00125   ACE_HANDLE handle = ACE_OS::open (filename, hmode);
00126   if (handle != ACE_INVALID_HANDLE)
00127     {
00128       hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00129 
00130 #   if defined (ACE_LACKS_INTPTR_T)
00131       int fd = ::_open_osfhandle (long (handle), hmode);
00132 #   else
00133       int fd = ::_open_osfhandle (intptr_t (handle), hmode);
00134 #   endif
00135 
00136       if (fd != -1)
00137         {
00138 #   if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00139           FILE *fp = ::_fdopen (fd, const_cast<ACE_TCHAR *> (mode));
00140 #   elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00141           FILE *fp = ::_wfdopen (fd, const_cast<ACE_TCHAR *> (mode));
00142 #   elif defined (ACE_USES_WCHAR)
00143           FILE *fp = ::_wfdopen (fd, mode);
00144 #   else
00145           FILE *fp = ::fdopen (fd, mode);
00146 #   endif 
00147           if (fp != 0)
00148           {
00149 #   if defined (ACE_USES_WCHAR)
00150             checkUnicodeFormat(fp);
00151 #   endif  // ACE_USES_WCHAR
00152             return fp;
00153           }
00154           ::_close (fd);
00155         }
00156 
00157       ACE_OS::close (handle);
00158     }
00159   return 0;
00160 }
00161 
00162 #if defined (ACE_HAS_WCHAR)
00163 FILE *
00164 ACE_OS::fopen (const wchar_t *filename,
00165                const ACE_TCHAR *mode)
00166 {
00167   ACE_OS_TRACE ("ACE_OS::fopen");
00168   int hmode = _O_TEXT;
00169 
00170   for (const ACE_TCHAR *mode_ptr = mode; *mode_ptr != 0; mode_ptr++)
00171     ACE_OS::fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00172 
00173   ACE_HANDLE handle = ACE_OS::open (filename, hmode);
00174   if (handle != ACE_INVALID_HANDLE)
00175     {
00176       hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00177 
00178 #   if defined (ACE_LACKS_INTPTR_T)
00179       int fd = ::_open_osfhandle (long (handle), hmode);
00180 #   else
00181       int fd = ::_open_osfhandle (intptr_t (handle), hmode);
00182 #   endif
00183 
00184       if (fd != -1)
00185         {
00186 #   if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00187           FILE *fp = ::_fdopen (fd, const_cast<char *> (mode));
00188 #   elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00189           FILE *fp = ::_wfdopen (fd, const_cast<wchar_t *> (mode));
00190 #   elif defined (ACE_USES_WCHAR)
00191           FILE *fp = ::_wfdopen (fd, mode);
00192 #   else
00193           FILE *fp = ::fdopen (fd, mode);
00194 #   endif 
00195           if (fp != 0)
00196           {
00197 #   if defined (ACE_USES_WCHAR)
00198             checkUnicodeFormat(fp);
00199 #   endif  // ACE_USES_WCHAR
00200             return fp;
00201           }
00202           ::_close (fd);
00203         }
00204 
00205       ACE_OS::close (handle);
00206     }
00207   return 0;
00208 }
00209 #endif 
00210 
00211 #endif 
00212 
00213 int
00214 ACE_OS::fprintf (FILE *fp, const char *format, ...)
00215 {
00216   ACE_OS_TRACE ("ACE_OS::fprintf");
00217   int result = 0;
00218   va_list ap;
00219   va_start (ap, format);
00220   ACE_OSCALL (::vfprintf (fp, format, ap), int, -1, result);
00221   va_end (ap);
00222   return result;
00223 }
00224 
00225 #if defined (ACE_HAS_WCHAR)
00226 int
00227 ACE_OS::fprintf (FILE *fp, const wchar_t *format, ...)
00228 {
00229   ACE_OS_TRACE ("ACE_OS::fprintf");
00230 
00231 # if !defined (ACE_HAS_VFWPRINTF)
00232   ACE_UNUSED_ARG (fp);
00233   ACE_UNUSED_ARG (format);
00234   ACE_NOTSUP_RETURN (-1);
00235 
00236 # else
00237   int result = 0;
00238   va_list ap;
00239   va_start (ap, format);
00240   ACE_OSCALL (ACE_STD_NAMESPACE::vfwprintf (fp, format, ap), int, -1, result);
00241   va_end (ap);
00242   return result;
00243 
00244 # endif 
00245 }
00246 #endif 
00247 
00248 
00249 
00250 
00251 
00252 int
00253 ACE_OS::printf (const char *format, ...)
00254 {
00255   ACE_OS_TRACE ("ACE_OS::printf");
00256   int result;
00257   va_list ap;
00258   va_start (ap, format);
00259   ACE_OSCALL (::vprintf (format, ap), int, -1, result);
00260   va_end (ap);
00261   return result;
00262 }
00263 
00264 int
00265 ACE_OS::snprintf (char *buf, size_t maxlen, const char *format, ...)
00266 {
00267   
00268 #if defined (ACE_HAS_SNPRINTF)
00269   int result;
00270   va_list ap;
00271   va_start (ap, format);
00272 #  if !defined (ACE_WIN32) || (defined (__BORLANDC__) && (__BORLANDC__ >= 0x600))
00273   ACE_OSCALL (ACE_SPRINTF_ADAPTER (::vsnprintf (buf, maxlen, format, ap)),
00274               int, -1, result);
00275 #  else
00276   ACE_OSCALL (ACE_SPRINTF_ADAPTER (::_vsnprintf (buf, maxlen, format, ap)),
00277               int, -1, result);
00278   
00279   
00280   if (result == static_cast <int> (maxlen))
00281     result = -1;
00282 
00283   
00284   if (result == -1)
00285     buf[maxlen-1] = '\0';
00286 #  endif 
00287   va_end (ap);
00288   
00289   
00290   
00291   
00292   
00293   if (result == -1)
00294     result = static_cast <int> (maxlen + 1);
00295   return result;
00296 
00297 #else
00298   ACE_UNUSED_ARG (buf);
00299   ACE_UNUSED_ARG (maxlen);
00300   ACE_UNUSED_ARG (format);
00301   ACE_NOTSUP_RETURN (-1);
00302 #endif 
00303 }
00304 
00305 #if defined (ACE_HAS_WCHAR)
00306 
00307 int
00308 ACE_OS::snprintf (wchar_t *buf, size_t maxlen, const wchar_t *format, ...)
00309 {
00310   
00311 #if (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500) || defined (ACE_WIN32)
00312   int result;
00313   va_list ap;
00314   va_start (ap, format);
00315 #  if defined (ACE_WIN32)
00316   
00317   
00318   
00319   ACE_OSCALL (ACE_SPRINTF_ADAPTER (::_vsnwprintf (buf, maxlen, format, ap)),
00320               int, -1, result);
00321   
00322   
00323   if (result == static_cast <int> (maxlen))
00324     result = -1;
00325 
00326   
00327   if (result == -1)
00328     buf[maxlen-1] = '\0';
00329 #  else
00330   ACE_OSCALL (ACE_SPRINTF_ADAPTER (::vswprintf (buf, maxlen, format, ap)),
00331               int, -1, result);
00332 #  endif 
00333   va_end (ap);
00334   
00335   
00336   
00337   
00338   
00339   if (result == -1)
00340     result = static_cast <int> (maxlen + 1);
00341   return result;
00342 
00343 #else
00344   ACE_UNUSED_ARG (buf);
00345   ACE_UNUSED_ARG (maxlen);
00346   ACE_UNUSED_ARG (format);
00347   ACE_NOTSUP_RETURN (-1);
00348 #endif 
00349 }
00350 #endif 
00351 
00352 int
00353 ACE_OS::sprintf (char *buf, const char *format, ...)
00354 {
00355   
00356 
00357   int result;
00358   va_list ap;
00359   va_start (ap, format);
00360   ACE_OSCALL (ACE_SPRINTF_ADAPTER (::vsprintf (buf, format, ap)), int, -1, result);
00361   va_end (ap);
00362   return result;
00363 }
00364 
00365 #if defined (ACE_HAS_WCHAR)
00366 int
00367 ACE_OS::sprintf (wchar_t *buf, const wchar_t *format, ...)
00368 {
00369   ACE_OS_TRACE ("ACE_OS::sprintf");
00370 
00371 # if (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500) || (defined ACE_HAS_DINKUM_STL) || defined (__DMC__)
00372 
00373   
00374   
00375   
00376   
00377   
00378   int result;
00379   va_list ap;
00380   va_start (ap, format);
00381   ACE_OSCALL (ACE_STD_NAMESPACE::vswprintf (buf, 4096, format, ap), int, -1, result);
00382   va_end (ap);
00383   return result;
00384 
00385 # elif defined (ACE_WIN32)
00386   
00387   
00388 
00389   int result;
00390   va_list ap;
00391   va_start (ap, format);
00392   ACE_OSCALL (::vswprintf (buf, format, ap), int, -1, result);
00393   va_end (ap);
00394   return result;
00395 
00396 # else
00397 
00398   ACE_UNUSED_ARG (buf);
00399   ACE_UNUSED_ARG (format);
00400   ACE_NOTSUP_RETURN (-1);
00401 
00402 # endif 
00403 }
00404 #endif 
00405 
00406 ACE_END_VERSIONED_NAMESPACE_DECL