Support character escapes in linkerscript strings

This allows linkerscripts to refer to section names even if
they contain special characters: '\r' '\n' '\t' '"' '\\'.
This commit is contained in:
Rangi
2021-04-26 11:40:58 -04:00
committed by Rangi
parent d17e9c663e
commit e27a6d53a0
4 changed files with 27 additions and 3 deletions

View File

@@ -19,7 +19,7 @@
#include "extern/err.h" #include "extern/err.h"
FILE * linkerScript; FILE *linkerScript;
char *includeFileName; char *includeFileName;
static uint32_t lineNo; static uint32_t lineNo;
@@ -223,12 +223,28 @@ static struct LinkerScriptToken *nextToken(void)
do { do {
curchar = readChar(linkerScript); curchar = readChar(linkerScript);
if (curchar == EOF || isNewline(curchar)) if (curchar == EOF || isNewline(curchar)) {
errx(1, "%s(%" PRIu32 "): Unterminated string", errx(1, "%s(%" PRIu32 "): Unterminated string",
linkerScriptName, lineNo); linkerScriptName, lineNo);
else if (curchar == '"') } else if (curchar == '"') {
/* Quotes force a string termination */ /* Quotes force a string termination */
curchar = '\0'; curchar = '\0';
} else if (curchar == '\\') {
/* Backslashes are escape sequences */
curchar = readChar(linkerScript);
if (curchar == EOF || isNewline(curchar))
errx(1, "%s(%" PRIu32 "): Unterminated string",
linkerScriptName, lineNo);
else if (curchar == 'n')
curchar = '\n';
else if (curchar == 'r')
curchar = '\r';
else if (curchar == 't')
curchar = '\t';
else if (curchar != '\\' && curchar != '"')
errx(1, "%s(%" PRIu32 "): Illegal character escape",
linkerScriptName, lineNo);
}
if (size >= capacity || token.attr.string == NULL) { if (size >= capacity || token.attr.string == NULL) {
capacity *= 2; capacity *= 2;

View File

@@ -0,0 +1,3 @@
ROM0
"A\"B\tC\rD\nE"
"in\{valid"

View File

@@ -0,0 +1 @@
error: ./linkerscript-escapes-test.link(3): Illegal character escape

View File

@@ -0,0 +1,4 @@
SECTION "A\"B\tC\rD\nE", ROM0
DS $1000
SECTION "in\{valid", ROM0
DS $1000