# HG changeset patch # User Matti Hamalainen # Date 1578745523 -7200 # Node ID ee56f1f2b5284f73e7f6058908586d5abc663750 # Parent 8a489e5a81d7eee7f231e3ad0dfbaa3d1c35c42b Change how the STIL subtune are handled internally. Also fix a bug that caused the _last_ STIL field of each subtune not to be printed at all :S diff -r 8a489e5a81d7 -r ee56f1f2b528 sidinfo.c --- a/sidinfo.c Sat Jan 11 13:51:02 2020 +0200 +++ b/sidinfo.c Sat Jan 11 14:25:23 2020 +0200 @@ -1182,18 +1182,16 @@ // We need to count the number of fields to be outputted // beforehand, so we can know when we are at the last one - for (int nsubtune = 0; nsubtune < psid->stil->nsubtunes; nsubtune++) - if (psid->stil->subtunes[nsubtune] != NULL) + for (size_t nsubtune = 0; nsubtune < psid->stil->nsubtunes; nsubtune++) { - SIDLibSTILSubTune *subtune = psid->stil->subtunes[nsubtune]; + SIDLibSTILSubTune *subtune = &psid->stil->subtunes[nsubtune]; for (int nfield = 0; nfield < STF_LAST; nfield++) nfieldcount += subtune->fields[nfield].ndata; } - for (int nsubtune = 0; nsubtune < psid->stil->nsubtunes; nsubtune++) - if (psid->stil->subtunes[nsubtune] != NULL) + for (size_t nsubtune = 0; nsubtune < psid->stil->nsubtunes; nsubtune++) { - SIDLibSTILSubTune *subtune = psid->stil->subtunes[nsubtune]; + SIDLibSTILSubTune *subtune = &psid->stil->subtunes[nsubtune]; int maxdata = 0; // For each subtune we need to check the max number of field data items @@ -1214,7 +1212,7 @@ if (nsubtune > 0) { snprintf(tmp, sizeof(tmp), "STIL#%d/%s", - nsubtune, sidlib_stil_fields[nfield]); + subtune->tune, sidlib_stil_fields[nfield]); } else { diff -r 8a489e5a81d7 -r ee56f1f2b528 sidlib.c --- a/sidlib.c Sat Jan 11 13:51:02 2020 +0200 +++ b/sidlib.c Sat Jan 11 14:25:23 2020 +0200 @@ -587,54 +587,47 @@ } -static int sidlib_stildb_entry_realloc(SIDLibSTILNode *node, +SIDLibSTILSubTune *sidlib_stildb_find_subtune(SIDLibSTILNode *node, const int nsubtune) +{ + for (size_t n = 0; n < node->nsubtunes; n++) + { + SIDLibSTILSubTune *subtune = &node->subtunes[n]; + if (subtune->tune == nsubtune) + return subtune; + } + return NULL; +} + + +static int sidlib_stildb_entry_realloc( + SIDLibSTILNode *node, const int nsubtune, const BOOL alloc, const int nfield, const char *fdata) { + SIDLibSTILSubTune *subtune; + if (node == NULL) return THERR_NULLPTR; - // Re-allocate subtunes pointers structure if needed - if (nsubtune > node->nsubtunes) + // Get subtune or allocate new + if ((subtune = sidlib_stildb_find_subtune(node, nsubtune)) == NULL) { - size_t clearIndex, clearLength; - - node->subtunes = (SIDLibSTILSubTune **) th_realloc( - node->subtunes, (nsubtune + 1) * sizeof(SIDLibSTILSubTune *)); + node->subtunes = (SIDLibSTILSubTune *) th_realloc( + node->subtunes, (node->nsubtunes + 1) * sizeof(SIDLibSTILSubTune)); if (node->subtunes == NULL) return THERR_MALLOC; - // Clear the newly allocated memory - if (node->nsubtunes == 0) - { - clearIndex = 0; - clearLength = nsubtune + 1; - } - else - { - clearIndex = node->nsubtunes + 1; - clearLength = nsubtune - clearIndex + 1; - } - - memset(&(node->subtunes[clearIndex]), 0, clearLength * sizeof(SIDLibSTILSubTune *)); - - node->nsubtunes = nsubtune; - } - - // Allocate memory for the specified subtune - if (alloc && node->subtunes[nsubtune] == NULL) - { - node->subtunes[nsubtune] = (SIDLibSTILSubTune *) th_malloc0(sizeof(SIDLibSTILSubTune)); - if (node->subtunes[nsubtune] == NULL) - return THERR_MALLOC; - + subtune = &node->subtunes[node->nsubtunes]; + memset(subtune, 0, sizeof(SIDLibSTILSubTune)); + subtune->tune = nsubtune; + node->nsubtunes++; } // Allocate field space, if needed if (alloc && nfield >= 0 && nfield < STF_LAST) { - SIDLibSTILField *field = &node->subtunes[nsubtune]->fields[nfield]; + SIDLibSTILField *field = &subtune->fields[nfield]; if ((field->data = th_realloc(field->data, (field->ndata + 1) * sizeof(char *))) == NULL) return THERR_MALLOC; @@ -651,21 +644,16 @@ { if (node != NULL) { - for (int nsubtune = 0; nsubtune <= node->nsubtunes; nsubtune++) + for (size_t nsubtune = 0; nsubtune < node->nsubtunes; nsubtune++) { - SIDLibSTILSubTune *subtune = node->subtunes[nsubtune]; - if (subtune != NULL) + SIDLibSTILSubTune *subtune = &node->subtunes[nsubtune]; + for (int nfield = 0; nfield < STF_LAST; nfield++) { - for (int nfield = 0; nfield < STF_LAST; nfield++) - { - SIDLibSTILField *field = &subtune->fields[nfield]; - for (int n = 0; n < field->ndata; n++) - th_free(field->data[n]); + SIDLibSTILField *field = &subtune->fields[nfield]; + for (int n = 0; n < field->ndata; n++) + th_free(field->data[n]); - th_free(field->data); - } - - th_free(subtune); + th_free(field->data); } } @@ -1080,7 +1068,14 @@ /* Compare two nodes */ -static int sidlib_stildb_cmp(const void *node1, const void *node2) +static int sidlib_stildb_compare_subtunes(const void *node1, const void *node2) +{ + return + ((SIDLibSTILSubTune *) node1)->tune - ((SIDLibSTILSubTune *) node2)->tune; +} + + +static int sidlib_stildb_compare_nodes(const void *node1, const void *node2) { // We assume here that we never ever get NULL-pointers or similar return strcmp( @@ -1118,10 +1113,15 @@ // Get node-pointers to table for (i = 0, node = dbh->nodes; node != NULL && i < dbh->nnodes; node = (SIDLibSTILNode *) node->node.next) + { dbh->pindex[i++] = node; + // Sort the subtunes + qsort(node->subtunes, node->nsubtunes, sizeof(SIDLibSTILSubTune), sidlib_stildb_compare_subtunes); + } + // Sort the indexes - qsort(dbh->pindex, dbh->nnodes, sizeof(SIDLibSTILNode *), sidlib_stildb_cmp); + qsort(dbh->pindex, dbh->nnodes, sizeof(SIDLibSTILNode *), sidlib_stildb_compare_nodes); } return THERR_OK; @@ -1136,7 +1136,7 @@ keyItem.filename = (char *) filename; key = &keyItem; - item = bsearch(&key, dbh->pindex, dbh->nnodes, sizeof(SIDLibSTILNode *), sidlib_stildb_cmp); + item = bsearch(&key, dbh->pindex, dbh->nnodes, sizeof(SIDLibSTILNode *), sidlib_stildb_compare_nodes); return item != NULL ? *item : NULL; } diff -r 8a489e5a81d7 -r ee56f1f2b528 sidlib.h --- a/sidlib.h Sat Jan 11 13:51:02 2020 +0200 +++ b/sidlib.h Sat Jan 11 14:25:23 2020 +0200 @@ -90,6 +90,7 @@ typedef struct { + int tune; // Subtune number this structure contains information for SIDLibSTILField fields[STF_LAST]; } SIDLibSTILSubTune; @@ -98,9 +99,9 @@ { th_llist_t node; - char *filename; - int nsubtunes; - SIDLibSTILSubTune **subtunes; + char *filename; // HVSC path/filename + size_t nsubtunes; // Number of subtune information structures + SIDLibSTILSubTune *subtunes; // Internal use only SIDLibSLDBNode *lengths; @@ -173,6 +174,7 @@ int sidlib_stildb_build_index(SIDLibSTILDB *dbh); void sidlib_stildb_free(SIDLibSTILDB *dbh); SIDLibSTILNode * sidlib_stildb_get_node(SIDLibSTILDB *dbh, const char *filename); +SIDLibSTILSubTune *sidlib_stildb_find_subtune(SIDLibSTILNode *node, const int nsubtune); #ifdef __cplusplus