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

Make INCBIN's length argument optional
This commit is contained in:
Eldred Habert
2020-08-23 00:11:54 +02:00
committed by GitHub
4 changed files with 30 additions and 8 deletions

View File

@@ -1073,7 +1073,12 @@ include : T_POP_INCLUDE string {
;
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;
}

View File

@@ -1080,6 +1080,8 @@ The example below includes 256 bytes from data.bin, starting from byte 78.
.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.

View File

@@ -583,8 +583,14 @@ void out_PCRelByte(struct Expression *expr)
/*
* 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 @@ void out_BinaryFile(char const *s)
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) {