1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00

ca65: Add string_escapes feature. Resolves #535

This commit is contained in:
Joshua Bell 2019-01-05 11:29:54 -08:00
parent 5ac11b5e88
commit c8bf652982
6 changed files with 60 additions and 1 deletions

View File

@ -2831,6 +2831,24 @@ Here's a list of all control commands and a description, what they do:
removing the lines with the assignments may also be an option when porting removing the lines with the assignments may also be an option when porting
code written for older assemblers). code written for older assemblers).
<tag><tt>string_escapes</tt><label id="string_escapes"></tag>
Allow C-style backslash escapes within string constants to embed
special characters. The following escapes are accepted:
<itemize>
<item><tt>\\</tt> backslash (<tt>$5C</tt>)
<item><tt>\'</tt> single quote (<tt>$27</tt>)
<item><tt>\&quot;</tt> double quote (<tt>$22</tt>)
<item><tt>\t</tt> tab (<tt>$09</tt>)
<item><tt>\r</tt> carriage return (<tt>$0D</tt>)
<item><tt>\n</tt> newline (<tt>$0A</tt>)
<item><tt>\xNN</tt> (<tt>$NN</tt>)
</itemize>
Note that <tt>\n</tt> maps to ASCII <tt>$0A</tt>, not a platform specific
line ending character.
<tag><tt>ubiquitous_idents</tt><label id="ubiquitous_idents"></tag> <tag><tt>ubiquitous_idents</tt><label id="ubiquitous_idents"></tag>
Allow the use of instructions names as names for macros and symbols. This Allow the use of instructions names as names for macros and symbols. This

View File

@ -65,6 +65,7 @@ static const char* const FeatureKeys[FEAT_COUNT] = {
"underline_in_numbers", "underline_in_numbers",
"addrsize", "addrsize",
"bracket_as_indirect", "bracket_as_indirect",
"string_escapes",
}; };
@ -123,6 +124,7 @@ feature_t SetFeature (const StrBuf* Key)
case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break; case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break;
case FEAT_ADDRSIZE: AddrSize = 1; break; case FEAT_ADDRSIZE: AddrSize = 1; break;
case FEAT_BRACKET_AS_INDIRECT: BracketAsIndirect = 1; break; case FEAT_BRACKET_AS_INDIRECT: BracketAsIndirect = 1; break;
case FEAT_STRING_ESCAPES: StringEscapes = 1; break;
default: /* Keep gcc silent */ break; default: /* Keep gcc silent */ break;
} }

View File

@ -67,6 +67,7 @@ typedef enum {
FEAT_UNDERLINE_IN_NUMBERS, FEAT_UNDERLINE_IN_NUMBERS,
FEAT_ADDRSIZE, FEAT_ADDRSIZE,
FEAT_BRACKET_AS_INDIRECT, FEAT_BRACKET_AS_INDIRECT,
FEAT_STRING_ESCAPES,
/* Special value: Number of features available */ /* Special value: Number of features available */
FEAT_COUNT FEAT_COUNT

View File

@ -66,6 +66,7 @@ unsigned char DbgSyms = 0; /* Add debug symbols */
unsigned char LineCont = 0; /* Allow line continuation */ unsigned char LineCont = 0; /* Allow line continuation */
unsigned char LargeAlignment = 0; /* Don't warn about large alignments */ unsigned char LargeAlignment = 0; /* Don't warn about large alignments */
unsigned char RelaxChecks = 0; /* Relax a few assembler checks */ unsigned char RelaxChecks = 0; /* Relax a few assembler checks */
unsigned char StringEscapes = 0; /* Allow C-style escapes in strings */
/* Emulation features */ /* Emulation features */
unsigned char DollarIsPC = 0; /* Allow the $ symbol as current PC */ unsigned char DollarIsPC = 0; /* Allow the $ symbol as current PC */
@ -84,4 +85,3 @@ unsigned char ForceRange = 0; /* Force values into expected range */
unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */ unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */
unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */ unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */
unsigned char BracketAsIndirect = 0; /* Use '[]' not '()' for indirection */ unsigned char BracketAsIndirect = 0; /* Use '[]' not '()' for indirection */

View File

@ -68,6 +68,7 @@ extern unsigned char DbgSyms; /* Add debug symbols */
extern unsigned char LineCont; /* Allow line continuation */ extern unsigned char LineCont; /* Allow line continuation */
extern unsigned char LargeAlignment; /* Don't warn about large alignments */ extern unsigned char LargeAlignment; /* Don't warn about large alignments */
extern unsigned char RelaxChecks; /* Relax a few assembler checks */ extern unsigned char RelaxChecks; /* Relax a few assembler checks */
extern unsigned char StringEscapes; /* Allow C-style escapes in strings */
/* Emulation features */ /* Emulation features */
extern unsigned char DollarIsPC; /* Allow the $ symbol as current PC */ extern unsigned char DollarIsPC; /* Allow the $ symbol as current PC */

View File

@ -794,6 +794,43 @@ static void ReadStringConst (int StringTerm)
break; break;
} }
if (C == '\\' && StringEscapes) {
NextChar ();
switch (C) {
case EOF:
Error ("Unterminated escape sequence in string constant");
break;
case '\\':
case '\'':
case '"':
break;
case 't':
C = '\x09';
break;
case 'r':
C = '\x0D';
break;
case 'n':
C = '\x0A';
break;
case 'x':
NextChar ();
if (IsXDigit (C)) {
char high_nibble = DigitVal (C) << 4;
NextChar ();
if (IsXDigit (C)) {
C = high_nibble | DigitVal (C);
break;
}
}
/* otherwise, fall through */
default:
Error ("Unsupported escape sequence in string constant");
break;
}
}
/* Append the char to the string */ /* Append the char to the string */
SB_AppendChar (&CurTok.SVal, C); SB_AppendChar (&CurTok.SVal, C);