#include <stdlib.h>
#include <stdio.h>
struct track_ {
char * tracks_title;
int playlist_hits;
} ;
typedef struct track_ track;
struct album_ {
int num_tracks;
struct track_* tracks;
} ;
typedef struct album_ album;
const int max_number_of_album = 100 ;
int number_of_albums = 0 ;
album * all_albums_p = NULL;
void init_all_albums( ) ;
void done_all_albums( ) ;
album* append_album( int num_tracks) ;
void cleanup_album( album* a) ;
void init_all_albums( )
{
if ( ! all_albums_p)
all_albums_p
= ( album
* ) malloc ( sizeof ( album
) * max_number_of_album
) ; }
void done_all_albums( )
{
if ( all_albums_p)
{
while ( number_of_albums-- )
cleanup_album( & all_albums_p[ number_of_albums] ) ;
all_albums_p = NULL;
}
}
album* append_album( int num_tracks)
{
if ( number_of_albums >= max_number_of_album)
return NULL;
int index = number_of_albums++;
all_albums_p[ index] .num_tracks = num_tracks;
all_albums_p
[ index
] .
tracks = ( track
* ) malloc ( sizeof ( track
) * num_tracks
) ;
return all_albums_p+ index;
}
void cleanup_album( album* a)
{
if ( a)
{
while ( a-> num_tracks-- )
free_track( a-> tracks[ a-> num_tracks] ) ;
}
}
// free_track left as an exercise for the reader
int main( int argc, const char * argv[ ] )
{
return 0 ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnN0cnVjdCB0cmFja18gewogIGNoYXIgKnRyYWNrc190aXRsZTsKICBpbnQgcGxheWxpc3RfaGl0czsKfTsKdHlwZWRlZiBzdHJ1Y3QgdHJhY2tfIHRyYWNrOwogCnN0cnVjdCBhbGJ1bV8gewogIGludCBudW1fdHJhY2tzOwogIHN0cnVjdCB0cmFja18qIHRyYWNrczsKfTsKdHlwZWRlZiBzdHJ1Y3QgYWxidW1fIGFsYnVtOwoKCmNvbnN0IGludCBtYXhfbnVtYmVyX29mX2FsYnVtID0gMTAwOwppbnQgbnVtYmVyX29mX2FsYnVtcyA9IDA7CgphbGJ1bSAqYWxsX2FsYnVtc19wID0gTlVMTDsKCnZvaWQgaW5pdF9hbGxfYWxidW1zKCk7CnZvaWQgZG9uZV9hbGxfYWxidW1zKCk7CmFsYnVtKiBhcHBlbmRfYWxidW0oaW50IG51bV90cmFja3MpOwp2b2lkIGNsZWFudXBfYWxidW0oYWxidW0qIGEpOwoKdm9pZCBpbml0X2FsbF9hbGJ1bXMoKQp7CiAgICBpZiAoIWFsbF9hbGJ1bXNfcCkKICAgICAgICBhbGxfYWxidW1zX3AgPSAoYWxidW0gKikgbWFsbG9jKHNpemVvZihhbGJ1bSkqbWF4X251bWJlcl9vZl9hbGJ1bSk7Cn0KCnZvaWQgZG9uZV9hbGxfYWxidW1zKCkKewogICAgaWYgKGFsbF9hbGJ1bXNfcCkKICAgIHsKICAgICAgICB3aGlsZSAobnVtYmVyX29mX2FsYnVtcy0tKQogICAgICAgICAgICBjbGVhbnVwX2FsYnVtKCZhbGxfYWxidW1zX3BbbnVtYmVyX29mX2FsYnVtc10pOwoKICAgICAgICBmcmVlKGFsbF9hbGJ1bXNfcCk7CiAgICAgICAgYWxsX2FsYnVtc19wID0gTlVMTDsKICAgIH0KfQoKYWxidW0qIGFwcGVuZF9hbGJ1bShpbnQgbnVtX3RyYWNrcykKewogICAgaWYgKG51bWJlcl9vZl9hbGJ1bXMgPj0gbWF4X251bWJlcl9vZl9hbGJ1bSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpbnQgaW5kZXggPSBudW1iZXJfb2ZfYWxidW1zKys7CiAgICBhbGxfYWxidW1zX3BbaW5kZXhdLm51bV90cmFja3MgPSBudW1fdHJhY2tzOwogICAgYWxsX2FsYnVtc19wW2luZGV4XS50cmFja3MgICAgID0gKHRyYWNrKikgbWFsbG9jKHNpemVvZih0cmFjaykqbnVtX3RyYWNrcyk7CgogICAgcmV0dXJuIGFsbF9hbGJ1bXNfcCtpbmRleDsKfQoKdm9pZCBjbGVhbnVwX2FsYnVtKGFsYnVtKiBhKQp7CiAgICBpZiAoYSkKICAgIHsKICAgICAgICB3aGlsZSAoYS0+bnVtX3RyYWNrcy0tKQogICAgICAgICAgICBmcmVlX3RyYWNrKGEtPnRyYWNrc1thLT5udW1fdHJhY2tzXSk7CgogICAgICAgIGZyZWUoYS0+dHJhY2tzKTsKICAgIH0KfQogCi8vIGZyZWVfdHJhY2sgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlcgoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKewogICAgCiAgICByZXR1cm4gMDsKfQo=