# "Fixes" the problem of nested function usage in Open Cubic Player 0.1.20 # making OCP compile under OS X. Kludge patch by ccr/TNSP in Nov 2010. # # cd ocp-0.1.20 # patch -p1 < ocp-0.1.20-nested-functions-fix.patch # ./configure && make # diff -r 93de82caf917 playgmd/gmdldmf.c --- a/playgmd/gmdldmf.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdldmf.c Wed Nov 17 01:50:26 2010 +0200 @@ -131,6 +131,20 @@ (*bpm)=rpm*(*tempo)/24; } +#define safeout(ERR) real_safe(ERR, orders, patbuf, patadr, temptrack) +static int real_safe(int err, void *orders, void *patbuf, void *patadr, void *temptrack) + { + if (orders) + free(orders); + if (patbuf) + free(patbuf); + if (patadr) + free(patadr); + if (temptrack) + free(temptrack); + return err; + } + static int _mpLoadDMF(struct gmdmodule *m, FILE *file) { struct __attribute__((packed)) { @@ -172,18 +186,6 @@ uint8_t smppack[256]; - int safeout(int err) - { - if (orders) - free(orders); - if (patbuf) - free(patbuf); - if (patadr) - free(patadr); - if (temptrack) - free(temptrack); - return err; - } mpReset(m); diff -r 93de82caf917 playgmd/gmdlmdl.c --- a/playgmd/gmdlmdl.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdlmdl.c Wed Nov 17 01:50:26 2010 +0200 @@ -111,6 +111,27 @@ *(*p)++=d; } +#define FreeResources() realfreeres(&msmps, &inssampnum) + void realfreeres(struct gmdsample ***msmps, unsigned int **inssampnum) + { + int j; + if (*msmps) + { + for (j=0; j<255; j++) + { + if (*msmps[j]) + free(*msmps[j]); + } + free(*msmps); + *msmps=NULL; + } + if (*inssampnum) + { + free(*inssampnum); + *inssampnum=NULL; + } + } + static int _mpLoadMDL(struct gmdmodule *m, FILE *file) { uint32_t waste1; @@ -154,25 +175,6 @@ unsigned int maxins; unsigned int smpnum; - void FreeResources(void) - { - int j; - if (msmps) - { - for (j=0; j<255; j++) - { - if (msmps[j]) - free(msmps[j]); - } - free(msmps); - msmps=0; - } - if (inssampnum) - { - free(inssampnum); - inssampnum=0; - } - } mpReset(m); diff -r 93de82caf917 playgmd/gmdlmtm.c --- a/playgmd/gmdlmtm.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdlmtm.c Wed Nov 17 01:50:26 2010 +0200 @@ -38,6 +38,19 @@ *(*p)++=d; } +#define safeout(ERR) real_safe(ERR, temptrack, tbuffer, trackseq) +static int real_safe(int err, void *temptrack, void *tbuffer, void *trackseq) + { + if (temptrack) + free(temptrack); + if (tbuffer) + free(tbuffer); + if (trackseq) + free(trackseq); + return err; + } + + static int _mpLoadMTM(struct gmdmodule *m, FILE *file) { struct __attribute__((packed)) { @@ -64,17 +77,6 @@ uint8_t *tbuffer=0; uint16_t (*trackseq)[32]=0; - int safeout(int err) - { - if (temptrack) - free(temptrack); - if (tbuffer) - free(tbuffer); - if (trackseq) - free(trackseq); - return err; - } - mpReset(m); if (fread(&header, 66, 1, file) != 1) diff -r 93de82caf917 playgmd/gmdlokt.c --- a/playgmd/gmdlokt.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdlokt.c Wed Nov 17 01:50:26 2010 +0200 @@ -39,6 +39,15 @@ *(*p)++=d; } +static int real_safe(int err, void *temptrack, void *buffer) + { + if (temptrack) + free(temptrack); + if (buffer) + free(buffer); + return err; + } + static int _mpLoadOKT(struct gmdmodule *m, FILE *file) { @@ -58,14 +67,8 @@ struct gmdpattern *pp; uint8_t *temptrack = 0; uint8_t *buffer = 0; - int safeout(int err) - { - if (temptrack) - free(temptrack); - if (buffer) - free(buffer); - return err; - } + +#define safeout(ERR) real_safe(ERR, temptrack, buffer) mpReset(m); diff -r 93de82caf917 playgmd/gmdlptm.c --- a/playgmd/gmdlptm.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdlptm.c Wed Nov 17 01:50:26 2010 +0200 @@ -38,6 +38,18 @@ *(*p)++=d; } + +#define safeout(ERR) real_safe(ERR, buffer, temptrack) +static int real_safe(int err, void *buffer, void *temptrack) + { + if (buffer) + free(buffer); + if (temptrack) + free(temptrack); + return err; + } + + static int _mpLoadPTM(struct gmdmodule *m, FILE *file) { @@ -51,15 +63,6 @@ uint8_t *buffer = 0; uint8_t *temptrack = 0; - int safeout(int err) - { - if (buffer) - free(buffer); - if (temptrack) - free(temptrack); - return err; - } - struct __attribute__((packed)) { char name[28]; diff -r 93de82caf917 playgmd/gmdlult.c --- a/playgmd/gmdlult.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playgmd/gmdlult.c Wed Nov 17 01:50:26 2010 +0200 @@ -38,6 +38,16 @@ *(*p)++=d; } +#define safeout(ERR) real_safe(ERR, buffer, temptrack) + int real_safe(int err, void *buffer, void *temptrack) + { + if (buffer) + free(buffer); + if (temptrack) + free(temptrack); + return err; + } + static int _mpLoadULT(struct gmdmodule *m, FILE *file) { char id[15]; @@ -62,14 +72,6 @@ uint8_t *chcurcmd[32]; uint8_t chrepn[32]; - int safeout(int err) - { - if (buffer) - free(buffer); - if (temptrack) - free(temptrack); - return err; - } mpReset(m); diff -r 93de82caf917 playxm/xmlmxm.c --- a/playxm/xmlmxm.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playxm/xmlmxm.c Wed Nov 17 01:50:26 2010 +0200 @@ -32,6 +32,29 @@ #include "xmplay.h" #include "stuff/err.h" +#define cleanup_memory() real_cleanup(m, smps, msmps, instsmpnum) +static void real_cleanup(struct xmodule *m, struct sampleinfo **smps, struct xmpsample **msmps, unsigned int *instsmpnum) + { + unsigned int i; + if (smps||msmps) + for (i=0; ininst; i++) + { + if (smps) + if (smps[i]) + free(smps[i]); + if (msmps) + if (msmps[i]) + free(msmps[i]); + } + if (smps) + free(smps); + if (msmps) + free(msmps); + if (instsmpnum) + free(instsmpnum); + } + + int __attribute__ ((visibility ("internal"))) xmpLoadMXM(struct xmodule *m, FILE *file) { uint8_t deltasamps, modpanning; @@ -66,25 +89,6 @@ uint32_t guspos[128*16]; - void cleanup_memory(void) - { - if (smps||msmps) - for (i=0; ininst; i++) - { - if (smps) - if (smps[i]) - free(smps[i]); - if (msmps) - if (msmps[i]) - free(msmps[i]); - } - if (smps) - free(smps); - if (msmps) - free(msmps); - if (instsmpnum) - free(instsmpnum); - } m->envelopes=0; m->samples=0; diff -r 93de82caf917 playxm/xmload.c --- a/playxm/xmload.c Wed Nov 17 01:23:53 2010 +0200 +++ b/playxm/xmload.c Wed Nov 17 01:50:26 2010 +0200 @@ -34,6 +34,31 @@ #include "xmplay.h" #include "stuff/err.h" +#define cleanup(ERR) real_clean(ERR, smps, msmps, instsmpnum, head2.ninst) +static int real_clean(int retval, struct sampleinfo **smps, struct xmpsample **msmps, unsigned int *instsmpnum, int ninst) + { + int l; + if (smps) + { + for (l=0;lenvelopes=0; m->samples=0;