[llvm-commits] CVS: llvm/lib/System/linux/ErrorCode.cpp LinuxCommon.h Path.cpp
Reid Spencer
reid at x10sys.com
Sun Aug 15 01:14:43 PDT 2004
Changes in directory llvm/lib/System/linux:
ErrorCode.cpp added (r1.1)
LinuxCommon.h added (r1.1)
Path.cpp added (r1.1)
---
Log message:
Initial implementations of the ErrorCode and Path concepts for Linux.
---
Diffs of the changes: (+664 -0)
Index: llvm/lib/System/linux/ErrorCode.cpp
diff -c /dev/null llvm/lib/System/linux/ErrorCode.cpp:1.1
*** /dev/null Sun Aug 15 03:14:43 2004
--- llvm/lib/System/linux/ErrorCode.cpp Sun Aug 15 03:14:33 2004
***************
*** 0 ****
--- 1,57 ----
+ //===- ErrorCode.cpp - Define the ErrorCode class ---------------*- C++ -*-===//
+ //
+ // Copyright (C) 2004 eXtensible Systems, Inc. All Rights Reserved.
+ //
+ // This program is open source software; you can redistribute it and/or modify
+ // it under the terms of the University of Illinois Open Source License. See
+ // LICENSE.TXT (distributed with this software) for details.
+ //
+ // This program is distributed in the hope that it will be useful, but
+ // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ // or FITNESS FOR A PARTICULAR PURPOSE.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file defines the linux specific members of the llvm::sys::ErrorCode
+ // class.
+ //
+ //===----------------------------------------------------------------------===//
+ /// @file lib/System/ErrorCode.h
+ /// @author Reid Spencer <raspencer at x10sys.com> (original author)
+ /// @version \verbatim $Id: ErrorCode.cpp,v 1.1 2004/08/15 08:14:33 reid Exp $ \endverbatim
+ /// @date 2004/08/14
+ /// @since 1.4
+ /// @brief Declares the linux specific methods of llvm::sys::ErrorCode class.
+ //===----------------------------------------------------------------------===//
+
+ namespace llvm {
+ namespace sys {
+
+ std::string
+ ErrorCode::description() const throw()
+ {
+ switch (domain()) {
+ case OSDomain:
+ char buffer[1024];
+ if (0 != strerror_r(index(),buffer,1024) )
+ return "<Error Message Unavalabile>";
+ return buffer;
+
+ case SystemDomain:
+ switch (index()) {
+ case ERR_SYS_INVALID_ARG:
+ return "Invalid argument to lib/System call";
+ default:
+ return "Unknown lib/System Error";
+ }
+ break;
+
+ default:
+ return "Unknown Error";
+ }
+ }
+
+ }
+ }
+
+ // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
Index: llvm/lib/System/linux/LinuxCommon.h
diff -c /dev/null llvm/lib/System/linux/LinuxCommon.h:1.1
*** /dev/null Sun Aug 15 03:14:43 2004
--- llvm/lib/System/linux/LinuxCommon.h Sun Aug 15 03:14:33 2004
***************
*** 0 ****
--- 1,157 ----
+ //===- LinuxCommon.h - Common Declarations For Linux ------------*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // Copyright (C) 2004 eXtensible Systems, Inc. All Rights Reserved.
+ //
+ // This program is open source software; you can redistribute it and/or modify
+ // it under the terms of the University of Illinois Open Source License. See
+ // LICENSE.TXT (distributed with this software) for details.
+ //
+ // This program is distributed in the hope that it will be useful, but
+ // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ // or FITNESS FOR A PARTICULAR PURPOSE.
+ //
+ //===----------------------------------------------------------------------===//
+ /// @file lib/System/linux/Common.h
+ /// @author Reid Spencer <rspencer at x10sys.com> (original author)
+ /// @version \verbatim $Id: LinuxCommon.h,v 1.1 2004/08/15 08:14:33 reid Exp $ \endverbatim
+ /// @date 2004/08/14
+ /// @since 1.4
+ /// @brief Provides common linux specific declarations and includes.
+ //===----------------------------------------------------------------------===//
+
+ #include <unistd.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <errno.h>
+ #include <sys/types.h>
+ #include <sys/param.h>
+ #include <pthread.h>
+
+ #define FATAL(arg) \
+ { llvm::sys::panic(LLVM_CONTEXT, arg); }
+
+ #define RETURN_ERRNO \
+ return ErrorCode(LLVM_ERROR_CODE(OSDomain,errno))
+
+ #define RETURN_OSERROR(code) \
+ return ErrorCode(LLVM_ERROR_CODE(OSDomain,code))
+
+ #ifdef assert
+ #define ASSERT_ARG(expr) \
+ if ( ! (expr) ) {\
+ return ErrorCode(ERR_SYS_INVALID_ARG);\
+ }
+ #else
+ #define ASSERT_ARG(expr)
+ #endif
+
+ #define CHECK(var,call,args,msg) \
+ { \
+ if ( -1 == ( var = ::call args )) { \
+ panic(LLVM_CONTEXT, msg); \
+ } \
+ }
+
+ #define RETURN_ON_ERROR(call,args) \
+ { \
+ errno = 0; \
+ if ( 0 > ( call args ) ) { \
+ RETURN_ERRNO; \
+ } \
+ }
+
+ #define RETURN_ON_ERRORCODE(call,args) \
+ { \
+ ErrorCode code = call args ; \
+ if ( ! code ) \
+ return code; \
+ }
+
+ #define PTHREAD_CALL( call, args, cleanup ) \
+ { \
+ int errcode = ::call args ; \
+ if ( errcode != 0 ) { \
+ cleanup ; \
+ RETURN_ERRNO ; \
+ } \
+ }
+
+ #define CLEANUP_CALL( call, args, cleanup ) \
+ { \
+ int result = call args ; \
+ if ( result != 0 ) { \
+ cleanup ; \
+ RETURN_ERRNO ; \
+ } \
+ }
+
+ // Define our realtime signals
+ #define SIG_LOOP_TERMINATE ( SIGRTMIN + 3 )
+ #define SIG_USER_EVENT_1 ( SIGRTMIN + 4 )
+ #define SIG_USER_EVENT_2 ( SIGRTMIN + 5 )
+ #define SIG_USER_EVENT_3 ( SIGRTMIN + 6 )
+ #define SIG_USER_EVENT_4 ( SIGRTMIN + 7 )
+ #define SIG_USER_EVENT_5 ( SIGRTMIN + 8 )
+ #define SIG_USER_EVENT_6 ( SIGRTMIN + 9 )
+ #define SIG_USER_EVENT_7 ( SIGRTMIN + 10 )
+ #define SIG_USER_EVENT_8 ( SIGRTMIN + 11 )
+ #define SIG_AIO_1 ( SIGRTMIN + 12 )
+ #define SIG_AIO_2 ( SIGRTMIN + 13 )
+ #define SIG_AIO_3 ( SIGRTMIN + 14 )
+ #define SIG_AIO_4 ( SIGRTMIN + 15 )
+ #define SIG_AIO_5 ( SIGRTMIN + 16 )
+ #define SIG_AIO_6 ( SIGRTMIN + 17 )
+ #define SIG_AIO_7 ( SIGRTMIN + 18 )
+ #define SIG_AIO_8 ( SIGRTMIN + 19 )
+
+ namespace llvm {
+ namespace sys {
+
+ #if 0
+ inline void
+ time_t2TimeValue( time_t t, TimeValue &tv )
+ {
+ TimeValue::Seconds_Type seconds = t;
+ seconds -= TimeValue::posix_zero_time.seconds();
+ tv.set( seconds, 0 );
+ }
+
+ inline void
+ TimeValue2timespec( const TimeValue& tv, struct timespec & ts )
+ {
+ uint64_t seconds;
+ uint64_t nanos;
+ tv.timespec_time( seconds, nanos );
+ ts.tv_sec = static_cast<time_t>(seconds);
+ ts.tv_nsec = static_cast<long int>(nanos);
+ }
+
+ inline void
+ timeval2TimeValue( struct timeval& tval, TimeValue& tv )
+ {
+ TimeValue::Seconds_Type seconds = tval.tv_sec;
+ seconds -= TimeValue::posix_zero_time.seconds();
+ tv.set( seconds, tval.tv_usec * XPS_NANOSECONDS_PER_MICROSECOND );
+ }
+
+ extern pid_t pid_; ///< This processes' process identification number
+ extern int pagesize_; ///< The virtual memory page size of this machine
+ extern long arg_max_; ///< The maximum size in bytes of arguments to exec()
+ extern long child_max_; ///< The maximum processes per user.
+ extern long clk_tck_; ///< The number of clock ticks per second on this machine
+ extern long stream_max_; ///< The maximum number of streams that can be opened
+ extern long tzname_max_; ///< The maximum length of a timezone name
+ extern long file_max_; ///< The maximum number of files that can be opened
+ extern long line_max_; ///< The maximum length of an I/O line
+ extern long job_control_; ///< Non-zero if POSIX job control enabled
+ extern long saved_ids_; ///< ?
+ extern long phys_pages_; ///< Total number of physical pages
+ extern long avphys_pages_; ///< Average number of free physical pages
+
+ #endif
+
+ }
+ }
+ // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
Index: llvm/lib/System/linux/Path.cpp
diff -c /dev/null llvm/lib/System/linux/Path.cpp:1.1
*** /dev/null Sun Aug 15 03:14:43 2004
--- llvm/lib/System/linux/Path.cpp Sun Aug 15 03:14:33 2004
***************
*** 0 ****
--- 1,450 ----
+ //===- Path.cpp - Path Operating System Concept -----------------*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // Copyright (C) 2004 eXtensible Systems, Inc. All Rights Reserved.
+ //
+ // This program is open source software; you can redistribute it and/or modify
+ // it under the terms of the University of Illinois Open Source License. See
+ // LICENSE.TXT (distributed with this software) for details.
+ //
+ // This program is distributed in the hope that it will be useful, but
+ // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ // or FITNESS FOR A PARTICULAR PURPOSE.
+ //
+ //===----------------------------------------------------------------------===//
+ //===----------------------------------------------------------------------===//
+ /// @file lib/System/linux/Path.cpp
+ /// @author Reid Spencer <raspencer at users.sourceforge.net> (original author)
+ /// @version \verbatim $Id: Path.cpp,v 1.1 2004/08/15 08:14:33 reid Exp $ \endverbatim
+ /// @date 2003/04/17
+ /// @since 1.4
+ /// @brief Implements the linux specific portion of class llvm::sys::Path
+ ////////////////////////////////////////////////////////////////////////////////
+
+ #include "LinuxCommon.h"
+ #include <sys/stat.h>
+ #include <fcntl.h>
+
+ namespace llvm {
+ namespace sys {
+
+ Path::Path(ConstructSpecial which) throw() {
+ switch (which) {
+ case CONSTRUCT_TEMP_FILE:
+ this->make_temp_file();
+ break;
+ case CONSTRUCT_TEMP_DIR:
+ this->make_temp_directory();
+ break;
+ }
+ }
+
+ bool
+ Path::is_file() const throw() {
+ if ( !empty() && ((*this)[length()-1] != '/' ))
+ return true;
+ return false;
+ }
+
+ bool
+ Path::is_directory() const throw() {
+ if ((!empty()) && ((*this)[length()-1] == '/' ))
+ return true;
+ return false;
+ }
+
+ ErrorCode
+ Path::make_directory() throw() {
+ char end[2];
+ end[0] = '/';
+ end[1] = 0;
+ if ( empty() )
+ this->assign( end );
+ else if ( (*this)[length()-1] != '/' )
+ this->append( end );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::make_temp_directory() throw() {
+ char temp_name[64];
+ ::strcpy(temp_name,"/tmp/llvm_XXXXXX");
+ char* res = ::mkdtemp(temp_name);
+ if ( res == 0 )
+ RETURN_ERRNO;
+ *this = temp_name;
+ make_directory();
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::make_file() throw() {
+ if ( (*this)[length()-1] == '/' )
+ this->erase( this->length()-1, 1 );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::make_temp_file() throw() {
+ char temp_name[64];
+ ::strcpy(temp_name,"/tmp/llvm_XXXXXX");
+ int fd = ::mkstemp(temp_name);
+ if ( fd == -1 )
+ RETURN_ERRNO;
+ ::close(fd);
+ *this = temp_name;
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::exists() throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ RETURN_ON_ERROR( access,( pathname, F_OK | R_OK ) );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::create_directory() throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ RETURN_ON_ERROR( mkdir, ( pathname, S_IRWXU | S_IRWXG ) );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::create_directories() throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ char * next = index(pathname,'/');
+ if ( pathname[0] == '/' )
+ next = index(&pathname[1],'/');
+ while ( next != 0 )
+ {
+ *next = 0;
+ if ( 0 != access( pathname, F_OK | R_OK ) )
+ RETURN_ON_ERROR( mkdir, (pathname, S_IRWXU | S_IRWXG ) );
+ char* save = next;
+ next = index(pathname,'/');
+ *save = '/';
+ }
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::remove_directory( ) throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ RETURN_ON_ERROR( rmdir, (pathname) );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::create_file( ) throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ RETURN_ON_ERROR( creat, ( pathname, S_IRUSR | S_IWUSR ) );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::remove_file( ) throw() {
+ char pathname[MAXPATHLEN];
+ this->fill(pathname,MAXPATHLEN);
+ int lastchar = this->length() - 1 ;
+ if (pathname[lastchar] == '/')
+ pathname[lastchar] = 0;
+ RETURN_ON_ERROR( unlink, (pathname) );
+ return NOT_AN_ERROR;
+ }
+
+ ErrorCode
+ Path::find_lib( const char * file ) throw()
+ {
+ ASSERT_ARG( file != 0 );
+
+ #if 0
+ ACE_TCHAR tempcopy[MAXPATHLEN + 1];
+ ACE_TCHAR searchpathname[MAXPATHLEN + 1];
+ ACE_TCHAR searchfilename[MAXPATHLEN + 1];
+
+ // Create a copy of filename to work with.
+ if (ACE_OS::strlen (filename) + 1
+ > (sizeof tempcopy / sizeof (ACE_TCHAR)))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ else
+ ACE_OS::strcpy (tempcopy, filename);
+
+ // Insert canonical directory separators.
+ ACE_TCHAR *separator_ptr;
+
+ #if (ACE_DIRECTORY_SEPARATOR_CHAR != '/')
+ // Make all the directory separators "canonical" to simplify
+ // subsequent code.
+ ACE_Lib_Find::strrepl (tempcopy, ACE_DIRECTORY_SEPARATOR_CHAR, '/');
+ #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */
+
+ // Separate filename from pathname.
+ separator_ptr = ACE_OS::strrchr (tempcopy, '/');
+
+ // This is a relative path.
+ if (separator_ptr == 0)
+ {
+ searchpathname[0] = '\0';
+ ACE_OS::strcpy (searchfilename, tempcopy);
+ }
+ else // This is an absolute path.
+ {
+ ACE_OS::strcpy (searchfilename, separator_ptr + 1);
+ separator_ptr[1] = '\0';
+ ACE_OS::strcpy (searchpathname, tempcopy);
+ }
+
+ int got_suffix = 0;
+
+ // Check to see if this has an appropriate DLL suffix for the OS
+ // platform.
+ ACE_TCHAR *s = ACE_OS::strrchr (searchfilename, '.');
+
+ const ACE_TCHAR *dll_suffix = ACE_DLL_SUFFIX;
+
+ if (s != 0)
+ {
+ // If we have a dot, we have a suffix
+ got_suffix = 1;
+
+ // Check whether this matches the appropriate platform-specific
+ // suffix.
+ if (ACE_OS::strcmp (s, dll_suffix) != 0)
+ {
+ ACE_ERROR ((LM_WARNING,
+ ACE_LIB_TEXT ("Warning: improper suffix for a ")
+ ACE_LIB_TEXT ("shared library on this platform: %s\n"),
+ s));
+ }
+ }
+
+ // Make sure we've got enough space in searchfilename.
+ if (ACE_OS::strlen (searchfilename)
+ + ACE_OS::strlen (ACE_DLL_PREFIX)
+ + got_suffix ? 0 : ACE_OS::strlen (dll_suffix) >= (sizeof searchfilename /
+ sizeof (ACE_TCHAR)))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ // Use absolute pathname if there is one.
+ if (ACE_OS::strlen (searchpathname) > 0)
+ {
+ if (ACE_OS::strlen (searchfilename)
+ + ACE_OS::strlen (searchpathname) >= maxpathnamelen)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ else
+ {
+ #if (ACE_DIRECTORY_SEPARATOR_CHAR != '/')
+ // Revert to native path name separators.
+ ACE_Lib_Find::strrepl (searchpathname,
+ '/',
+ ACE_DIRECTORY_SEPARATOR_CHAR);
+ #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */
+ // First, try matching the filename *without* adding a
+ // prefix.
+ #if defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS)
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%s%s"),
+ searchpathname,
+ searchfilename,
+ got_suffix ? ACE_static_cast (ACE_TCHAR *,
+ ACE_LIB_TEXT (""))
+ : ACE_static_cast (ACE_TCHAR *,
+ dll_suffix));
+ #else /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%s%s"),
+ searchpathname,
+ searchfilename,
+ got_suffix ? ACE_LIB_TEXT ("") : dll_suffix);
+ #endif /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ if (ACE_OS::access (pathname, F_OK) == 0)
+ return 0;
+
+ // Second, try matching the filename *with* adding a prefix.
+ #if defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS)
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%s%s%s"),
+ searchpathname,
+ ACE_DLL_PREFIX,
+ searchfilename,
+ got_suffix ? ACE_static_cast (ACE_TCHAR *,
+ ACE_LIB_TEXT (""))
+ : ACE_static_cast (ACE_TCHAR *,
+ dll_suffix));
+ #else /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%s%s%s"),
+ searchpathname,
+ ACE_DLL_PREFIX,
+ searchfilename,
+ got_suffix ? ACE_LIB_TEXT ("") : dll_suffix);
+ #endif /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ if (ACE_OS::access (pathname, F_OK) == 0)
+ return 0;
+ }
+ }
+
+ // Use relative filenames via LD_LIBRARY_PATH or PATH (depending on
+ // OS platform).
+ else
+ {
+ ACE_TCHAR *ld_path =
+ #if defined ACE_DEFAULT_LD_SEARCH_PATH
+ ACE_DEFAULT_LD_SEARCH_PATH;
+ #else
+ ACE_OS::getenv (ACE_LD_SEARCH_PATH);
+ #endif /* ACE_DEFAULT_LD_SEARCH_PATH */
+
+ if (ld_path != 0
+ && (ld_path = ACE_OS::strdup (ld_path)) != 0)
+ {
+ // strtok has the strange behavior of not separating the
+ // string ":/foo:/bar" into THREE tokens. One would expect
+ // that the first iteration the token would be an empty
+ // string, the second iteration would be "/foo", and the
+ // third iteration would be "/bar". However, this is not
+ // the case; one only gets two iterations: "/foo" followed
+ // by "/bar".
+
+ // This is especially a problem in parsing Unix paths
+ // because it is permissible to specify 'the current
+ // directory' as an empty entry. So, we introduce the
+ // following special code to cope with this:
+
+ // Look at each dynamic lib directory in the search path.
+
+ ACE_TCHAR *nextholder = 0;
+ const ACE_TCHAR *path_entry =
+ ACE_Lib_Find::strsplit_r (ld_path,
+ ACE_LD_SEARCH_PATH_SEPARATOR_STR,
+ nextholder);
+ int result = 0;
+
+ for (;;)
+ {
+ // Check if at end of search path.
+ if (path_entry == 0)
+ {
+ errno = ENOENT;
+ result = -1;
+ break;
+ }
+ else if (ACE_OS::strlen (path_entry)
+ + 1
+ + ACE_OS::strlen (searchfilename)
+ >= maxpathnamelen)
+ {
+ errno = ENOMEM;
+ result = -1;
+ break;
+ }
+ // This works around the issue where a path might have
+ // an empty component indicating 'current directory'.
+ // We need to do it here rather than anywhere else so
+ // that the loop condition will still work.
+ else if (path_entry[0] == '\0')
+ path_entry = ACE_LIB_TEXT (".");
+
+ // First, try matching the filename *without* adding a
+ // prefix.
+ #if defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS)
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%c%s%s"),
+ path_entry,
+ ACE_DIRECTORY_SEPARATOR_CHAR,
+ searchfilename,
+ got_suffix ? ACE_static_cast (ACE_TCHAR *,
+ ACE_LIB_TEXT (""))
+ : ACE_static_cast (ACE_TCHAR *,
+ dll_suffix));
+ #else /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%c%s%s"),
+ path_entry,
+ ACE_DIRECTORY_SEPARATOR_CHAR,
+ searchfilename,
+ got_suffix ? ACE_LIB_TEXT ("") : dll_suffix);
+ #endif /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ if (ACE_OS::access (pathname, F_OK) == 0)
+ break;
+
+ // Second, try matching the filename *with* adding a
+ // prefix.
+ #if defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS)
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%c%s%s%s"),
+ path_entry,
+ ACE_DIRECTORY_SEPARATOR_CHAR,
+ ACE_DLL_PREFIX,
+ searchfilename,
+ got_suffix ? ACE_static_cast (ACE_TCHAR *,
+ ACE_LIB_TEXT (""))
+ : ACE_static_cast (ACE_TCHAR *,
+ dll_suffix));
+ #else /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ ACE_OS::sprintf (pathname,
+ ACE_LIB_TEXT ("%s%c%s%s%s"),
+ path_entry,
+ ACE_DIRECTORY_SEPARATOR_CHAR,
+ ACE_DLL_PREFIX,
+ searchfilename,
+ got_suffix ? ACE_LIB_TEXT ("") : dll_suffix);
+ #endif /* ! defined (ACE_HAS_BROKEN_CONDITIONAL_STRING_CASTS) */
+ if (ACE_OS::access (pathname, F_OK) == 0)
+ break;
+
+ // Fetch the next item in the path
+ path_entry = ACE_Lib_Find::strsplit_r (0,
+ ACE_LD_SEARCH_PATH_SEPARATOR_STR,
+ nextholder);
+ }
+
+ ACE_OS::free ((void *) ld_path);
+ return result;
+ }
+ }
+ errno = ENOENT;
+ return -1;
+ #endif
+
+ /// @todo FIXME: Convert ACE code
+ *this = Path( file );
+
+ return NOT_AN_ERROR;
+ }
+
+ }
+ }
+
+ // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
More information about the llvm-commits
mailing list