shithub: rgbds

Download patch

ref: 76331d1c4aa0c5b71b17a4a6471d54dd48bc5604
parent: 9e378ec5cfd5348f9bca89634686c247ca0f2cc5
parent: c389e8dccbd8cddc4c76a3e38b59d0eba3594342
author: Eldred Habert <eldredhabert0@gmail.com>
date: Sat Aug 22 20:11:54 EDT 2020

Merge pull request #552 from mattcurrie/incbin-length-optional

Make INCBIN's length argument optional

--- a/include/asm/section.h
+++ b/include/asm/section.h
@@ -57,7 +57,7 @@
 void out_RelWord(struct Expression *expr);
 void out_RelLong(struct Expression *expr);
 void out_PCRelByte(struct Expression *expr);
-void out_BinaryFile(char const *s);
+void out_BinaryFile(char const *s, int32_t startPos);
 void out_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length);
 
 void out_PushSection(void);
--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -1073,7 +1073,12 @@
 ;
 
 incbin		: T_POP_INCBIN string {
-			out_BinaryFile($2);
+			out_BinaryFile($2, 0);
+			if (oFailedOnMissingInclude)
+				YYACCEPT;
+		}
+		| T_POP_INCBIN string ',' const {
+			out_BinaryFile($2, $4);
 			if (oFailedOnMissingInclude)
 				YYACCEPT;
 		}
--- a/src/asm/rgbasm.5
+++ b/src/asm/rgbasm.5
@@ -1080,6 +1080,8 @@
 .Bd -literal -offset indent
 INCBIN "data.bin",78,256
 .Ed
+.Pp
+The length argument is optional. If only the start position is specified, the bytes from the start position until the end of the file will be included.
 .Ss Unions
 .Pp
 Unions allow multiple memory allocations to overlap, like unions in C.
--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -583,8 +583,14 @@
 /*
  * Output a binary file
  */
-void out_BinaryFile(char const *s)
+void out_BinaryFile(char const *s, int32_t startPos)
 {
+	if (startPos < 0) {
+		yyerror("Start position cannot be negative (%" PRId32 ")",
+			startPos);
+		startPos = 0;
+	}
+
 	FILE *f = fstk_FindFile(s, NULL);
 
 	if (!f) {
@@ -602,12 +608,21 @@
 	checkcodesection();
 	if (fseek(f, 0, SEEK_END) != -1) {
 		fsize = ftell(f);
-		rewind(f);
 
-		reserveSpace(fsize);
-	} else if (errno != ESPIPE) {
-		yyerror("Error determining size of INCBIN file '%s': %s", s,
-			strerror(errno));
+		if (startPos >= fsize) {
+			yyerror("Specified start position is greater than length of file");
+			return;
+		}
+
+		fseek(f, startPos, SEEK_SET);
+		reserveSpace(fsize - startPos);
+	} else {
+		if (errno != ESPIPE)
+			yyerror("Error determining size of INCBIN file '%s': %s",
+				s, strerror(errno));
+		/* The file isn't seekable, so we'll just skip bytes */
+		while (startPos--)
+			(void)fgetc(f);
 	}
 
 	while ((byte = fgetc(f)) != EOF) {