OTF_File* OTF_File_open_zlevel( const char* filename, OTF_FileManager* manager, OTF_FileMode mode, OTF_FileCompression zlevel ) { uint32_t len; /* OTF_fprintf( stderr, "OTF_File_open_zlevel() zlevel: %u, filename: \"%s\"\n", zlevel, filename ); */ OTF_File* ret= (OTF_File*) malloc( sizeof(OTF_File) ); if( NULL == ret ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); return NULL; } OTF_File_init( ret ); if( NULL == filename ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no filename has been specified.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret ); ret= NULL; return NULL; } len= (uint32_t) strlen( filename ); ret->filename= malloc( len +3 ); if( NULL == ret->filename ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret ); ret= NULL; return NULL; } strncpy( ret->filename, filename, len +1 ); ret->mode = mode; if ( OTF_FILEMODE_READ == mode || OTF_FILEMODE_SEEK == mode ) { #ifdef HAVE_ZLIB if ( 0 != access( ret->filename, F_OK ) ) { /* file not found, try '.z' suffix */ strncpy( ret->filename +len, ".z", 3 ); /* OTF_fprintf( stderr, "try '%s'\n", ret->filename ); */ if ( 0 != access( ret->filename, F_OK ) ) { /* file still not found, give up */ free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return ret; } ret->z= malloc( sizeof(z_stream) ); if( NULL == ret->z ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return NULL; } ret->z->next_in= NULL; ret->z->avail_in= 0; ret->z->zalloc= NULL; ret->z->zfree= NULL; ret->z->opaque= NULL; inflateInit( ret->z ); ret->zbuffer= malloc( ret->zbuffersize ); ret->ybuffer= malloc( ret->zbuffersize ); if( NULL == ret->zbuffer || NULL == ret->ybuffer) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret->z ); ret->z= NULL; free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return NULL; } } #else /* HAVE_ZLIB */ if ( 0 != access( ret->filename, F_OK ) ) { /* file still not found, give up */ free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return ret; } #endif /* HAVE_ZLIB */ } else { /* filemode write */ #ifdef HAVE_ZLIB /* is a .z appended to the file name */ if ( len > 2 && 0 == strcmp( ret->filename + len - 2, ".z" ) ) { ret->z= malloc( sizeof(z_stream) ); if( NULL == ret->z ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return NULL; } ret->z->next_in= NULL; ret->z->avail_in= 0; ret->z->zalloc= NULL; ret->z->zfree= NULL; ret->z->opaque= NULL; deflateInit( ret->z, zlevel ); ret->zbuffer= malloc( ret->zbuffersize ); ret->ybuffer= malloc( ret->zbuffersize ); if( NULL == ret->zbuffer || NULL == ret->ybuffer ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret->z ); ret->z= NULL; free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return NULL; } } #endif /* HAVE_ZLIB */ } if( NULL == manager ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "manager has not been specified.\n", __FUNCTION__, __FILE__, __LINE__ ); # ifdef HAVE_ZLIB free( ret->zbuffer ); ret->zbuffer= NULL; free( ret->ybuffer ); ret->ybuffer= NULL; free( ret->z ); ret->z= NULL; # endif /* HAVE_ZLIB */ free( ret->filename ); ret->filename= NULL; free( ret ); ret= NULL; return NULL; } ret->manager= manager; return ret; }
OTF_File* OTF_File_open_with_external_buffer( uint32_t len, const char* buffer, uint8_t is_compressed, OTF_FileMode mode ) { OTF_File* ret; ret= (OTF_File*) malloc( sizeof(OTF_File) ); if( NULL == ret ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); return NULL; } OTF_File_init( ret ); ret->externalbuffer= buffer; ret->externalpos= 0; ret->externallen= (uint64_t) len; ret->mode = mode; if ( is_compressed ) { #ifdef HAVE_ZLIB /* alloc zlib stuff */ ret->z= malloc( sizeof(z_stream) ); if( NULL == ret->z ) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret ); ret= NULL; return NULL; } ret->z->next_in= NULL; ret->z->avail_in= 0; ret->z->zalloc= NULL; ret->z->zfree= NULL; ret->z->opaque= NULL; inflateInit( ret->z ); ret->zbuffer= malloc( ret->zbuffersize ); ret->ybuffer= malloc( ret->zbuffersize ); if( NULL == ret->zbuffer || NULL == ret->ybuffer) { OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "no memory left.\n", __FUNCTION__, __FILE__, __LINE__ ); free( ret->zbuffer ); free( ret->ybuffer ); ret->zbuffer= NULL; ret->ybuffer= NULL; free( ret->z ); ret->z= NULL; free( ret ); ret= NULL; return NULL; } #else /* HAVE_ZLIB */ free( ret ); ret= NULL; OTF_fprintf( stderr, "ERROR in function %s, file: %s, line: %i:\n " "built without HAVE_ZLIB, still trying to open with compressed buffer.\n", __FUNCTION__, __FILE__, __LINE__ ); return NULL; #endif /* HAVE_ZLIB */ } else { /* normal, don't need any special setup */ } ret->manager= NULL; return ret; }