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:
parent
5ac11b5e88
commit
c8bf652982
@ -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
|
||||
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>\"</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>
|
||||
|
||||
Allow the use of instructions names as names for macros and symbols. This
|
||||
|
@ -65,6 +65,7 @@ static const char* const FeatureKeys[FEAT_COUNT] = {
|
||||
"underline_in_numbers",
|
||||
"addrsize",
|
||||
"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_ADDRSIZE: AddrSize = 1; break;
|
||||
case FEAT_BRACKET_AS_INDIRECT: BracketAsIndirect = 1; break;
|
||||
case FEAT_STRING_ESCAPES: StringEscapes = 1; break;
|
||||
default: /* Keep gcc silent */ break;
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,7 @@ typedef enum {
|
||||
FEAT_UNDERLINE_IN_NUMBERS,
|
||||
FEAT_ADDRSIZE,
|
||||
FEAT_BRACKET_AS_INDIRECT,
|
||||
FEAT_STRING_ESCAPES,
|
||||
|
||||
/* Special value: Number of features available */
|
||||
FEAT_COUNT
|
||||
|
@ -66,6 +66,7 @@ unsigned char DbgSyms = 0; /* Add debug symbols */
|
||||
unsigned char LineCont = 0; /* Allow line continuation */
|
||||
unsigned char LargeAlignment = 0; /* Don't warn about large alignments */
|
||||
unsigned char RelaxChecks = 0; /* Relax a few assembler checks */
|
||||
unsigned char StringEscapes = 0; /* Allow C-style escapes in strings */
|
||||
|
||||
/* Emulation features */
|
||||
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 AddrSize = 0; /* Allow .ADDRSIZE function */
|
||||
unsigned char BracketAsIndirect = 0; /* Use '[]' not '()' for indirection */
|
||||
|
||||
|
@ -68,6 +68,7 @@ extern unsigned char DbgSyms; /* Add debug symbols */
|
||||
extern unsigned char LineCont; /* Allow line continuation */
|
||||
extern unsigned char LargeAlignment; /* Don't warn about large alignments */
|
||||
extern unsigned char RelaxChecks; /* Relax a few assembler checks */
|
||||
extern unsigned char StringEscapes; /* Allow C-style escapes in strings */
|
||||
|
||||
/* Emulation features */
|
||||
extern unsigned char DollarIsPC; /* Allow the $ symbol as current PC */
|
||||
|
@ -794,6 +794,43 @@ static void ReadStringConst (int StringTerm)
|
||||
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 */
|
||||
SB_AppendChar (&CurTok.SVal, C);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user