API change...

Ryan C. Gordon icculus at clutteredmind.org
Sun Sep 18 17:47:00 EDT 2005


Having to eat your own dogfood really teaches you some good lessons.

The new file enumeration callback API in the development branch has 
changed slightly.

You used to do this:

void mycallback(void *data, const char *filename)
{
     MyObj *myobj = (MyObj *) data;
     myobj->printf("The file %s is in this enumeration.\n", filename);
}

PHYSFS_enumerateFilesCallback("/dir/to/enumerate", mycallback, myobj);


This worked fine for very basic enumerations, but frequently you'd need 
to know the directory being enumerated in the callback...the (filename) 
parameter in the callback doesn't contain any path info.

So you'd have to do all this nastiness:

typedef struct
{
    MyObj *myobj;
    const char *origpath;
} FileCallbackData;

void mycallback(void *data, const char *filename)
{
     FileCallbackData *fcbd = (FileCallbackData *) data;
     MyObj *myobj = fcbd->myobj;
     const char *origpath = fcbd->origpath;
     myobj->printf("The file %s is in %s.\n", filename, origpath);
}

const char *dirname = "/dir/to/enumerate";
FileCallbackData fcbd = { myobj, dirname };
PHYSFS_enumerateFilesCallback(dirname, mycallback, &fcbd);


Having to pass all this around is silly, because physfs could do that 
for you.

So now the callback signature is:

void callback(void *data, const char *origdir, const char *filename);


So you do this:


void mycallback(void *data, const char *origdir, const char *filename)
{
     MyObj *myobj = (MyObj *) data;
     myobj->printf("The file %s is in %s.\n", filename, origdir);
}

PHYSFS_enumerateFilesCallback("/dir/to/enumerate", mycallback, myobj);


The call to PHYSFS_enumerateFilesCallback() is identical at the source 
level, it's just the callback itself that has changed. Any programs 
using this API can just add the extra param to their callback and ignore 
it to keep existing functionality.

And, usual disclaimers: these new APIs are breaking now, but won't once 
the development branch stabilizes.

This is in subversion now, revision #769. The stable 1.0 branch hasn't 
changed.

--ryan.





More information about the physfs mailing list