X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_properties.c;h=899bf9ad60516ca2fe9c822dd732d508659ccc77;hb=2c0cf75e5da5906e48c5a6398bd48d04501283b9;hp=3fea15e27103b34aaf5ae52528978f8654b84614;hpb=2a800ec4c840132c7a629b764b673dce09771637;p=melted diff --git a/src/framework/mlt_properties.c b/src/framework/mlt_properties.c index 3fea15e..899bf9a 100644 --- a/src/framework/mlt_properties.c +++ b/src/framework/mlt_properties.c @@ -42,21 +42,38 @@ typedef struct } property_list; +/** Memory leak checks. +*/ + +#ifdef _MLT_PROPERTY_CHECKS_ +static int properties_created = 0; +static int properties_destroyed = 0; +#endif + /** Basic implementation. */ int mlt_properties_init( mlt_properties this, void *child ) { - // NULL all methods - memset( this, 0, sizeof( struct mlt_properties_s ) ); + if ( this != NULL ) + { +#ifdef _MLT_PROPERTY_CHECKS_ + // Increment number of properties created + properties_created ++; +#endif - // Assign the child of the object - this->child = child; + // NULL all methods + memset( this, 0, sizeof( struct mlt_properties_s ) ); - // Allocate the private structure - this->private = calloc( sizeof( property_list ), 1 ); + // Assign the child of the object + this->child = child; - return this->private == NULL; + // Allocate the private structure + this->private = calloc( sizeof( property_list ), 1 ); + } + + // Check that initialisation was successful + return this != NULL && this->private == NULL; } /** Constructor for stand alone object. @@ -74,6 +91,45 @@ mlt_properties mlt_properties_new( ) return this; } +/** Load properties from a file. +*/ + +mlt_properties mlt_properties_load( char *filename ) +{ + // Construct a standalone properties object + mlt_properties this = mlt_properties_new( ); + + if ( this != NULL ) + { + // Open the file + FILE *file = fopen( filename, "r" ); + + // Load contents of file + if ( file != NULL ) + { + // Temp string + char temp[ 1024 ]; + + // Read each string from the file + while( fgets( temp, 1024, file ) ) + { + // Chomp the string + temp[ strlen( temp ) - 1 ] = '\0'; + + // Parse and set the property + if ( strcmp( temp, "" ) && temp[ 0 ] != '#' ) + mlt_properties_parse( this, temp ); + } + + // Close the file + fclose( file ); + } + } + + // Return the pointer + return this; +} + static inline int generate_hash( char *name ) { int hash = 0; @@ -91,7 +147,7 @@ static inline int generate_hash( char *name ) static inline void mlt_properties_do_mirror( mlt_properties this, char *name ) { property_list *list = this->private; - if ( list->mirror != NULL && strcmp( name, "in" ) && strcmp( name, "out" ) ) + if ( list->mirror != NULL ) { char *value = mlt_properties_get( this, name ); if ( value != NULL ) @@ -481,7 +537,7 @@ void mlt_properties_dump( mlt_properties this, FILE *output ) property_list *list = this->private; int i = 0; for ( i = 0; i < list->count; i ++ ) - fprintf( stderr, "%s = %s\n", list->name[ i ], mlt_properties_get( this, list->name[ i ] ) ); + fprintf( stderr, "%s=%s\n", list->name[ i ], mlt_properties_get( this, list->name[ i ] ) ); } /** Close the list. @@ -489,23 +545,34 @@ void mlt_properties_dump( mlt_properties this, FILE *output ) void mlt_properties_close( mlt_properties this ) { - property_list *list = this->private; - int index = 0; - - // Clean up names and values - for ( index = list->count - 1; index >= 0; index -- ) + if ( this != NULL ) { - free( list->name[ index ] ); - mlt_property_close( list->value[ index ] ); - } + property_list *list = this->private; + int index = 0; - // Clear up the list - free( list->name ); - free( list->value ); - free( list ); + // Clean up names and values + for ( index = list->count - 1; index >= 0; index -- ) + { + free( list->name[ index ] ); + mlt_property_close( list->value[ index ] ); + } - // Free this now if this has no child - if ( this->child == NULL ) - free( this ); + // Clear up the list + free( list->name ); + free( list->value ); + free( list ); + + // Free this now if this has no child + if ( this->child == NULL ) + free( this ); + +#ifdef _MLT_PROPERTY_CHECKS_ + // Increment destroyed count + properties_destroyed ++; + + // Show current stats - these should match when the app is closed + fprintf( stderr, "Created %d, destroyed %d\n", properties_created, properties_destroyed ); +#endif + } }