X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_properties.c;h=899bf9ad60516ca2fe9c822dd732d508659ccc77;hb=2c0cf75e5da5906e48c5a6398bd48d04501283b9;hp=cebaa900d144677dd4adf9b5f9e5f90b83545118;hpb=12d4027b3039f13c4b5f9fdb12f2fb4b7d3c3f44;p=melted diff --git a/src/framework/mlt_properties.c b/src/framework/mlt_properties.c index cebaa90..899bf9a 100644 --- a/src/framework/mlt_properties.c +++ b/src/framework/mlt_properties.c @@ -38,24 +38,42 @@ typedef struct mlt_property *value; int count; int size; + mlt_properties mirror; } 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. @@ -73,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; @@ -87,17 +144,14 @@ static inline int generate_hash( char *name ) real producer. */ -static void mlt_properties_do_mirror( mlt_properties this, char *name ) +static inline void mlt_properties_do_mirror( mlt_properties this, char *name ) { - if ( strcmp( name, "in" ) && strcmp( name, "out" ) ) + property_list *list = this->private; + if ( list->mirror != NULL ) { - mlt_properties mirror = mlt_properties_get_data( this, "mlt_mirror", NULL ); - if ( mirror != NULL ) - { - char *value = mlt_properties_get( this, name ); - if ( value != NULL ) - mlt_properties_set( mirror, name, value ); - } + char *value = mlt_properties_get( this, name ); + if ( value != NULL ) + mlt_properties_set( list->mirror, name, value ); } } @@ -106,7 +160,8 @@ static void mlt_properties_do_mirror( mlt_properties this, char *name ) void mlt_properties_mirror( mlt_properties this, mlt_properties that ) { - mlt_properties_set_data( this, "mlt_mirror", that, 0, NULL, NULL ); + property_list *list = this->private; + list->mirror = that; } /** Inherit all serialisable properties from that into this. @@ -156,20 +211,23 @@ static inline mlt_property mlt_properties_find( mlt_properties this, char *name { property_list *list = this->private; mlt_property value = NULL; - int i = 0; int key = generate_hash( name ); + int i = list->hash[ key ] - 1; - // Check if we're hashed - if ( list->count > 0 && - name[ 0 ] == list->name[ list->hash[ key ] ][ 0 ] && - !strcmp( list->name[ list->hash[ key ] ], name ) ) - value = list->value[ list->hash[ key ] ]; - - // Locate the item - for ( i = 0; value == NULL && i < list->count; i ++ ) - if ( name[ 0 ] == list->name[ i ][ 0 ] && !strcmp( list->name[ i ], name ) ) + if ( i >= 0 ) + { + // Check if we're hashed + if ( list->count > 0 && + name[ 0 ] == list->name[ i ][ 0 ] && + !strcmp( list->name[ i ], name ) ) value = list->value[ i ]; + // Locate the item + for ( i = list->count - 1; value == NULL && i >= 0; i -- ) + if ( name[ 0 ] == list->name[ i ][ 0 ] && !strcmp( list->name[ i ], name ) ) + value = list->value[ i ]; + } + return value; } @@ -194,7 +252,8 @@ static mlt_property mlt_properties_add( mlt_properties this, char *name ) list->value[ list->count ] = mlt_property_init( ); // Assign to hash table - list->hash[ key ] = list->count; + if ( list->hash[ key ] == 0 ) + list->hash[ key ] = list->count + 1; // Return and increment count accordingly return list->value[ list->count ++ ]; @@ -236,6 +295,14 @@ int mlt_properties_set( mlt_properties this, char *name, char *value ) return error; } +/** Set or default the property. +*/ + +int mlt_properties_set_or_default( mlt_properties this, char *name, char *value, char *def ) +{ + return mlt_properties_set( this, name, value == NULL ? def : value ); +} + /** Get a string value by name. */ @@ -453,6 +520,7 @@ int mlt_properties_rename( mlt_properties this, char *source, char *dest ) { free( list->name[ i ] ); list->name[ i ] = strdup( dest ); + list->hash[ generate_hash( dest ) ] = i + 1; break; } } @@ -469,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. @@ -477,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 ] ); + } + + // 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 ); + // 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 + } }