changeset 1365:60d7240e1a63

Remove hardcoded encoding/decoding operator counts from the structures, use a sentinel instead.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 23 Sep 2017 01:20:07 +0300
parents 0d61895e1763
children d4387509a363
files tools/lib64gfx.c tools/lib64gfx.h
diffstat 2 files changed, 26 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/tools/lib64gfx.c	Fri Sep 22 23:00:32 2017 +0300
+++ b/tools/lib64gfx.c	Sat Sep 23 01:20:07 2017 +0300
@@ -362,12 +362,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         fmtProbeDrazPaint20Packed, fmtDecodeDrazPaintPacked,
         NULL, NULL, NULL,
-        4,
         {
             { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0800, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -377,7 +377,6 @@
         C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
         fmtProbeDrazLace10Packed, fmtDecodeDrazPaintPacked,
         NULL, NULL, NULL,
-        6,
         {
             { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0800, 0,  0, NULL, NULL },
@@ -385,6 +384,7 @@
             { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
             { DT_BITMAP,       0x2800, 1,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x2742, 0,  1, fmtDrazLaceSetLaceType, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -394,12 +394,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        4,
         {
             { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0800, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -409,7 +409,6 @@
         C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        6,
         {
             { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0800, 0,  0, NULL, NULL },
@@ -417,6 +416,7 @@
             { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
             { DT_BITMAP,       0x2800, 1,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x2742, 0,  1, fmtDrazLaceSetLaceType, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -426,7 +426,6 @@
         C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        6,
         {
             { DT_SCREEN_RAM,   0x0000, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x03e8, 0,  DC_BGCOL, NULL, NULL },
@@ -435,6 +434,7 @@
             { DT_SCREEN_RAM,   0x4400, 1,  0, NULL, NULL },
             { DT_COLOR_RAM,    0x4800, 0,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x0000, 0,  0, fmtTruePaintSetLaceType, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -444,12 +444,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        4,
         {
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
             { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -459,12 +459,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        4,
         {
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
             { DT_COLOR_RAM,    0x2338, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2329, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -474,12 +474,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         fmtProbeAmicaPaintPacked, fmtDecodeAmicaPaintPacked,
         NULL, NULL, NULL,
-        4,
         {
             { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -489,12 +489,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        4,
         {
             { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
             { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -504,10 +504,10 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        2,
         {
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -517,10 +517,10 @@
         C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        2,
         {
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -530,10 +530,10 @@
         C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        2,
         {
             { DT_SCREEN_RAM,   0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0400, 0,  0, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -543,7 +543,6 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        11,
         {
             { DT_COLOR_RAM,    0x0100, 0,  0, NULL, NULL },
 
@@ -559,6 +558,7 @@
 
             { DT_BITMAP,       0x2500, 0,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK,  0, fmtSetFLIType, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -568,7 +568,6 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        11,
         {
             { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
@@ -581,6 +580,7 @@
             { DT_SCREEN_RAM,   0x2000, 7,  0, NULL, NULL },
             { DT_BITMAP,       0x2400, 0,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK,  0, fmtSetFLIType, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -590,12 +590,12 @@
         C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
         NULL, NULL,
         NULL, NULL, NULL,
-        4,
         {
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x2000, 0,  0, NULL, NULL },
             { DT_COLOR_RAM,    0x2400, 0,  0, NULL, NULL },
             { DT_COLOR_SET,    0x00  , 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 
@@ -610,13 +610,13 @@
         XX2_WIDTH_CH    , XX2_HEIGHT_CH,
         fmtProbeFormatXX2, fmtDecodeFormatXX2,
         NULL, NULL, NULL,
-        4,
         {
             { DT_BITMAP,       0x0000, 0,  XX2_BSIZE, NULL, NULL },
             { DT_COLOR_RAM,    XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE, NULL, NULL },
             { DT_SCREEN_RAM,   XX2_BSIZE, 0,  XX2_SIZE, NULL, NULL },
 
             { DT_COLOR_SET,    11  , 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
         }
     },
 };
@@ -734,17 +734,9 @@
 int dmC64DecodeGenericBMP(DMC64Image *img, const Uint8 *buf,
     const size_t len, const DMC64ImageFormat *fmt)
 {
-    int i;
-
     if (buf == NULL || img == NULL || fmt == NULL)
         return DMERR_NULLPTR;
 
-    if (fmt->nencdecOps < 0 || fmt->nencdecOps >= D64_MAX_ENCDEC_OPS)
-    {
-        return dmError(DMERR_INTERNAL,
-            "Invalid number of enc/dec ops in format. Internal error.\n");
-    }
-
     // Clear the image structure, set basics
     img->type      = fmt->type;
     img->width     = fmt->width;
@@ -753,12 +745,15 @@
     img->ch_height = fmt->ch_height;
 
     // Perform decoding
-    for (i = 0; i < fmt->nencdecOps; i++)
+    for (int i = 0; i < D64_MAX_ENCDEC_OPS; i++)
     {
         const DMC64EncDecOp *op = &fmt->encdecOps[i];
         const Uint8 *src;
         size_t size;
         int res;
+        // Check for last operator
+        if (op->type == DT_LAST)
+            break;
 
         // Check operation validity
         if ((res = dmC64SanityCheckEncDecOp(i, op)) != DMERR_OK)
@@ -875,19 +870,13 @@
 
 int dmC64EncodeGenericBMP(Uint8 **pbuf, size_t *plen, const DMC64Image *img, const DMC64ImageFormat *fmt)
 {
-    int i, res = DMERR_OK;
+    int res = DMERR_OK;
     Uint8 *buf;
     size_t allocated;
 
     if (pbuf == NULL || plen == NULL || img == NULL || fmt == NULL)
         return DMERR_NULLPTR;
 
-    if (fmt->nencdecOps < 0 || fmt->nencdecOps >= D64_MAX_ENCDEC_OPS)
-    {
-        return dmError(DMERR_INTERNAL,
-            "Invalid number of enc/dec ops in format. Internal error.\n");
-    }
-
     // Allocate the output buffer
     *plen = 0;
     if (fmt->size > 0)
@@ -904,12 +893,16 @@
     }
 
     // Perform encoding
-    for (i = 0; i < fmt->nencdecOps; i++)
+    for (int i = 0; i < D64_MAX_ENCDEC_OPS; i++)
     {
         const DMC64EncDecOp *op = &fmt->encdecOps[i];
         Uint8 *dst = 2 + buf + op->offs;
         size_t size, chksize;
 
+        // Check for last operator
+        if (op->type == DT_LAST)
+            break;
+
         // Check operation validity
         if ((res = dmC64SanityCheckEncDecOp(i, op)) != DMERR_OK)
             goto error;
--- a/tools/lib64gfx.h	Fri Sep 22 23:00:32 2017 +0300
+++ b/tools/lib64gfx.h	Sat Sep 23 01:20:07 2017 +0300
@@ -180,7 +180,6 @@
     int  (*convertFrom)(DMImage *, const DMC64Image *);
     int  (*convertTo)(DMImage *, DMC64Image *);
 
-    int nencdecOps;
     DMC64EncDecOp encdecOps[D64_MAX_ENCDEC_OPS];
 } DMC64ImageFormat;