# HG changeset patch # User Matti Hamalainen # Date 1353154902 -7200 # Node ID b02f1bfce53b57ffb4b457029e0b629ff96221e1 # Parent 966617f0f6cd7de8036d9949ff2d203298f6f252 Improve and clean up section parsing support. diff -r 966617f0f6cd -r b02f1bfce53b objlink.c --- a/objlink.c Sat Nov 17 01:52:59 2012 +0200 +++ b/objlink.c Sat Nov 17 14:21:42 2012 +0200 @@ -22,7 +22,6 @@ ssize_t start, end; // Start and end address int type; // Type char *name; // Name of the block - ssize_t size; int placement; } DMMemBlock; @@ -80,28 +79,28 @@ */ const DMMemModel memoryModels[] = { { "C64 unrestricted", "$01 = $34", (64*1024), 0, { - { 0, 0, 0, NULL, 0, 0 } + { 0, 0, 0, NULL, 0 } }}, { "C64 normal (IO+Basic+Kernal)", "$01 = $37", (64*1024), 3, { - { 0xA000, 0xBFFF, MTYPE_ROM_WT, "Basic ROM", 0, PLACE_STATIC }, - { 0xD000, 0xDFFF, MTYPE_IO, "I/O", 0, PLACE_STATIC }, - { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", 0, PLACE_STATIC }, + { 0xA000, 0xBFFF, MTYPE_ROM_WT, "Basic ROM", PLACE_STATIC }, + { 0xD000, 0xDFFF, MTYPE_IO, "I/O", PLACE_STATIC }, + { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", PLACE_STATIC }, }}, { "C64 modified (IO+Kernal)", "$01 = $36", (64*1024), 2, { - { 0xD000, 0xDFFF, MTYPE_IO, "I/O", 0, PLACE_STATIC }, - { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", 0, PLACE_STATIC }, + { 0xD000, 0xDFFF, MTYPE_IO, "I/O", PLACE_STATIC }, + { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", PLACE_STATIC }, }}, { "C64 modified (IO only)", "$01 = $35", (64*1024), 1, { - { 0xD000, 0xDFFF, MTYPE_IO, "I/O", 0, PLACE_STATIC }, + { 0xD000, 0xDFFF, MTYPE_IO, "I/O", PLACE_STATIC }, }}, { "C64 modified (Char+Kernal+Basic)", "$01 = $33", (64*1024), 3, { - { 0xA000, 0xBFFF, MTYPE_ROM_WT, "Basic ROM", 0, PLACE_STATIC }, - { 0xD000, 0xDFFF, MTYPE_ROM, "Char ROM", 0, PLACE_STATIC }, - { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", 0, PLACE_STATIC }, + { 0xA000, 0xBFFF, MTYPE_ROM_WT, "Basic ROM", PLACE_STATIC }, + { 0xD000, 0xDFFF, MTYPE_ROM, "Char ROM", PLACE_STATIC }, + { 0xE000, 0xFFFF, MTYPE_ROM_WT, "Kernal ROM", PLACE_STATIC }, }}, /* @@ -146,7 +145,7 @@ { 0, '?', "help", "Show this help", OPT_NONE }, { 1, 'r', "input-raw", "RAW input: -r :", OPT_ARGREQ }, { 2, 'p', "input-prg", "PRG input: -p [:]", OPT_ARGREQ }, - { 12, 's', "section", "Reserved section: -s - or :", OPT_ARGREQ }, + { 12, 's', "section", "Reserved section: -s -[,name] or :[,name]", OPT_ARGREQ }, { 5, 'o', "output", "Specify output file, -o ", OPT_ARGREQ }, { 6, 'O', "overlap", "Allow overlapping memory areas", OPT_NONE }, { 7, 'm', "model", "Set memory model", OPT_ARGREQ }, @@ -207,10 +206,9 @@ if (nmemBlocks < MAX_FILENAMES) { memBlocks[nmemBlocks].start = startAddr; - memBlocks[nmemBlocks].end = endAddr; - memBlocks[nmemBlocks].size = (endAddr - startAddr + 1); - memBlocks[nmemBlocks].name = dm_strdup(blockName); - memBlocks[nmemBlocks].type = blockType; + memBlocks[nmemBlocks].end = endAddr; + memBlocks[nmemBlocks].name = dm_strdup(blockName); + memBlocks[nmemBlocks].type = blockType; nmemBlocks++; } else @@ -229,9 +227,9 @@ } -BOOL dmParseSection(const char *arg, ssize_t *sectStart, ssize_t *sectEnd, ssize_t *sectLen) +BOOL dmParseSection(const char *arg, ssize_t *sectStart, ssize_t *sectEnd, char **sectName, BOOL canHasName) { - char sectMode, *sep, *str; + char sectMode, *sep, *str, *namesep; ssize_t tmpi; // Define reserved section @@ -258,6 +256,28 @@ dmError("Section start address '%s' in '%s' invalid.\n", str, arg); goto error; } + + // Check for name + namesep = strchr(sep + 1, ','); + if (canHasName && namesep != NULL) + { + *namesep = 0; + namesep++; + if (*namesep == 0) + { + dmError("Section definition '%s' name is empty. Either specify name or leave it out.\n", + arg); + goto error; + } + *sectName = dm_strdup(namesep); + } + else + if (namesep != NULL) + { + dmError("Section definition does not allow a name, syntax error in '%s' at '%s'.\n", + arg, namesep); + goto error; + } // Get end address or length if (!dmGetIntVal(sep + 1, &tmpi)) @@ -270,8 +290,7 @@ if (sectMode == ':') { - *sectEnd = *sectStart + tmpi; - *sectLen = tmpi; + *sectEnd = *sectStart + tmpi - 1; } else { @@ -281,7 +300,6 @@ arg); goto error; } - *sectLen = tmpi - *sectStart + 1; *sectEnd = tmpi; } @@ -428,24 +446,27 @@ case 12: { + char *sectName = "Clear"; ssize_t sectStart, sectEnd, sectLen; - if (!dmParseSection(optArg, §Start, §End, §Len)) + if (!dmParseSection(optArg, §Start, §End, §Name, TRUE)) return FALSE; // Allocate memory block - dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as 'Clear'\n", - sectStart, sectEnd, sectLen, sectLen); + sectLen = sectEnd - sectStart + 1; + dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as '%s'\n", + sectStart, sectEnd, sectLen, sectLen, sectName); - reserveMemBlock(sectStart, sectEnd, "Clear", MTYPE_RES); + reserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES); } break; case 13: { - ssize_t cropLen; - if (!dmParseSection(optArg, &optCropStart, &optCropEnd, &cropLen)) + size_t cropLen; + if (!dmParseSection(optArg, &optCropStart, &optCropEnd, NULL, FALSE)) return FALSE; + cropLen = optCropEnd - optCropEnd + 1; dmMsg(1, "Cutting output to $%.4x - $%.4x ($%x, %d bytes)\n", optCropStart, optCropEnd, cropLen, cropLen);