# HG changeset patch # User Matti Hamalainen # Date 1527761924 -10800 # Node ID 7b0c76cd7686c196d4e316748575c105c013e609 # Parent bddedc2e0ebb33d236996b12ce166c014dcb9b42 Clean up and improve error handling. diff -r bddedc2e0ebb -r 7b0c76cd7686 tools/objlink.c --- a/tools/objlink.c Thu May 31 13:08:09 2018 +0300 +++ b/tools/objlink.c Thu May 31 13:18:44 2018 +0300 @@ -200,13 +200,13 @@ /* Memory block handling */ -void reserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType) +BOOL dmReserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType) { if (startAddr > endAddr) { dmErrorMsg("ERROR! Block '%s' has startAddr=$%.4x > endAddr=$%.4x!\n", blockName, startAddr, endAddr); - exit(4); + return FALSE; } if (nmemBlocks < MAX_FILENAMES) @@ -216,17 +216,18 @@ memBlocks[nmemBlocks].name = dm_strdup(blockName); memBlocks[nmemBlocks].type = blockType; nmemBlocks++; + return TRUE; } else { dmErrorMsg("Maximum number of memBlock definitions (%d) exceeded!\n", MAX_FILENAMES); - exit(4); + return FALSE; } } -int compareMemBlock(const void *cva, const void *cvb) +int dmCompareMemBlock(const void *cva, const void *cvb) { const DMMemBlock *a = cva, *b = cvb; return a->start - b->start; @@ -237,13 +238,14 @@ { char sectMode, *sep, *str, *namesep; unsigned int tmpi; + BOOL res = FALSE; // Define reserved section // Create a copy of the argument if ((str = dm_strdup(arg)) == NULL) { dmErrorMsg("Could not allocate temporary string!\n"); - exit(128); + goto out; } // Get start address @@ -251,7 +253,7 @@ (sep = strchr(str, ':')) == NULL) { dmErrorMsg("Section definition '%s' invalid.\n", arg); - goto error; + goto out; } sectMode = *sep; *sep = 0; @@ -260,7 +262,7 @@ if (!dmGetIntVal(str, sectStart)) { dmErrorMsg("Section start address '%s' in '%s' invalid.\n", str, arg); - goto error; + goto out; } // Check for name @@ -273,7 +275,7 @@ { dmErrorMsg("Section definition '%s' name is empty. Either specify name or leave it out.\n", arg); - goto error; + goto out; } *sectName = dm_strdup(namesep); } @@ -282,7 +284,7 @@ { dmErrorMsg("Section definition does not allow a name, syntax error in '%s' at '%s'.\n", arg, namesep); - goto error; + goto out; } // Get end address or length @@ -291,7 +293,7 @@ dmErrorMsg("Section %s '%s' in '%s' invalid.\n", sectMode == '-' ? "end address" : "length", sep + 1, arg); - goto error; + goto out; } if (sectMode == ':') @@ -304,17 +306,16 @@ { dmErrorMsg("Section start address > end address in '%s'.\n", arg); - goto error; + goto out; } *sectEnd = tmpi; } - dmFree(str); - return TRUE; + res = TRUE; -error: +out: dmFree(str); - return FALSE; + return res; } @@ -462,7 +463,8 @@ dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as '%s'\n", sectStart, sectEnd, sectLen, sectLen, sectName); - reserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES); + if (!dmReserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES)) + return FALSE; } break; @@ -569,7 +571,8 @@ dmPrint(1, " .. OK\n"); // Add to list of blocks - reserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES); + if (!dmReserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES)) + res = DMERR_MALLOC; out: if (fh != NULL) @@ -625,7 +628,8 @@ dmPrint(1, " .. OK\n"); // Add info to list - reserveMemBlock(destAddr, endAddr, filename, MTYPE_RES); + if (!dmReserveMemBlock(destAddr, endAddr, filename, MTYPE_RES)) + res = DMERR_MALLOC; out: if (fh != NULL) @@ -784,12 +788,12 @@ // Parse arguments if (!dmArgsProcess(argc, argv, optList, optListN, argHandleOpt, NULL, OPTH_BAILOUT)) - exit(1); + goto out; if (nsrcFiles < 1) { dmErrorMsg("Nothing to do. (try --help)\n"); - exit(0); + goto out; } // Allocate memory @@ -797,11 +801,10 @@ dmMsg(1, "Using memory model #%d '%s', %d bytes.\n", optMemModel, memModel->name, memModel->size); - memory = (Uint8 *) dmMalloc(memModel->size + 32); - if (memory == NULL) + if ((memory = (Uint8 *) dmMalloc(memModel->size + 32)) == NULL) { - dmErrorMsg("Could not allocate memory.\n"); - exit(2); + dmErrorMsg("Could not allocate memory for memory model!\n"); + goto out; } // Initialize memory @@ -853,15 +856,16 @@ dmMsg(1, "Applying memory model restrictions...\n"); for (int i = 0; i < memModel->nmemBlocks; i++) { - reserveMemBlock( + if (!dmReserveMemBlock( memModel->memBlocks[i].start, memModel->memBlocks[i].end, memModel->memBlocks[i].name, - memModel->memBlocks[i].type); + memModel->memBlocks[i].type)) + goto out; } // Sort the blocks - qsort(memBlocks, nmemBlocks, sizeof(DMMemBlock), compareMemBlock); + qsort(memBlocks, nmemBlocks, sizeof(DMMemBlock), dmCompareMemBlock); // Check for overlapping conflicts hasOverlaps = FALSE; @@ -886,7 +890,7 @@ if (!optAllowOverlap && hasOverlaps) { dmErrorMsg("Error occured, overlaps not allowed.\n"); - exit(5); + goto out; } // Find out start and end-addresses @@ -909,8 +913,9 @@ if (startAddr >= memModel->size || endAddr < startAddr) { - dmErrorMsg("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n", startAddr, endAddr); - exit(8); + dmErrorMsg("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n", + startAddr, endAddr); + goto out; } // Output linkfile @@ -922,7 +927,7 @@ int err = dmGetErrno(); dmErrorMsg("Error creating file '%s' #%d: %s.\n", optLinkFileName, err, dmErrorStr(err)); - exit(1); + goto out; } switch (optLinkFileFormat) @@ -973,7 +978,7 @@ int err = dmGetErrno(); dmErrorMsg("Error creating output file '%s' #%d: %s.\n", optDestName, err, dmErrorStr(err)); - exit(1); + goto out; } else dmPrint(1, "to '%s'\n", optDestName); @@ -1001,13 +1006,16 @@ int err = dmGetErrno(); dmErrorMsg("Error writing to file #%d: %s.\n", err, dmErrorStr(err)); + goto out; } - fclose(dfile); + // Describe the memory layout + if (optDescribe) + dmDescribeMemory(dfile != stdout ? stdout : stderr); - // Describe - if (optDescribe) - dmDescribeMemory(stdout); +out: + if (dfile != NULL && dfile != stdout) + fclose(dfile); return 0; }