コード例 #1
0
ファイル: OTF_File.c プロジェクト: gzt200361/ThirdParty-2.0.0
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;
}
コード例 #2
0
ファイル: OTF_File.c プロジェクト: cot/eztrace-test
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;
}