shithub: rgbds

Download patch

ref: 359a048b6e235aab6e330fc6f85b118da0e9e046
parent: f2be601a137a145e7b56bb8c40768820d8cdd536
author: ISSOtm <[email protected]>
date: Mon Jan 13 10:25:25 EST 2020

Bump object version number
We're about to break the format, so let's do this

--- a/src/link/object.c
+++ b/src/link/object.c
@@ -427,6 +427,99 @@
 }
 
 /**
+ * Reads a RGB7 object file.
+ * @param file The file to read from
+ * @param fileName The filename to report in errors
+ */
+static void readRGB7File(FILE *file, char const *fileName)
+{
+	uint32_t nbSymbols;
+	uint32_t nbSections;
+
+	tryReadlong(nbSymbols, file, "%s: Cannot read number of symbols: %s",
+		    fileName);
+	tryReadlong(nbSections, file, "%s: Cannot read number of sections: %s",
+		    fileName);
+
+	nbSectionsToAssign += nbSections;
+
+	/* This file's symbols, kept to link sections to them */
+	struct Symbol **fileSymbols =
+		malloc(sizeof(*fileSymbols) * nbSymbols + 1);
+
+	if (!fileSymbols)
+		err(1, "Failed to get memory for %s's symbols", fileName);
+
+	struct SymbolList *symbolList = malloc(sizeof(*symbolList));
+
+	if (!symbolList)
+		err(1, "Failed to register %s's symbol list", fileName);
+	symbolList->symbolList = fileSymbols;
+	symbolList->nbSymbols = nbSymbols;
+	symbolList->next = symbolLists;
+	symbolLists = symbolList;
+
+	uint32_t nbSymPerSect[nbSections ? nbSections : 1];
+
+	memset(nbSymPerSect, 0, sizeof(nbSymPerSect));
+
+	verbosePrint("Reading %u symbols...\n", nbSymbols);
+	for (uint32_t i = 0; i < nbSymbols; i++) {
+		/* Read symbol */
+		struct Symbol *symbol = malloc(sizeof(*symbol));
+
+		if (!symbol)
+			err(1, "%s: Couldn't create new symbol", fileName);
+		readSymbol(file, symbol, fileName);
+
+		fileSymbols[i] = symbol;
+		if (symbol->type == SYMTYPE_EXPORT)
+			sym_AddSymbol(symbol);
+		if (symbol->sectionID != -1)
+			nbSymPerSect[symbol->sectionID]++;
+	}
+
+	/* This file's sections, stored in a table to link symbols to them */
+	struct Section *fileSections[nbSections ? nbSections : 1];
+
+	verbosePrint("Reading %u sections...\n", nbSections);
+	for (uint32_t i = 0; i < nbSections; i++) {
+		/* Read section */
+		struct Section *section = malloc(sizeof(*section));
+
+		if (!section)
+			err(1, "%s: Couldn't create new section", fileName);
+		readSection(file, section, fileName);
+		section->fileSymbols = fileSymbols;
+
+		sect_AddSection(section);
+		fileSections[i] = section;
+		if (nbSymPerSect[i]) {
+			section->symbols = malloc(sizeof(*section->symbols)
+							* nbSymPerSect[i]);
+			if (!section->symbols)
+				err(1, "%s: Couldn't link to symbols");
+		} else {
+			section->symbols = NULL;
+		}
+		section->nbSymbols = 0;
+	}
+
+	/* Give symbols pointers to their sections */
+	for (uint32_t i = 0; i < nbSymbols; i++) {
+		int32_t sectionID = fileSymbols[i]->sectionID;
+
+		if (sectionID == -1) {
+			fileSymbols[i]->section = NULL;
+		} else {
+			fileSymbols[i]->section = fileSections[sectionID];
+			/* Give the section a pointer to the symbol as well */
+			linkSymToSect(fileSymbols[i], fileSections[sectionID]);
+		}
+	}
+}
+
+/**
  * Reads an object file of any supported format
  * @param fileName The filename to report for errors
  */
@@ -446,16 +539,24 @@
 
 	if (matchedElems != 1)
 		errx(1, "\"%s\" is not a RGBDS object file", fileName);
-	/* TODO: support other versions? */
-	if (versionNumber != 6)
-		errx(1, "\"%s\" is an incompatible version %hhu object file",
-		     fileName, versionNumber);
 
 	verbosePrint("Reading object file %s, version %hhu\n",
 		     fileName, versionNumber);
 
-	readRGB6File(file, fileName);
+	switch (versionNumber) {
+	case 6:
+		readRGB6File(file, fileName);
+		break;
 
+	case 7:
+		readRGB7File(file, fileName);
+		break;
+
+	/* TODO: support older versions? */
+	default:
+		errx(1, "\"%s\" is an incompatible version %hhu object file",
+		     fileName, versionNumber);
+	}
 	fclose(file);
 }
 
--- a/src/rgbds.5
+++ b/src/rgbds.5
@@ -33,7 +33,7 @@
 .Bd -literal
 ; Header
 
-BYTE    ID[4]            ; "RGB6"
+BYTE    ID[4]            ; "RGB7"
 LONG    NumberOfSymbols  ; The number of symbols used in this file
 LONG    NumberOfSections ; The number of sections used in this file