fix plain C pascal strings

This commit is contained in:
Wolfgang Thaller 2023-07-04 23:30:47 +02:00
parent 281135ccfa
commit 4007b27d05
1 changed files with 17 additions and 1 deletions

View File

@ -7340,6 +7340,7 @@ c_parser_string_literal (c_parser *parser, bool translate, bool wide_ok)
location_t loc, last_tok_loc;
enum cpp_ttype type;
tree value, string_tree;
bool pascal_string = false;
tok = c_parser_peek_token (parser);
loc = tok->location;
@ -7420,11 +7421,23 @@ c_parser_string_literal (c_parser *parser, bool translate, bool wide_ok)
warning (OPT_Wtraditional,
"traditional C rejects string constant concatenation");
if (!strncmp((const char*)strs[0].text, "\"\\p", 3))
{
pascal_string = true;
/* replace \p by a valid escape sequence */
((unsigned char*)strs[0].text)[2] = 'n';
}
if ((type == CPP_STRING || wide_ok)
&& ((translate
? cpp_interpret_string : cpp_interpret_string_notranslate)
(parse_in, strs, count, &istr, type)))
{
if (pascal_string)
{
/* put the real string length in */
((unsigned char*)istr.text)[0] = (unsigned char) (istr.len - 2);
}
value = build_string (istr.len, (const char *) istr.text);
free (CONST_CAST (unsigned char *, istr.text));
if (count > 1)
@ -7475,7 +7488,10 @@ c_parser_string_literal (c_parser *parser, bool translate, bool wide_ok)
default:
case CPP_STRING:
case CPP_UTF8STRING:
TREE_TYPE (value) = char_array_type_node;
if (pascal_string)
TREE_TYPE (value) = uchar_array_type_node;
else
TREE_TYPE (value) = char_array_type_node;
break;
case CPP_STRING16:
TREE_TYPE (value) = char16_array_type_node;