# HG changeset patch # User Matti Hamalainen # Date 1352631904 -7200 # Node ID 81b92a0e754bc95ab78384bacad0ba3041ffe001 # Parent f119ebe3ad25ec7c524527da6bc09f483c80f373 Clean up and modularize parsing of some options (specifying sections). diff -r f119ebe3ad25 -r 81b92a0e754b objlink.c --- 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, §Start)) - { - dmError("Section start address '%s' in '%s' invalid.\n", s, optArg); - dmFree(s); + if (!dmParseSection(optArg, §Start, §End, §Len)) 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",