OS_NS_stdlib.inl

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // OS_NS_stdlib.inl,v 1.25 2006/06/01 09:18:22 jwillemsen Exp
00004 
00005 #include "ace/config-all.h"           /* Need ACE_TRACE */
00006 #include "ace/Object_Manager_Base.h"
00007 #include "ace/OS_NS_string.h"
00008 #include "ace/Global_Macros.h"
00009 #include "ace/os_include/os_errno.h"
00010 #include "ace/os_include/os_search.h"
00011 
00012 #if defined(ACE_WCHAR_IN_STD_NAMESPACE)
00013 # define ACE_WCHAR_STD_NAMESPACE std
00014 #else
00015 # define ACE_WCHAR_STD_NAMESPACE ACE_STD_NAMESPACE
00016 #endif /* ACE_WCHAR_IN_STD_NAMESPACE */
00017 
00018 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00019 
00020 // Doesn't need a macro since it *never* returns!
00021 
00022 ACE_INLINE void
00023 ACE_OS::_exit (int status)
00024 {
00025   ACE_OS_TRACE ("ACE_OS::_exit");
00026 #if defined (ACE_VXWORKS)
00027   ::exit (status);
00028 #elif !defined (ACE_HAS_WINCE)
00029   ::_exit (status);
00030 #else
00031   ::TerminateProcess (::GetCurrentProcess (),
00032                       status);
00033 #endif /* ACE_VXWORKS */
00034 }
00035 
00036 ACE_INLINE void
00037 ACE_OS::abort (void)
00038 {
00039 #if !defined (ACE_HAS_WINCE)
00040   ::abort ();
00041 #else
00042   // @@ CE doesn't support abort?
00043   exit (1);
00044 #endif /* !ACE_HAS_WINCE */
00045 }
00046 
00047 ACE_INLINE int
00048 ACE_OS::atexit (ACE_EXIT_HOOK func)
00049 {
00050   return ACE_OS_Object_Manager::instance ()->at_exit (func);
00051 }
00052 
00053 ACE_INLINE int
00054 ACE_OS::atoi (const char *s)
00055 {
00056   ACE_OSCALL_RETURN (::atoi (s), int, -1);
00057 }
00058 
00059 #if defined (ACE_HAS_WCHAR)
00060 ACE_INLINE int
00061 ACE_OS::atoi (const wchar_t *s)
00062 {
00063 #if defined (ACE_WIN32)
00064   ACE_OSCALL_RETURN (::_wtoi (s), int, -1);
00065 #else /* ACE_WIN32 */
00066   return ACE_OS::atoi (ACE_Wide_To_Ascii(s).char_rep());
00067 #endif /* ACE_WIN32 */
00068 }
00069 #endif /* ACE_HAS_WCHAR */
00070 
00071 #if defined (atop)
00072 #  undef atop
00073 #endif /* atop */
00074 
00075 ACE_INLINE void *
00076 ACE_OS::atop (const char *s)
00077 {
00078   ACE_TRACE ("ACE_OS::atop");
00079   // It would be nice to make use of Basic_Types.h here, but that
00080   // file relies on OS.h. Fortunately, most platforms have int
00081   // the same as pointer size (IA32, IA64), with Win64 being the
00082   // exception.
00083 #if defined (ACE_WIN64)
00084   __int64 ip = ::_atoi64 (s);
00085 #else
00086   int ip = ::atoi (s);
00087 #endif /* ACE_WIN64 */
00088   void *p = reinterpret_cast<void *> (ip);
00089   return p;
00090 }
00091 
00092 #if defined (ACE_HAS_WCHAR)
00093 ACE_INLINE void *
00094 ACE_OS::atop (const wchar_t *s)
00095 {
00096 #  if defined (ACE_WIN64)
00097   __int64 ip = ::_wtoi64 (s);
00098 #  else
00099   int ip = ACE_OS::atoi (s);
00100 #  endif /* ACE_WIN64 */
00101   void *p = reinterpret_cast<void *> (ip);
00102   return p;
00103 }
00104 #endif /* ACE_HAS_WCHAR */
00105 
00106 ACE_INLINE void *
00107 ACE_OS::bsearch (const void *key,
00108                  const void *base,
00109                  size_t nel,
00110                  size_t size,
00111                  ACE_COMPARE_FUNC compar)
00112 {
00113 #if !defined (ACE_LACKS_BSEARCH)
00114   return ::bsearch (key, base, nel, size, compar);
00115 #else
00116   ACE_UNUSED_ARG (key);
00117   ACE_UNUSED_ARG (base);
00118   ACE_UNUSED_ARG (nel);
00119   ACE_UNUSED_ARG (size);
00120   ACE_UNUSED_ARG (compar);
00121   ACE_NOTSUP_RETURN (0);
00122 #endif /* ACE_LACKS_BSEARCH */
00123 }
00124 
00125 ACE_INLINE char *
00126 ACE_OS::getenv (const char *symbol)
00127 {
00128   ACE_OS_TRACE ("ACE_OS::getenv");
00129 #if defined (ACE_LACKS_ENV)
00130   ACE_UNUSED_ARG (symbol);
00131   ACE_NOTSUP_RETURN (0);
00132 #else /* ACE_LACKS_ENV */
00133   ACE_OSCALL_RETURN (::getenv (symbol), char *, 0);
00134 #endif /* ACE_LACKS_ENV */
00135 }
00136 
00137 #if defined (ACE_HAS_WCHAR) && defined (ACE_WIN32)
00138 ACE_INLINE wchar_t *
00139 ACE_OS::getenv (const wchar_t *symbol)
00140 {
00141 #if defined (ACE_LACKS_ENV)
00142   ACE_UNUSED_ARG (symbol);
00143   ACE_NOTSUP_RETURN (0);
00144 #else
00145   ACE_OSCALL_RETURN (::_wgetenv (symbol), wchar_t *, 0);
00146 #endif /* ACE_LACKS_ENV */
00147 }
00148 #endif /* ACE_HAS_WCHAR && ACE_WIN32 */
00149 
00150 ACE_INLINE char *
00151 ACE_OS::itoa (int value, char *string, int radix)
00152 {
00153 #if !defined (ACE_HAS_ITOA)
00154   return ACE_OS::itoa_emulation (value, string, radix);
00155 #elif defined (ACE_ITOA_EQUIVALENT)
00156   return ACE_ITOA_EQUIVALENT (value, string, radix);
00157 #else /* !ACE_HAS_ITOA */
00158   return ::itoa (value, string, radix);
00159 #endif /* !ACE_HAS_ITOA */
00160 }
00161 
00162 #if defined (ACE_HAS_WCHAR)
00163 ACE_INLINE wchar_t *
00164 ACE_OS::itoa (int value, wchar_t *string, int radix)
00165 {
00166 #if defined (ACE_LACKS_ITOW)
00167   return ACE_OS::itow_emulation (value, string, radix);
00168 #else /* ACE_LACKS_ITOW */
00169   return ::_itow (value, string, radix);
00170 #endif /* ACE_LACKS_ITOW */
00171 }
00172 #endif /* ACE_HAS_WCHAR */
00173 
00174 ACE_INLINE ACE_HANDLE
00175 ACE_OS::mkstemp (char *s)
00176 {
00177 #if !defined (ACE_LACKS_MKSTEMP)
00178   return ::mkstemp (s);
00179 #else
00180   return ACE_OS::mkstemp_emulation (ACE_TEXT_CHAR_TO_TCHAR (s));
00181 #endif  /* !ACE_LACKS_MKSTEMP */
00182 }
00183 
00184 #if defined (ACE_HAS_WCHAR)
00185 ACE_INLINE ACE_HANDLE
00186 ACE_OS::mkstemp (wchar_t *s)
00187 {
00188 #  if !defined (ACE_LACKS_MKSTEMP)
00189   return ::mkstemp (ACE_TEXT_WCHAR_TO_TCHAR (ACE_TEXT_ALWAYS_CHAR (s)));
00190 #  else
00191   return ACE_OS::mkstemp_emulation (ACE_TEXT_WCHAR_TO_TCHAR (s));
00192 #  endif  /* !ACE_LACKS_MKSTEMP */
00193 }
00194 #endif /* ACE_HAS_WCHAR */
00195 
00196 #if !defined (ACE_LACKS_MKTEMP)
00197 ACE_INLINE char *
00198 ACE_OS::mktemp (char *s)
00199 {
00200 # if defined (ACE_WIN32)
00201   return ::_mktemp (s);
00202 # else /* ACE_WIN32 */
00203   return ::mktemp (s);
00204 # endif /* ACE_WIN32 */
00205 }
00206 
00207 #  if defined (ACE_HAS_WCHAR)
00208 ACE_INLINE wchar_t *
00209 ACE_OS::mktemp (wchar_t *s)
00210 {
00211 #    if defined (ACE_WIN32)
00212   return ::_wmktemp (s);
00213 #    else
00214   // For narrow-char filesystems, we must convert the wide-char input to
00215   // a narrow-char string for mktemp(), then convert the name back to
00216   // wide-char for the caller.
00217   ACE_Wide_To_Ascii narrow_s (s);
00218   if (::mktemp (narrow_s.char_rep ()) == 0)
00219     return 0;
00220   ACE_Ascii_To_Wide wide_s (narrow_s.char_rep ());
00221   ACE_OS::strcpy (s, wide_s.wchar_rep ());
00222   return s;
00223 #    endif
00224 }
00225 #  endif /* ACE_HAS_WCHAR */
00226 
00227 #endif /* !ACE_LACKS_MKTEMP */
00228 
00229 #if defined(INTEGRITY)
00230 extern "C" {
00231   int putenv(char *string);
00232 }
00233 #endif
00234 
00235 ACE_INLINE int
00236 ACE_OS::putenv (const char *string)
00237 {
00238   ACE_OS_TRACE ("ACE_OS::putenv");
00239 #if defined (ACE_HAS_WINCE)
00240   // WinCE don't have the concept of environment variables.
00241   ACE_UNUSED_ARG (string);
00242   ACE_NOTSUP_RETURN (-1);
00243 #elif defined (ACE_LACKS_PUTENV) && defined (ACE_HAS_SETENV)
00244   int result = 0;
00245   char* sp = ACE_OS::strchr (const_cast <char *> (string), '=');
00246   if (sp)
00247     {
00248       char* stmp = ACE_OS::strdup (string);
00249       if (stmp)
00250         {
00251           stmp[sp - string] = '\0';
00252           ACE_OSCALL (::setenv(stmp, sp+sizeof(char), 1), int, -1, result);
00253           ACE_OS::free (stmp);
00254         }
00255       else
00256         {
00257           errno = ENOMEM;
00258           result = -1;
00259         }
00260     }
00261   else
00262     {
00263       ACE_OSCALL (::setenv(string, "", 1), int, -1, result);
00264     }
00265   return result;
00266 #elif defined (ACE_LACKS_ENV) || defined (ACE_LACKS_PUTENV)
00267   ACE_UNUSED_ARG (string);
00268   ACE_NOTSUP_RETURN (0);
00269 #else /* ! ACE_HAS_WINCE */
00270   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::putenv (const_cast <char *> (string)), int, -1);
00271 #endif /* ACE_HAS_WINCE */
00272 }
00273 
00274 #if defined (ACE_HAS_WCHAR) && defined (ACE_WIN32)
00275 ACE_INLINE int
00276 ACE_OS::putenv (const wchar_t *string)
00277 {
00278   ACE_OS_TRACE ("ACE_OS::putenv");
00279 #if defined (ACE_HAS_WINCE)
00280   // WinCE doesn't have the concept of environment variables.
00281   ACE_UNUSED_ARG (string);
00282   ACE_NOTSUP_RETURN (-1);
00283 #else
00284   ACE_OSCALL_RETURN (::_wputenv (string), int, -1);
00285 #endif /* ACE_HAS_WINCE */
00286 }
00287 #endif /* ACE_HAS_WCHAR && ACE_WIN32 */
00288 
00289 ACE_INLINE void
00290 ACE_OS::qsort (void *base,
00291                size_t nel,
00292                size_t width,
00293                ACE_COMPARE_FUNC compar)
00294 {
00295 #if !defined (ACE_LACKS_QSORT)
00296   ::qsort (base, nel, width, compar);
00297 #else
00298   ACE_UNUSED_ARG (base);
00299   ACE_UNUSED_ARG (nel);
00300   ACE_UNUSED_ARG (width);
00301   ACE_UNUSED_ARG (compar);
00302 #endif /* !ACE_LACKS_QSORT */
00303 }
00304 
00305 ACE_INLINE int
00306 ACE_OS::rand (void)
00307 {
00308   ACE_OS_TRACE ("ACE_OS::rand");
00309   ACE_OSCALL_RETURN (::rand (), int, -1);
00310 }
00311 
00312 #if !defined (ACE_WIN32)
00313 
00314 ACE_INLINE int
00315 ACE_OS::rand_r (ACE_RANDR_TYPE &seed)
00316 {
00317   ACE_OS_TRACE ("ACE_OS::rand_r");
00318 # if defined (ACE_HAS_REENTRANT_FUNCTIONS) && \
00319     !defined (ACE_LACKS_RAND_REENTRANT_FUNCTIONS)
00320 #   if defined (DIGITAL_UNIX)
00321   ACE_OSCALL_RETURN (::_Prand_r (&seed), int, -1);
00322 #   elif defined (ACE_HAS_BROKEN_RANDR)
00323   ACE_OSCALL_RETURN (::rand_r (seed), int, -1);
00324 #   else
00325   ACE_OSCALL_RETURN (::rand_r (&seed), int, -1);
00326 #   endif /* DIGITAL_UNIX */
00327 # else
00328   ACE_UNUSED_ARG (seed);
00329   ACE_OSCALL_RETURN (::rand (), int, -1);
00330 # endif /* ACE_HAS_REENTRANT_FUNCTIONS */
00331 }
00332 
00333 #else /* ACE_WIN32 */
00334 
00335 ACE_INLINE int
00336 ACE_OS::rand_r (ACE_RANDR_TYPE& seed)
00337 {
00338   ACE_OS_TRACE ("ACE_OS::rand_r");
00339 
00340   long new_seed = (long)(seed);
00341   if (new_seed == 0)
00342     new_seed = 0x12345987;
00343   long temp = new_seed / 127773;
00344   new_seed = 16807 * (new_seed - temp * 127773) - 2836 * temp;
00345   if (new_seed < 0)
00346     new_seed += 2147483647;
00347   (seed) = (unsigned int)new_seed;
00348   return (int)(new_seed & RAND_MAX);
00349 }
00350 
00351 #endif /* !ACE_WIN32 */
00352 
00353 #if !defined (ACE_HAS_WINCE)
00354 #  if !defined (ACE_LACKS_REALPATH)
00355 ACE_INLINE char *
00356 ACE_OS::realpath (const char *file_name,
00357                   char *resolved_name)
00358 {
00359 #    if defined (ACE_WIN32)
00360   return ::_fullpath (resolved_name, file_name, PATH_MAX);
00361 #    else /* ACE_WIN32 */
00362   return ::realpath (file_name, resolved_name);
00363 #    endif /* ! ACE_WIN32 */
00364 }
00365 #  endif /* !ACE_LACKS_REALPATH */
00366 
00367 #  if defined (ACE_HAS_WCHAR)
00368 ACE_INLINE wchar_t *
00369 ACE_OS::realpath (const wchar_t *file_name,
00370                   wchar_t *resolved_name)
00371 {
00372 #    if defined (ACE_WIN32)
00373   return ::_wfullpath (resolved_name, file_name, PATH_MAX);
00374 #    else /* ACE_WIN32 */
00375   ACE_Wide_To_Ascii n_file_name (file_name);
00376   char n_resolved[PATH_MAX];
00377   if (0 != ACE_OS::realpath (n_file_name.char_rep (), n_resolved))
00378     {
00379       ACE_Ascii_To_Wide w_resolved (n_resolved);
00380       ACE_OS::strcpy (resolved_name, w_resolved.wchar_rep ());
00381       return resolved_name;
00382     }
00383   return 0;
00384 #    endif /* ! ACE_WIN32 */
00385 }
00386 #  endif /* ACE_HAS_WCHAR */
00387 #endif /* ACE_HAS_WINCE */
00388 
00389 ACE_INLINE ACE_EXIT_HOOK
00390 ACE_OS::set_exit_hook (ACE_EXIT_HOOK exit_hook)
00391 {
00392   ACE_EXIT_HOOK old_hook = exit_hook_;
00393   exit_hook_ = exit_hook;
00394   return old_hook;
00395 }
00396 
00397 ACE_INLINE void
00398 ACE_OS::srand (u_int seed)
00399 {
00400   ACE_OS_TRACE ("ACE_OS::srand");
00401   ::srand (seed);
00402 }
00403 
00404 // Return a dynamically allocated duplicate of <str>, substituting the
00405 // environment variable if <str[0] == '$'>.  Note that the pointer is
00406 // allocated with <ACE_OS::malloc> and must be freed by
00407 // <ACE_OS::free>.
00408 
00409 ACE_INLINE ACE_TCHAR *
00410 ACE_OS::strenvdup (const ACE_TCHAR *str)
00411 {
00412 #if defined (ACE_HAS_WINCE)
00413   // WinCE doesn't have environment variables so we just skip it.
00414   return ACE_OS::strdup (str);
00415 #elif defined (ACE_LACKS_ENV)
00416   ACE_UNUSED_ARG (str);
00417   ACE_NOTSUP_RETURN (0);
00418 #else
00419   if (str[0] == ACE_LIB_TEXT ('$'))
00420     {
00421 #  if defined (ACE_WIN32)
00422       // Always use the ACE_TCHAR for Windows.
00423       ACE_TCHAR *temp = 0;
00424       if ((temp = ACE_OS::getenv (&str[1])) != 0)
00425         return ACE_OS::strdup (temp);
00426 #  else
00427       // Use char * for environment on non-Windows.
00428       char *temp = 0;
00429       if ((temp = ACE_OS::getenv (ACE_TEXT_ALWAYS_CHAR (&str[1]))) != 0)
00430         return ACE_OS::strdup (ACE_TEXT_CHAR_TO_TCHAR (temp));
00431 #  endif /* ACE_WIN32 */
00432       return ACE_OS::strdup (str);
00433     }
00434   else
00435     return ACE_OS::strdup (str);
00436 #endif /* ACE_HAS_WINCE */
00437 }
00438 
00439 #if !defined (ACE_LACKS_STRTOD)
00440 ACE_INLINE double
00441 ACE_OS::strtod (const char *s, char **endptr)
00442 {
00443   return ::strtod (s, endptr);
00444 }
00445 #endif /* !ACE_LACKS_STRTOD */
00446 
00447 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOD)
00448 ACE_INLINE double
00449 ACE_OS::strtod (const wchar_t *s, wchar_t **endptr)
00450 {
00451   return ACE_WCHAR_STD_NAMESPACE::wcstod (s, endptr);
00452 }
00453 #endif /* ACE_HAS_WCHAR && !ACE_LACKS_WCSTOD */
00454 
00455 ACE_INLINE long
00456 ACE_OS::strtol (const char *s, char **ptr, int base)
00457 {
00458 #if defined (ACE_LACKS_STRTOL)
00459   return ACE_OS::strtol_emulation (s, ptr, base);
00460 #else  /* ACE_LACKS_STRTOL */
00461   return ::strtol (s, ptr, base);
00462 #endif /* ACE_LACKS_STRTOL */
00463 }
00464 
00465 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOL)
00466 ACE_INLINE long
00467 ACE_OS::strtol (const wchar_t *s, wchar_t **ptr, int base)
00468 {
00469   return ACE_WCHAR_STD_NAMESPACE::wcstol (s, ptr, base);
00470 }
00471 #endif /* ACE_HAS_WCHAR && !ACE_LACKS_WCSTOL */
00472 
00473 ACE_INLINE unsigned long
00474 ACE_OS::strtoul (const char *s, char **ptr, int base)
00475 {
00476 #if defined (ACE_LACKS_STRTOUL)
00477   return ACE_OS::strtoul_emulation (s, ptr, base);
00478 #else /* ACE_LACKS_STRTOUL */
00479   return ::strtoul (s, ptr, base);
00480 #endif /* ACE_LACKS_STRTOUL */
00481 }
00482 
00483 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOUL)
00484 ACE_INLINE unsigned long
00485 ACE_OS::strtoul (const wchar_t *s, wchar_t **ptr, int base)
00486 {
00487   return ACE_WCHAR_STD_NAMESPACE::wcstoul (s, ptr, base);
00488 }
00489 #endif /* ACE_HAS_WCHAR && !ACE_LACKS_WCSTOUL */
00490 
00491 ACE_INLINE int
00492 ACE_OS::system (const ACE_TCHAR *s)
00493 {
00494   // ACE_OS_TRACE ("ACE_OS::system");
00495 #if defined (ACE_LACKS_SYSTEM)
00496   ACE_UNUSED_ARG (s);
00497   ACE_NOTSUP_RETURN (-1);
00498 #elif defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00499   ACE_OSCALL_RETURN (::_wsystem (s), int, -1);
00500 #elif defined(ACE_TANDEM_T1248_PTHREADS)
00501   ACE_OSCALL_RETURN (::spt_system (s), int, -1);
00502 #else
00503   ACE_OSCALL_RETURN (::system (ACE_TEXT_ALWAYS_CHAR (s)), int, -1);
00504 #endif /* ACE_LACKS_SYSTEM */
00505 }
00506 
00507 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 09:41:58 2006 for ACE by doxygen 1.3.6