From b65efd642c61c50ac962476ec0f53592fb7798ce Mon Sep 17 00:00:00 2001 From: martinahansen Date: Thu, 14 Aug 2008 06:03:44 +0000 Subject: [PATCH] unit test of mem.c done git-svn-id: http://biopieces.googlecode.com/svn/trunk@207 74ccb610-7750-0410-82ae-013aeee3265d --- code_c/Maasha/src/inc/common.h | 6 -- code_c/Maasha/src/inc/mem.h | 18 +---- code_c/Maasha/src/lib/common.c | 86 ---------------------- code_c/Maasha/src/lib/fasta.c | 10 +-- code_c/Maasha/src/lib/filesys.c | 8 +-- code_c/Maasha/src/lib/hash.c | 12 ++-- code_c/Maasha/src/lib/list.c | 10 +-- code_c/Maasha/src/lib/mem.c | 49 ++++++------- code_c/Maasha/src/lib/strings.c | 2 +- code_c/Maasha/src/lib/ucsc.c | 2 +- code_c/Maasha/src/repeat-O-matic.c | 18 ++--- code_c/Maasha/src/test/test_mem.c | 112 +++++++++++++++++++++++++++-- 12 files changed, 161 insertions(+), 172 deletions(-) diff --git a/code_c/Maasha/src/inc/common.h b/code_c/Maasha/src/inc/common.h index 320f0a9..0401dd1 100644 --- a/code_c/Maasha/src/inc/common.h +++ b/code_c/Maasha/src/inc/common.h @@ -67,12 +67,6 @@ bool binary_search_array( int *array, int array_size, int val ); /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MISC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ -/* Split a given line and a delimiter return the split result as a list. */ -void split( char *string, char delimit, struct list **fields ); - -/* Mockup version of Perl substr. */ -char *substr( char *string, int offset, int len ); - /* Return a binary number as a string of 1's and 0's. */ char *bits2string( uint bin ); diff --git a/code_c/Maasha/src/inc/mem.h b/code_c/Maasha/src/inc/mem.h index 08c976d..99c22ef 100644 --- a/code_c/Maasha/src/inc/mem.h +++ b/code_c/Maasha/src/inc/mem.h @@ -1,12 +1,3 @@ -/* Macro for dynamic allocation of memory. */ -#define MEM_GET( pt ) ( pt = mem_get( sizeof( *pt ) ) ) - -/* Macro for resetting a pointer to all \0's. */ -#define MEM_ZERO( pt ) ( memset( pt, '\0', sizeof( *pt ) ) ) - -/* Macro for cloning a structure in memroy. */ -#define MEM_CLONE( pt ) mem_clone( pt, sizeof( ( pt )[ 0 ] ) ) - /* Get a pointer with a given size of allocated memory. */ void *mem_get( size_t size ); @@ -14,16 +5,13 @@ void *mem_get( size_t size ); void *mem_get_zero( size_t size ); /* Resize allocated memory for a given pointer. */ -void *mem_resize( void* pt, size_t size ); +void *mem_resize( void *pt, size_t size ); /* Resize allocated memory for a given pointer with extra memory zero'ed. */ -void *mem_resize_zero( void* pt, size_t old_size, size_t new_size ); +void *mem_resize_zero( void *pt, size_t old_size, size_t new_size ); /* Clone a structure in memory and return a pointer to the clone. */ void *mem_clone( void *old_pt, size_t size ); /* Free memory from a given pointer. */ -void mem_free( void *pt ); - -/* Zero and then free memory from a given pointer. */ -void mem_free_zero( void *pt ); +void mem_free( void **ppt ); diff --git a/code_c/Maasha/src/lib/common.c b/code_c/Maasha/src/lib/common.c index 05e7793..fb46e12 100644 --- a/code_c/Maasha/src/lib/common.c +++ b/code_c/Maasha/src/lib/common.c @@ -64,92 +64,6 @@ bool binary_search_array( int *array, int array_size, int val ) /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MISC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ -void split( char *string, char delimit, struct list **fields ) -{ - /* Martin A. Hansen, June 2008 */ - - /* Split a given line and a delimiter return the split result as a list. */ - - int i; - int j; - - char field[ 256 ] = ""; - char *field_copy; - - j = 0; - - for ( i = 0; string[ i ]; i++ ) - { - if ( string[ i ] != delimit ) - { - field[ j ] = string[ i ]; - - j++; - } - else - { - field_copy = mem_clone( field, j + 1 ); - - list_add( fields, field_copy ); - - MEM_ZERO( field ); - - j = 0; - } - } - - field_copy = mem_clone( field, j + 1 ); - - list_add( fields, field_copy ); - - list_reverse( fields ); -} - - -char *substr( char *string, int offset, int len ) -{ - /* Martin A. Hansen, May 2008 */ - - /* Create equavalent of Perls substr command. */ - /* Currently implemented without optional length */ - /* and the replace feature. */ - - int string_len; - int i; - int j; - char *substr; - - string_len = strlen( string ); - - if ( offset < 0 ) { - die( "substr offset < 0." ); - } else if ( len < 0 ) { - die( "substr length < 0." ); - } else if ( offset > string_len ) { - die( "substr offset outside string." ); - } else if ( offset + len > string_len ) { - die( "substr offset + len outside string." ); - } - - substr = mem_get( len + 1 ); - - i = offset; - j = 0; - - while ( i < offset + len ) - { - substr[ j ] = string[ i ]; - - i++; - j++; - } - - substr[ j ] = '\0'; - - return substr; -} - - char *bits2string( uint bin ) { /* Martin A. Hansen, June 2008 */ diff --git a/code_c/Maasha/src/lib/fasta.c b/code_c/Maasha/src/lib/fasta.c index 21fc66f..b4e929f 100644 --- a/code_c/Maasha/src/lib/fasta.c +++ b/code_c/Maasha/src/lib/fasta.c @@ -41,7 +41,7 @@ bool fasta_get_entry( FILE *fp, struct seq_entry *entry ) char *seq_name = NULL; char *seq = NULL; - MEM_GET( entry ); + entry = mem_get( sizeof( entry ) ); offset = ftell( fp ); @@ -148,7 +148,7 @@ void fasta_get_entries( FILE *fp, struct list **entries ) while ( 1 ) { - MEM_GET( entry ); + entry = mem_get( sizeof( entry ) ); if ( ! fasta_get_entry( fp, entry ) ) { break; @@ -181,9 +181,9 @@ void fasta_free_entry( struct seq_entry *entry ) /* Deallocates memory from a seq_entry. */ - mem_free( entry->seq_name ); - mem_free( entry->seq ); - mem_free( entry ); + mem_free( ( void * ) &entry->seq_name ); + mem_free( ( void * ) &entry->seq ); + mem_free( ( void * ) &entry ); } diff --git a/code_c/Maasha/src/lib/filesys.c b/code_c/Maasha/src/lib/filesys.c index d3bf3db..9a338e5 100644 --- a/code_c/Maasha/src/lib/filesys.c +++ b/code_c/Maasha/src/lib/filesys.c @@ -162,7 +162,7 @@ struct file_buffer *read_open_buffer( char *file ) char *str; bool eof; - MEM_GET( buffer ); + buffer = mem_get( sizeof( buffer ) ); fp = read_open( file ); @@ -301,7 +301,7 @@ void buffer_resize( struct file_buffer *buffer ) buffer->end = new_end; - mem_free( str ); + mem_free( ( void * ) &str ); } @@ -313,8 +313,8 @@ void buffer_destroy( struct file_buffer *buffer ) close_stream( buffer->fp ); - mem_free( buffer->str ); - mem_free( buffer ); + mem_free( ( void * ) &buffer->str ); + mem_free( ( void * ) &buffer ); } diff --git a/code_c/Maasha/src/lib/hash.c b/code_c/Maasha/src/lib/hash.c index ee25d12..51c7129 100644 --- a/code_c/Maasha/src/lib/hash.c +++ b/code_c/Maasha/src/lib/hash.c @@ -13,7 +13,7 @@ struct hash *hash_new( size_t size ) struct hash *new_hash; int table_size; - MEM_GET( new_hash ); + new_hash = mem_get( sizeof( new_hash ) ); table_size = 1 << size; /* table_size = ( 2 ** size ) */ @@ -43,7 +43,7 @@ void hash_add( struct hash *myhash, char *key, void *val ) } else { - MEM_GET( new_elem ); + new_elem = mem_get( sizeof( new_elem ) ); hash_index = ( hash_key( key ) & myhash->mask ); @@ -142,14 +142,14 @@ void hash_destroy( struct hash *myhash ) { for ( bucket = myhash->table[ i ]; bucket != NULL; bucket = bucket->next ) { - mem_free( bucket->key ); + mem_free( ( void * ) &bucket->key ); // mem_free( bucket->val ); - mem_free( bucket ); + mem_free( ( void * ) &bucket ); } } - mem_free( myhash->table ); - mem_free( myhash ); + mem_free( ( void * ) &myhash->table ); + mem_free( ( void * ) &myhash ); } diff --git a/code_c/Maasha/src/lib/list.c b/code_c/Maasha/src/lib/list.c index 4b08c51..9105d66 100644 --- a/code_c/Maasha/src/lib/list.c +++ b/code_c/Maasha/src/lib/list.c @@ -11,7 +11,7 @@ void list_add( struct list **list_ppt, void *val ) struct list *elem = NULL; - MEM_GET( elem ); + elem = mem_get( sizeof( elem ) ); elem->val = val; elem->next = *( list_ppt ); @@ -27,7 +27,7 @@ void list_add_int( struct list_int **list_ppt, int val ) struct list_int *elem = NULL; - MEM_GET( elem ); + elem = mem_get( sizeof( elem ) ); elem->val = val; // elem->next = *( list_ppt ); @@ -68,7 +68,7 @@ bool list_exists( struct list *list_pt, char *string ) struct list *elem; - MEM_GET( elem ); + elem = mem_get( sizeof( elem ) ); for ( elem = list_pt; elem != NULL; elem = elem->next ) { @@ -89,7 +89,7 @@ bool list_exists_int( struct list_int *list_pt, int val ) struct list_int *elem; - MEM_GET( elem ); + elem = mem_get( sizeof( elem ) ); // for ( elem = list_pt; elem != NULL; elem = elem->next ) { @@ -116,7 +116,7 @@ void list_free( void *list_pt ) { elem = next; next = elem->next; - mem_free( elem ); + mem_free( ( void * ) &elem ); } ppt = NULL; diff --git a/code_c/Maasha/src/lib/mem.c b/code_c/Maasha/src/lib/mem.c index 72c0280..5bee88b 100644 --- a/code_c/Maasha/src/lib/mem.c +++ b/code_c/Maasha/src/lib/mem.c @@ -16,7 +16,7 @@ void *mem_get( size_t size ) if ( ( pt = malloc( size ) ) == NULL ) { - fprintf( stderr, "ERROR: Could not allocate %ld byte(s): %s\n", size, strerror( errno ) ); + fprintf( stderr, "ERROR: Could not allocate %zu byte(s): %s\n", size, strerror( errno ) ); abort(); } @@ -48,14 +48,18 @@ void *mem_resize( void *pt, size_t size ) { /* Martin A. Hansen, May 2008 */ + /* Unit test done.*/ + /* Resize an allocated chunk of memory for a given pointer and new size. */ void *pt_new; - if ( size == 0 ) { - die( "could not re-allocate 0 bytes of memory." ); - } else if ( ( pt_new = realloc( pt, size ) ) == NULL ) { - die( "could not re-allocate memory." ); + assert( size > 0 ); + + if ( ( pt_new = realloc( pt, size ) ) == NULL ) + { + fprintf( stderr, "ERROR: Could not re-allocate %zu byte(s)\n", size ); + abort(); } return pt_new; @@ -66,6 +70,8 @@ void *mem_resize_zero( void *pt, size_t old_size, size_t new_size ) { /* Martin A. Hansen, May 2008 */ + /* Unit test done.*/ + /* Resize an allocated chunk of memory for a given pointer and zero any extra memory. */ void *pt_new; @@ -84,10 +90,14 @@ void *mem_clone( void *old_pt, size_t size ) { /* Martin A. Hansen, June 2008 */ + /* Unit test done.*/ + /* Clone a structure in memory and return a pointer to the clone. */ void *new_pt; + assert( size > 0 ); + new_pt = mem_get( size ); memcpy( new_pt, old_pt, size ); @@ -96,34 +106,15 @@ void *mem_clone( void *old_pt, size_t size ) } -void mem_free( void *pt ) +void mem_free( void **ppt ) { /* Martin A. Hansen, May 2008 */ - /* Free memory from a given pointer. */ - - if ( pt != NULL ) - { - free( pt ); - - pt = NULL; - } -} - - -void mem_free_zero( void *pt ) -{ - /* Martin A. Hansen, July 2008 */ + /* Unit test done.*/ - /* Zero and then free memory from a given pointer. */ + /* Free memory from a given pointer. */ - if ( pt != NULL ) - { - MEM_ZERO( pt ); - free( pt ); + free( *ppt ); - pt = NULL; - } + *ppt = NULL; } - - diff --git a/code_c/Maasha/src/lib/strings.c b/code_c/Maasha/src/lib/strings.c index d7e5bfd..a75298e 100644 --- a/code_c/Maasha/src/lib/strings.c +++ b/code_c/Maasha/src/lib/strings.c @@ -33,7 +33,7 @@ size_t chomp( char *string ) /* Removes the last char from a string if the char is a newline. */ /* Returns the length of the chomped string or -1 is no newline was found. */ - int len; + size_t len; assert( string != NULL ); assert( string[ 0 ] != '\0' ); diff --git a/code_c/Maasha/src/lib/ucsc.c b/code_c/Maasha/src/lib/ucsc.c index c36bff0..2d831e0 100644 --- a/code_c/Maasha/src/lib/ucsc.c +++ b/code_c/Maasha/src/lib/ucsc.c @@ -11,7 +11,7 @@ void bed_get_entry( FILE *fp, struct bed_entry3 *bed, int cols ) char bed_buffer[ BED_BUFFER ]; struct bed_entry12 *bed12 = NULL; - MEM_GET( bed12 ); + bed12 = mem_get( sizeof( bed12 ) ); if ( ( fgets( bed_buffer, sizeof( bed_buffer ), fp ) != NULL ) ) { diff --git a/code_c/Maasha/src/repeat-O-matic.c b/code_c/Maasha/src/repeat-O-matic.c index 6e7908a..3c6f340 100644 --- a/code_c/Maasha/src/repeat-O-matic.c +++ b/code_c/Maasha/src/repeat-O-matic.c @@ -68,7 +68,7 @@ uint *oligo_count( char *path ) mask = mask_create( OLIGO_SIZE ); - MEM_GET( entry ); + entry = mem_get( sizeof( entry ) ); fp = read_open( path ); @@ -163,11 +163,12 @@ void oligo_count_output( char *path, uint *array ) uint *block; uint block_pos; uint block_beg; + uint block_size; uint chr_pos; mask = mask_create( OLIGO_SIZE ); - MEM_GET( entry ); + entry = mem_get( sizeof( entry ) ); fp = read_open( path ); @@ -175,10 +176,11 @@ void oligo_count_output( char *path, uint *array ) { fprintf( stderr, "Writing results for: %s ... ", entry->seq_name ); - bin = 0; - j = 0; - block_pos = 0; - block = mem_get_zero( sizeof( uint ) * ( entry->seq_len + OLIGO_SIZE ) ); + bin = 0; + j = 0; + block_pos = 0; + block_size = sizeof( uint ) * ( entry->seq_len + OLIGO_SIZE ); + block = mem_get_zero( block_size ); for ( i = 0; entry->seq[ i ]; i++ ) { @@ -203,7 +205,7 @@ void oligo_count_output( char *path, uint *array ) if ( block_pos == 0 ) { - MEM_ZERO( block ); + memset( block, '\0', block_size ); block_beg = chr_pos; @@ -234,7 +236,7 @@ void oligo_count_output( char *path, uint *array ) { fixedstep_put_entry( entry->seq_name, block_beg, 1, block, block_pos ); - mem_free( block ); + mem_free( ( void * ) &block ); } fprintf( stderr, "done.\n" ); diff --git a/code_c/Maasha/src/test/test_mem.c b/code_c/Maasha/src/test/test_mem.c index 29ef64d..faa6a91 100644 --- a/code_c/Maasha/src/test/test_mem.c +++ b/code_c/Maasha/src/test/test_mem.c @@ -3,6 +3,9 @@ static void test_mem_get(); static void test_mem_get_zero(); +static void test_mem_resize(); +static void test_mem_resize_zero(); +static void test_mem_clone(); static void test_mem_free(); @@ -12,6 +15,9 @@ int main() test_mem_get(); test_mem_get_zero(); + test_mem_resize(); + test_mem_resize_zero(); + test_mem_clone(); test_mem_free(); fprintf( stderr, "Done\n\n" ); @@ -27,7 +33,7 @@ void test_mem_get() size_t len = 1000000000; char *pt = mem_get( len ); - mem_free( pt ); + mem_free( ( void * ) &pt ); fprintf( stderr, "OK\n" ); } @@ -45,7 +51,85 @@ void test_mem_get_zero() assert( pt[ i ] == '\0' ); } - mem_free( pt ); + mem_free( ( void * ) &pt ); + + fprintf( stderr, "OK\n" ); +} + + +void test_mem_resize() +{ + fprintf( stderr, " Testing mem_resize ... " ); + + char *pt0 = "foo"; + char *pt1 = NULL; + + pt1 = mem_get( 3 + 1 ); + + memcpy( pt1, pt0, 3 ); + + pt1 = mem_resize( pt1, 1 ); + + mem_free( ( void * ) &pt1 ); + + fprintf( stderr, "OK\n" ); +} + + +void test_mem_resize_zero() +{ + fprintf( stderr, " Testing mem_resize_zero ... " ); + + size_t i; + size_t size_before = 10; + size_t size_after = 100000; + + char *pt = NULL; + + pt = mem_get( size_before ); + + memset( pt, '1', size_before ); + + assert( strlen( pt ) == size_before ); + + pt = mem_resize_zero( pt, size_before, size_after ); + + assert( strlen( pt ) == size_before ); + + for ( i = size_before; i <= size_after; i++ ) { + assert( pt[ i ] == '\0' ); + } + + mem_free( ( void * ) &pt ); + + fprintf( stderr, "OK\n" ); +} + + +void test_mem_clone() +{ + fprintf( stderr, " Testing mem_clone ... " ); + + char *pt; + char *pt_clone; + size_t pt_size = 10000; + size_t i; + + pt = mem_get( pt_size ); + + memset( pt, 'X', pt_size ); + + pt_clone = mem_clone( pt, pt_size ); + + assert( pt_clone != pt ); + assert( &pt_clone != &pt ); + + for ( i = 0; i < pt_size; i++ ) { + assert( pt[ i ] == pt_clone[ i ] ); + } + + mem_free( ( void * ) &pt ); + mem_free( ( void * ) &pt_clone ); fprintf( stderr, "OK\n" ); } @@ -55,13 +139,29 @@ void test_mem_free() { fprintf( stderr, " Testing mem_free ... " ); - void *pt = mem_get( 100 ); + char *pt0 = "foo"; + void *pt1 = NULL; + char *pt2 = NULL; + + assert( pt0 != NULL ); + assert( pt1 == NULL ); + assert( pt2 == NULL ); + + pt1 = mem_get( 100 ); + pt2 = mem_get( 100 ); + + assert( pt1 != NULL ); + assert( pt2 != NULL ); - mem_free( pt ); + memcpy( pt2, pt0, 3 ); - printf( "pt: %s\n", ( char * ) pt ); + mem_free( &pt1 ); + mem_free( &pt1 ); + mem_free( ( void * ) &pt1 ); + mem_free( ( void * ) &pt2 ); - assert( pt == NULL ); + assert( pt1 == NULL ); + assert( pt2 == NULL ); fprintf( stderr, "OK\n" ); } -- 2.39.2