changeset 1333:17c23f0494f5

Possibly make dupe pattern elimination work. Still needs some testing.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 22 Aug 2017 14:04:32 +0300
parents f70d89721e19
children ea9ab5b84985
files tools/xm2jss.c
diffstat 1 files changed, 24 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/tools/xm2jss.c	Tue Aug 22 13:53:29 2017 +0300
+++ b/tools/xm2jss.c	Tue Aug 22 14:04:32 2017 +0300
@@ -1,7 +1,7 @@
 /*
  * xm2jss - Convert XM module to JSSMOD
  * Programmed and designed by Matti 'ccr' Hamalainen
- * (C) Copyright 2006-2009 Tecnic Software productions (TNSP)
+ * (C) Copyright 2006-2017 Tecnic Software productions (TNSP)
  *
  * Please read file 'COPYING' for information on license and distribution.
  */
@@ -786,7 +786,9 @@
          usedChannels[jsetMaxChannels];
     int  mapExtInstruments[jsetMaxInstruments + 1],
          mapInstruments[jsetMaxInstruments + 1],
-         mapPatterns[jsetMaxPatterns + 1];
+         mapPatterns[jsetMaxPatterns + 1],
+         dupPatterns[jsetMaxPatterns + 1];
+
     JSSModule *r = NULL;
     int n8, n16, nunused, ndupes;
 
@@ -825,6 +827,7 @@
     {
         usedPatterns[i] = FALSE;
         mapPatterns[i]  = jsetNotSet;
+        dupPatterns[i]  = jsetNotSet;
     }
 
     //
@@ -909,6 +912,7 @@
     for (int pat1 = 0; pat1 <= jsetMaxPatterns; pat1++)
     if (usedPatterns[pat1])
     {
+        // Sanity check patterns
         if (pat1 >= m->npatterns)
         {
             dmErrorMsg("Pattern 0x%x >= 0x%x, but used!\n", pat1, m->npatterns);
@@ -921,6 +925,24 @@
             continue;
         }
 
+        // Check for previously marked dupes
+        if (dupPatterns[pat1] != jsetNotSet)
+        {
+            mapPatterns[pat1] = dupPatterns[pat1];
+            continue;
+        }
+
+        // Check for duplicate patterns of "pat1" and mark them as such
+        for (int pat2 = 0; pat2 < m->npatterns; pat2++)
+        if (pat1 != pat2 && m->patterns[pat2] != NULL &&
+            dupPatterns[pat2] != jsetNotSet &&
+            comparePattern(m->patterns[pat1], m->patterns[pat2]))
+        {
+            dmPrint(1, " * %d and %d are dupes.\n", pat1, pat2);
+            dupPatterns[pat2] = pat1;
+            ndupes++;
+        }
+
         mapPatterns[pat1] = r->npatterns;
         r->patterns[r->npatterns] = m->patterns[pat1];
         (r->npatterns)++;
@@ -1086,17 +1108,6 @@
     }
 
     //
-    // Check for duplicate patterns ..
-    //
-    dmMsg(1, "Checking for duplicate patterns ...\n");
-    for (int pat1 = 0; pat1 < r->npatterns; pat1++)
-    for (int pat2 = 0; pat2 < r->npatterns; pat2++)
-    if (pat1 != pat2 && comparePattern(r->patterns[pat1], r->patterns[pat2]))
-    {
-        dmPrint(1, " * %d and %d are dupes.\n");
-    }
-
-    //
     // Remap orders list
     //
     dmMsg(1, "Remapping orders list.\n");