OS_NS_stdio.cpp

Go to the documentation of this file.
00001 // $Id: OS_NS_stdio.cpp 80826 2008-03-04 14:51:23Z wotte $
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            "$Id: OS_NS_stdio.cpp 80826 2008-03-04 14:51:23Z wotte $")
00009 
00010 
00011 #if !defined (ACE_HAS_INLINED_OSCALLS)
00012 # include "ace/OS_NS_stdio.inl"
00013 #endif /* ACE_HAS_INLINED_OSCALLS */
00014 
00015 # if defined (ACE_WIN32)
00016 
00017 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00018 ACE_TEXT_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 // This function is called by the OS when the ACE DLL is loaded. We
00024 // use it to determine the default module containing ACE's resources.
00025 extern "C" 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 /* ACE_DISABLES_THREAD_LIBRARY_CALLS */
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 /* ACE_HAS_DLL && ACE_HAS_DLL == 1 */
00041 # endif /* ACE_WIN32 */
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_TEXT ("handle_ = %u"), this->handle_));
00054 #   if defined (ACE_WIN32)
00055   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nInternal = %d"),
00056               this->overlapped_.Internal));
00057   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nInternalHigh = %d"),
00058               this->overlapped_.InternalHigh));
00059   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nOffsetHigh = %d"),
00060               this->overlapped_.OffsetHigh));
00061   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nhEvent = %d"),
00062               this->overlapped_.hEvent));
00063 #   else
00064   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_whence = %d"),
00065               this->lock_.l_whence));
00066   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_start = %d"), this->lock_.l_start));
00067   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_len = %d"), this->lock_.l_len));
00068   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_type = %d"), this->lock_.l_type));
00069 #   endif /* ACE_WIN32 */
00070   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00071 # endif /* 0 */
00072 #endif /* ACE_HAS_DUMP */
00073 }
00074 
00075 /*****************************************************************************/
00076 
00077 #if defined (ACE_USES_WCHAR)
00078 void ACE_OS::checkUnicodeFormat (FILE* fp)
00079 {
00080   if (fp != 0)
00081     {
00082       // Due to the ACE_TCHAR definition, all default input files, such as
00083       // svc.conf, have to be in Unicode format (small endian) on WinCE
00084       // because ACE has all 'char' converted into ACE_TCHAR.
00085       // However, for TAO, ASCII files, such as IOR file, can still be read
00086       // and be written without any error since given buffers are all in 'char'
00087       // type instead of ACE_TCHAR.  Therefore, it is user's reponsibility to
00088       // select correct buffer type.
00089 
00090       // At this point, check if the file is Unicode or not.
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) && // not a small endian Unicode file
00098               (first_two_bytes != 0xFEFF))   // not a big endian Unicode file
00099             {
00100               // set file pointer back to the beginning
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 /* ACE_WIN32 */
00106             }
00107         }
00108       // if it is a Unicode file, file pointer will be right next to the first
00109       // two-bytes
00110     }
00111 }
00112 #endif  // ACE_USES_WCHAR
00113 
00114 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)
00115 namespace
00116 {
00117   /// Translate fopen's mode char to open's mode.  This helper function
00118   /// is here to avoid maintaining several pieces of identical code.
00119   void
00120   fopen_mode_to_open_mode_converter (ACE_TCHAR x, int & hmode)
00121   {
00122     switch (x)
00123       {
00124       case ACE_TEXT ('r'):
00125         if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00126           {
00127             ACE_CLR_BITS (hmode, _O_WRONLY);
00128             ACE_SET_BITS (hmode, _O_RDONLY);
00129           }
00130         break;
00131       case ACE_TEXT ('w'):
00132         if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00133           {
00134             ACE_CLR_BITS (hmode, _O_RDONLY);
00135             ACE_SET_BITS (hmode, _O_WRONLY);
00136           }
00137         ACE_SET_BITS (hmode, _O_CREAT | _O_TRUNC);
00138         break;
00139       case ACE_TEXT ('a'):
00140         if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00141           {
00142             ACE_CLR_BITS (hmode, _O_RDONLY);
00143             ACE_SET_BITS (hmode, _O_WRONLY);
00144           }
00145         ACE_SET_BITS (hmode, _O_CREAT | _O_APPEND);
00146         break;
00147       case ACE_TEXT ('+'):
00148         ACE_CLR_BITS (hmode, _O_RDONLY | _O_WRONLY);
00149         ACE_SET_BITS (hmode, _O_RDWR);
00150         break;
00151       case ACE_TEXT ('t'):
00152         ACE_CLR_BITS (hmode, _O_BINARY);
00153         ACE_SET_BITS (hmode, _O_TEXT);
00154         break;
00155       case ACE_TEXT ('b'):
00156         ACE_CLR_BITS (hmode, _O_TEXT);
00157         ACE_SET_BITS (hmode, _O_BINARY);
00158         break;
00159       }
00160   }
00161 }  // Close anonymous namespace
00162 
00163 FILE *
00164 ACE_OS::fopen (const char *filename,
00165                const ACE_TCHAR *mode)
00166 {
00167   ACE_OS_TRACE ("ACE_OS::fopen");
00168   int hmode = _O_TEXT;
00169 
00170   // Let the chips fall where they may if the user passes in a NULL
00171   // mode string.  Convert to an empty mode string to prevent a
00172   // crash.
00173   ACE_TCHAR const empty_mode[] = ACE_TEXT ("");
00174   if (!mode)
00175     mode = empty_mode;
00176 
00177   for (ACE_TCHAR const* mode_ptr = mode; *mode_ptr != 0; ++mode_ptr)
00178     fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00179 
00180   ACE_HANDLE const handle = ACE_OS::open (filename, hmode);
00181   if (handle != ACE_INVALID_HANDLE)
00182     {
00183       hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00184 
00185       int const fd = ::_open_osfhandle (intptr_t (handle), hmode);
00186 
00187       if (fd != -1)
00188         {
00189 #   if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00190           FILE * const fp = ::_fdopen (fd, const_cast<ACE_TCHAR *> (mode));
00191 #   elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00192           FILE * const fp = ::_wfdopen (fd, const_cast<ACE_TCHAR *> (mode));
00193 #   elif defined (ACE_USES_WCHAR)
00194           FILE * const fp = ::_wfdopen (fd, mode);
00195 #   else
00196           FILE * const fp = ::fdopen (fd, mode);
00197 #   endif /* defined(__BORLANDC__) && !defined (ACE_USES_WCHAR)) */
00198           if (fp != 0)
00199           {
00200 #   if defined (ACE_USES_WCHAR)
00201             checkUnicodeFormat(fp);
00202 #   endif  // ACE_USES_WCHAR
00203             return fp;
00204           }
00205           ::_close (fd);
00206         }
00207 
00208       ACE_OS::close (handle);
00209     }
00210   return 0;
00211 }
00212 
00213 #if defined (ACE_HAS_WCHAR)
00214 FILE *
00215 ACE_OS::fopen (const wchar_t *filename,
00216                const ACE_TCHAR *mode)
00217 {
00218   ACE_OS_TRACE ("ACE_OS::fopen");
00219   int hmode = _O_TEXT;
00220 
00221   for (const ACE_TCHAR *mode_ptr = mode; *mode_ptr != 0; mode_ptr++)
00222     fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00223 
00224   ACE_HANDLE handle = ACE_OS::open (filename, hmode);
00225   if (handle != ACE_INVALID_HANDLE)
00226     {
00227       hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00228 
00229       int const fd = ::_open_osfhandle (intptr_t (handle), hmode);
00230 
00231       if (fd != -1)
00232         {
00233 #   if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00234           FILE *fp = ::_fdopen (fd, const_cast<char *> (mode));
00235 #   elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00236           FILE *fp = ::_wfdopen (fd, const_cast<wchar_t *> (mode));
00237 #   elif defined (ACE_USES_WCHAR)
00238           FILE *fp = ::_wfdopen (fd, mode);
00239 #   else
00240           FILE *fp = ::fdopen (fd, mode);
00241 #   endif /* defined(__BORLANDC__) && !defined (ACE_USES_WCHAR)) */
00242           if (fp != 0)
00243           {
00244 #   if defined (ACE_USES_WCHAR)
00245             checkUnicodeFormat(fp);
00246 #   endif  // ACE_USES_WCHAR
00247             return fp;
00248           }
00249           ::_close (fd);
00250         }
00251 
00252       ACE_OS::close (handle);
00253     }
00254   return 0;
00255 }
00256 #endif /* ACE_HAS_WCHAR */
00257 
00258 #endif /* ACE_WIN32 */
00259 
00260 // The following *printf functions aren't inline because
00261 // they use varargs.
00262 
00263 int
00264 ACE_OS::fprintf (FILE *fp, const char *format, ...)
00265 {
00266   // ACE_OS_TRACE ("ACE_OS::fprintf");
00267   int result = 0;
00268   va_list ap;
00269   va_start (ap, format);
00270   result = ACE_OS::vfprintf (fp, format, ap);
00271   va_end (ap);
00272   return result;
00273 }
00274 
00275 #if defined (ACE_HAS_WCHAR)
00276 int
00277 ACE_OS::fprintf (FILE *fp, const wchar_t *format, ...)
00278 {
00279   // ACE_OS_TRACE ("ACE_OS::fprintf");
00280   int result = 0;
00281   va_list ap;
00282   va_start (ap, format);
00283   result = ACE_OS::vfprintf (fp, format, ap);
00284   va_end (ap);
00285   return result;
00286 }
00287 #endif /* ACE_HAS_WCHAR */
00288 
00289 int
00290 ACE_OS::asprintf (char **bufp, const char *format, ...)
00291 {
00292   // ACE_OS_TRACE ("ACE_OS::asprintf");
00293   int result;
00294   va_list ap;
00295   va_start (ap, format);
00296   result = ACE_OS::vasprintf (bufp, format, ap);
00297   va_end (ap);
00298   return result;
00299 }
00300 
00301 #if defined (ACE_HAS_WCHAR)
00302 int
00303 ACE_OS::asprintf (wchar_t **bufp, const wchar_t *format, ...)
00304 {
00305   // ACE_OS_TRACE ("ACE_OS::asprintf");
00306   int result;
00307   va_list ap;
00308   va_start (ap, format);
00309   result = ACE_OS::vasprintf (bufp, format, ap);
00310   va_end (ap);
00311   return result;
00312 }
00313 #endif /* ACE_HAS_WCHAR */
00314 
00315 int
00316 ACE_OS::printf (const char *format, ...)
00317 {
00318   // ACE_OS_TRACE ("ACE_OS::printf");
00319   int result;
00320   va_list ap;
00321   va_start (ap, format);
00322   result = ACE_OS::vprintf (format, ap);
00323   va_end (ap);
00324   return result;
00325 }
00326 
00327 #if defined (ACE_HAS_WCHAR)
00328 int
00329 ACE_OS::printf (const wchar_t *format, ...)
00330 {
00331   // ACE_OS_TRACE ("ACE_OS::printf");
00332   int result;
00333   va_list ap;
00334   va_start (ap, format);
00335   result = ACE_OS::vprintf (format, ap);
00336   va_end (ap);
00337   return result;
00338 }
00339 #endif /* ACE_HAS_WCHAR */
00340 
00341 int
00342 ACE_OS::snprintf (char *buf, size_t maxlen, const char *format, ...)
00343 {
00344   // ACE_OS_TRACE ("ACE_OS::snprintf");
00345   int result;
00346   va_list ap;
00347   va_start (ap, format);
00348   result = ACE_OS::vsnprintf (buf, maxlen, format, ap);
00349   va_end (ap);
00350   return result;
00351 }
00352 
00353 #if defined (ACE_HAS_WCHAR)
00354 int
00355 ACE_OS::snprintf (wchar_t *buf, size_t maxlen, const wchar_t *format, ...)
00356 {
00357   // ACE_OS_TRACE ("ACE_OS::snprintf");
00358   int result;
00359   va_list ap;
00360   va_start (ap, format);
00361   result = ACE_OS::vsnprintf (buf, maxlen, format, ap);
00362   va_end (ap);
00363   return result;
00364 }
00365 #endif /* ACE_HAS_WCHAR */
00366 
00367 int
00368 ACE_OS::sprintf (char *buf, const char *format, ...)
00369 {
00370   // ACE_OS_TRACE ("ACE_OS::sprintf");
00371   int result;
00372   va_list ap;
00373   va_start (ap, format);
00374   result = ACE_OS::vsprintf (buf, format, ap);
00375   va_end (ap);
00376   return result;
00377 }
00378 
00379 #if defined (ACE_HAS_WCHAR)
00380 int
00381 ACE_OS::sprintf (wchar_t *buf, const wchar_t *format, ...)
00382 {
00383   // ACE_OS_TRACE ("ACE_OS::sprintf");
00384   int result;
00385   va_list ap;
00386   va_start (ap, format);
00387   result = ACE_OS::vsprintf (buf, format, ap);
00388   va_end (ap);
00389   return result;
00390 }
00391 #endif /* ACE_HAS_WCHAR */
00392 
00393 #if !defined (ACE_HAS_VASPRINTF)
00394 int
00395 ACE_OS::vasprintf_emulation(char **bufp, const char *format, va_list argptr)
00396 {
00397   int size;
00398 
00399   va_list ap;
00400   va_copy (ap, argptr);
00401   size = ACE_OS::vsnprintf(0, 0, format, ap);
00402   va_end (ap);
00403 
00404   if (size != -1) 
00405     {
00406       char *buf = reinterpret_cast<char*>(ACE_OS::malloc(size + 1));
00407       if (!buf)
00408         return -1;
00409 
00410       va_list aq;
00411       va_copy (aq, argptr);
00412       size = ACE_OS::vsnprintf(buf, size + 1, format, aq);
00413       va_end (aq);
00414 
00415       if (size != -1)
00416         *bufp = buf;
00417     }
00418 
00419   return size;
00420 }
00421 #endif /* !ACE_HAS_VASPRINTF */
00422 
00423 #if defined (ACE_HAS_WCHAR)
00424 #if !defined (ACE_HAS_VASWPRINTF)
00425 int
00426 ACE_OS::vaswprintf_emulation(wchar_t **bufp, const wchar_t *format, va_list argptr)
00427 {
00428   int size;
00429 
00430   va_list ap;
00431   va_copy (ap, argptr);
00432   size = ACE_OS::vsnprintf(0, 0, format, ap);
00433   va_end (ap);
00434 
00435   if (size != -1) 
00436     {
00437       wchar_t *buf = reinterpret_cast<wchar_t*>
00438         (ACE_OS::malloc((size + 1) * sizeof(wchar_t)));
00439       if (!buf)
00440         return -1;
00441 
00442       va_list aq;
00443       va_copy (aq, argptr);
00444       size = ACE_OS::vsnprintf(buf, size + 1, format, aq);
00445       va_end (aq);
00446 
00447       if (size != -1)
00448         *bufp = buf;
00449     }
00450 
00451   return size;
00452 }
00453 #endif /* !ACE_HAS_VASWPRINTF */
00454 #endif /* ACE_HAS_WCHAR */
00455 
00456 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:41 2010 for ACE by  doxygen 1.4.7