changeset 311:ee56f1f2b528

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
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 11 Jan 2020 14:25:23 +0200
parents 8a489e5a81d7
children 1950bb04a69b
files sidinfo.c sidlib.c sidlib.h
diffstat 3 files changed, 57 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- 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
                             {
--- 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;
 }
--- 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