changeset 484:81b92a0e754b

Clean up and modularize parsing of some options (specifying sections).
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 11 Nov 2012 13:05:04 +0200
parents f119ebe3ad25
children c1d5cccbf5b3
files objlink.c
diffstat 1 files changed, 103 insertions(+), 94 deletions(-) [+]
line wrap: on
line diff
--- a/objlink.c	Wed Nov 07 05:43:42 2012 +0200
+++ b/objlink.c	Sun Nov 11 13:05:04 2012 +0200
@@ -225,9 +225,107 @@
     return a->start - b->start;
 }
 
+
+BOOL dmParseSection(const char *arg, ssize_t *sectStart, ssize_t *sectEnd, ssize_t *sectLen)
+{
+    char sectMode, *sep, *str;
+    ssize_t tmpi;
+
+    // Define reserved section
+    // Create a copy of the argument
+    if ((str = dm_strdup(arg)) == NULL)
+    {
+        dmError("Could not allocate temporary string!\n");
+        exit(128);
+    }
+
+    // Get start address
+    if ((sep = strchr(str, '-')) == NULL &&
+        (sep = strchr(str, ':')) == NULL)
+    {
+        dmError("Section definition '%s' invalid.\n", arg);
+        goto error;
+    }
+    sectMode = *sep;
+    *sep = 0;
+
+    // Get value
+    if (!dmGetIntVal(str, sectStart))
+    {
+        dmError("Section start address '%s' in '%s' invalid.\n", str, arg);
+        goto error;
+    }
+
+    // Get end address or length
+    if (!dmGetIntVal(sep + 1, &tmpi))
+    {
+        dmError("Section %s '%s' in '%s' invalid.\n",
+            sectMode == '-' ? "end address" : "length",
+            sep + 1, arg);
+        goto error;
+    }
+
+    if (sectMode == ':')
+    {
+        *sectEnd = *sectStart + tmpi;
+        *sectLen = tmpi;
+    }
+    else
+    {
+        if (tmpi < *sectStart)
+        {
+            dmError("Section start address > end address in '%s'.\n",
+                arg);
+            goto error;
+        }
+        *sectLen = tmpi - *sectStart + 1;
+        *sectEnd = tmpi;
+    }
+
+    dmFree(str);
+    return TRUE;
+
+error:
+    dmFree(str);
+    return FALSE;
+}
+
+
+BOOL dmParseInputFile(char *arg, const int type1, const int type2, const char *desc, BOOL requireAddr)
+{
+    ssize_t tmpi = 0;
+    BOOL hasAddr = FALSE;
+    char *sep;
+
+    if ((sep = strrchr(arg, ':')) != NULL)
+    {
+        *sep = 0;
+        if (!dmGetIntVal(sep + 1, &tmpi))
+        {
+            dmError("Invalid %s address '%s' specified for '%s'.\n",
+                desc, sep + 1, arg);
+            return FALSE;
+        }
+        hasAddr = TRUE;
+    }
+    else
+    if (requireAddr)
+    {
+        dmError("No %s loading address specified for '%s'.\n", desc, arg);
+        return FALSE;
+    }
+
+    srcFiles[nsrcFiles].filename = arg;
+    srcFiles[nsrcFiles].type = hasAddr ? type1 : type2;
+    srcFiles[nsrcFiles].addr = tmpi;
+    nsrcFiles++;
+    return TRUE;
+}
+
+
 BOOL argHandleOpt(const int optN, char *optArg, char *currArg)
 {
-    char *p, *s;
+    char *p;
     ssize_t tmpi;
 
     switch (optN) {
@@ -238,48 +336,14 @@
 
     case 1:
         // Add RAW
-        if ((p = strrchr(optArg, ':')) != NULL)
-        {
-            *p = 0;
-            if (!dmGetIntVal(p + 1, &tmpi))
-            {
-                dmError("Invalid RAW address '%s' specified for '%s'.\n",
-                    p + 1, optArg);
-                return FALSE;
-            }
-        }
-        else
-        {
-            dmError("No RAW loading address specified for '%s'.\n", optArg);
+        if (!dmParseInputFile(optArg, STYPE_RAW, STYPE_RAW, "RAW", TRUE))
             return FALSE;
-        }
-        srcFiles[nsrcFiles].filename = optArg;
-        srcFiles[nsrcFiles].type = STYPE_RAW;
-        srcFiles[nsrcFiles].addr = tmpi;
-        nsrcFiles++;
         break;
 
     case 2:
         // Add PRG
-        if ((p = strrchr(optArg, ':')) != NULL)
-        {
-            *p = 0;
-            if (!dmGetIntVal(p + 1, &tmpi))
-            {
-                dmError("Invalid PRG address '%s' specified for '%s'.\n",
-                    p + 1, optArg);
-                return FALSE;
-            }
-            srcFiles[nsrcFiles].addr = tmpi;
-            srcFiles[nsrcFiles].type = STYPE_PRGA;
-        }
-        else
-        {
-            srcFiles[nsrcFiles].type = STYPE_PRG;
-        }
-
-        srcFiles[nsrcFiles].filename = optArg;
-        nsrcFiles++;
+        if (!dmParseInputFile(optArg, STYPE_PRGA, STYPE_PRG, "PRG", FALSE))
+            return FALSE;
         break;
 
     case 5:
@@ -362,63 +426,8 @@
     case 12:
         {
             ssize_t sectStart, sectEnd, sectLen;
-            char sectMode;
-            
-            // Define reserved section
-            // Create a copy of the argument
-            if ((s = dm_strdup(optArg)) == NULL)
-            {
-                dmError("Could not allocate temporary string!\n");
-                exit(128);
-            }
-
-            // Get start address
-            if ((p = strchr(s, '-')) == NULL &&
-                (p = strchr(s, ':')) == NULL)
-            {
-                dmFree(s);
-                dmError("Section definition '%s' invalid.\n", optArg);
-                return FALSE;
-            }
-            sectMode = *p;
-            *p = 0;
-
-            // Get value
-            if (!dmGetIntVal(s, &sectStart))
-            {
-                dmError("Section start address '%s' in '%s' invalid.\n", s, optArg);
-                dmFree(s);
+            if (!dmParseSection(optArg, &sectStart, &sectEnd, &sectLen))
                 return FALSE;
-            }
-
-            // Get end address or length
-            if (!dmGetIntVal(p + 1, &tmpi))
-            {
-                dmError("Section %s '%s' in '%s' invalid.\n",
-                    sectMode == '-' ? "end address" : "length",
-                    p, optArg);
-                dmFree(s);
-                return FALSE;
-            }
-
-            dmFree(s);
-
-            if (sectMode == ':')
-            {
-                sectEnd = sectStart + tmpi;
-                sectLen = tmpi;
-            }
-            else
-            {
-                if (tmpi < sectStart)
-                {
-                    dmError("Section start address > end address in '%s'.\n",
-                        optArg);
-                    return FALSE;
-                }
-                sectLen = tmpi - sectStart + 1;
-                sectEnd = tmpi;
-            }
 
             // Allocate memory block
             dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as 'Clear'\n",