Beispiel #1
0
void ck_large_files_test::setup()
{
    FILE* f = local_fopen(ASCII_FILE,LOCAL_WRITE_MODE);
    fwrite(ASCII_FILE.c_str(),ASCII_FILE.length(),1,f);
    fclose(f);
    f = local_fopen(UNICODE_FILE,LOCAL_WRITE_MODE);
    fwrite(UNICODE_FILE.get_wide_string().data(),UNICODE_FILE.get_wide_string().length(),1,f);
    fclose(f);
    f = local_fopen( PRE_ALLOCATED_FILE, "w+b" );
    fwrite(UNICODE_FILE.get_wide_string().data(),UNICODE_FILE.get_wide_string().length(),1,f);
    fclose(f);
}
Beispiel #2
0
void ck_large_files_test::teardown()
{
#ifdef IS_WINDOWS
    if ( !DeleteFile(UNICODE_FILE.get_wide_string().data()) )
        printf("Failed to delete unicode file\n");
    if ( !DeleteFile(ASCII_FILE.get_wide_string().data()) )
        printf("Failed to delete ascii file\n");
    if ( !DeleteFile(PRE_ALLOCATED_FILE.get_wide_string().data()) )
        printf("Failed to delete pre allocated file\n");
#endif
#ifdef IS_LINUX
    if ( remove(ASCII_FILE.c_str()) != 0)
        printf("Failed to delete ascii file\n");
    if (remove(UNICODE_FILE.c_str()) != 0)
        printf("Failed to delete unicode file\n");
    if (remove(PRE_ALLOCATED_FILE.c_str()) != 0)
        printf("Failed to delete pre allocated file\n");
#endif
}
void ck_dynamic_library::load( const ck_string& libraryName )
{
    if( false == libraryName.empty() )
    {
        if( (_libraryName != libraryName) && _libraryInstance )
            unload();

#ifdef IS_WINDOWS
        _libraryInstance = ::LoadLibraryW( libraryName.get_wide_string().data() );
#else
        _libraryInstance = dlopen( libraryName.c_str(), RTLD_NOW | RTLD_GLOBAL );
#endif

        if( _libraryInstance == 0 )
        {
#ifdef IS_WINDOWS
            LPVOID str = 0;
            DWORD_PTR args[1] = { (DWORD_PTR)_libraryName.c_str() };

            FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                           NULL,
                           GetLastError(),
                           MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                           (LPTSTR)&str,
                           0,
                           (va_list*)args );

            // The string already comes with a carriage return.
            ck_string errorString = (LPTSTR)str;
            LocalFree( str );

            CK_THROW(("Unable to load library(%s); error(%s)",
                      libraryName.c_str(), errorString.c_str() ));
#else
            ck_string dlError = dlerror();

            if( dlError.contains( "undefined symbol: " ) )
            {
                vector<ck_string> parts = dlError.split( "undefined symbol: " );

                if( parts.size() == 2 )
                {
                    ck_string rhs = parts[1];

                    const size_t closeParen = rhs.find( ')' );

                    ck_string mangledName = rhs.substr( 0, (rhs.size()-closeParen) );

                    int status = 0;
                    char* demangled = abi::__cxa_demangle( mangledName.c_str(), NULL, NULL, &status );

                    ck_string demangledName = demangled;

                    free( demangled );

                    CK_THROW(("Unable to load library(%s); error(%s); demangled undefined symbol(%s);",
                              libraryName.c_str(), dlError.c_str(), demangledName.c_str() ));
                }
            }
            else CK_THROW(("Unable to load library(%s); error(%s)", libraryName.c_str(), dlerror() ));
#endif
        }

        _libraryName = libraryName;
    }
    else CK_THROW(("Library name is empty"));
}