diff options
author | Devang Patel <dpatel@apple.com> | 2006-04-18 00:28:42 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2006-04-18 00:28:42 +0000 |
commit | 817428304d9249368db2b258b0e9779d19cefc06 (patch) | |
tree | 2690289b4f287017a23718e5e2779f984e789d7c | |
parent | ec274a6bb0e8eacc3421a771d8f733be0ca6b924 (diff) |
Radar 4499790
* c-lex.c (lex_string): Enable pascal strings for wchars.
[cp]
* parser.c (cp_parser_string_literal): Enable pascal strings for
wchars.
[libcpp]
* charset.c (cpp_interpret_string): Enable pascal strings for wchars.
[testsuite]
* gcc.apple/R4499790.c: New.
* gcc.apple/R4499790-2.c: New.
* gcc.apple/pascal-strings-2.c: Update.
* g++.dg/pascal-strings-2.C: Update.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/apple-local-200502-branch@113024 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.apple-ppc | 5 | ||||
-rw-r--r-- | gcc/c-lex.c | 12 | ||||
-rw-r--r-- | gcc/cp/ChangeLog.apple-ppc | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.apple-ppc | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pascal-strings-2.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.apple/R4499790-2.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/gcc.apple/R4499790.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/gcc.apple/pascal-strings-2.c | 2 | ||||
-rw-r--r-- | libcpp/ChangeLog.apple-ppc | 5 | ||||
-rw-r--r-- | libcpp/charset.c | 30 |
11 files changed, 117 insertions, 21 deletions
diff --git a/gcc/ChangeLog.apple-ppc b/gcc/ChangeLog.apple-ppc index 19e764a3d92..c7507c488a1 100644 --- a/gcc/ChangeLog.apple-ppc +++ b/gcc/ChangeLog.apple-ppc @@ -1,3 +1,8 @@ +2006-04-17 Devang Patel <dpatel@apple.com> + + Radar 4499790 + * c-lex.c (lex_string): Enable pascal strings for wchars. + 2006-04-12 Mike Stump <mrs@apple.com> Radar 4477426 4466768 4498501 diff --git a/gcc/c-lex.c b/gcc/c-lex.c index 45bf3893d1a..331444c0e12 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -977,9 +977,13 @@ lex_string (const cpp_token *tok, tree *valp, bool objc_string) if (tok->type == CPP_WSTRING) wide = true; /* APPLE LOCAL begin pascal strings */ - else if (CPP_OPTION (parse_in, pascal_strings) - && str.text[1] == '\\' && str.text[2] == 'p') - pascal_p = true; + if (CPP_OPTION (parse_in, pascal_strings)) + { + if (wide && str.text[0] == 'L' && str.text[2] == '\\' && str.text[3] == 'p') + pascal_p = true; + else if (str.text[1] == '\\' && str.text[2] == 'p') + pascal_p = true; + } /* APPLE LOCAL end pascal strings */ retry: @@ -1021,7 +1025,7 @@ lex_string (const cpp_token *tok, tree *valp, bool objc_string) strs = (cpp_string *) obstack_finish (&str_ob); /* APPLE LOCAL begin pascal strings */ - if (wide || objc_string) + if (objc_string) pascal_p = false; /* APPLE LOCAL end pascal strings */ diff --git a/gcc/cp/ChangeLog.apple-ppc b/gcc/cp/ChangeLog.apple-ppc index 2ed1ff4804e..efe34cc940a 100644 --- a/gcc/cp/ChangeLog.apple-ppc +++ b/gcc/cp/ChangeLog.apple-ppc @@ -1,3 +1,9 @@ +2006-04-17 Devang Patel <dpatel@apple.com> + + Radar 4499790 + * parser.c (cp_parser_string_literal): Enable pascal strings for + wchars. + 2006-04-12 Mike Stump <mrs@apple.com> Radar 4477426 4466768 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 62f1b00cd7a..b6bc608a223 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2846,9 +2846,13 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok) if (tok->type == CPP_WSTRING) wide = true; /* APPLE LOCAL begin pascal strings */ - else if (CPP_OPTION (parse_in, pascal_strings) - && str.text[1] == '\\' && str.text[2] == 'p') - pascal_p = true; + if (CPP_OPTION (parse_in, pascal_strings)) + { + if (wide && str.text[0] == 'L' && str.text[2] == '\\' && str.text[3] == 'p') + pascal_p = true; + else if (str.text[1] == '\\' && str.text[2] == 'p') + pascal_p = true; + } /* APPLE LOCAL end pascal strings */ strs = &str; @@ -2867,9 +2871,13 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok) if (tok->type == CPP_WSTRING) wide = true; /* APPLE LOCAL begin pascal strings */ - else if (count == 1 && CPP_OPTION (parse_in, pascal_strings) - && str.text[1] == '\\' && str.text[2] == 'p') - pascal_p = true; + if (CPP_OPTION (parse_in, pascal_strings) && count == 1) + { + if (wide && str.text[0] == 'L' && str.text[2] == '\\' && str.text[3] == 'p') + pascal_p = true; + else if (str.text[1] == '\\' && str.text[2] == 'p') + pascal_p = true; + } /* APPLE LOCAL end pascal strings */ obstack_grow (&str_ob, &str, sizeof (cpp_string)); @@ -2887,11 +2895,6 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok) wide = false; } - /* APPLE LOCAL begin pascal strings */ - if (wide) - pascal_p = false; - /* APPLE LOCAL end pascal strings */ - if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate) /* APPLE LOCAL pascal strings */ (parse_in, strs, count, &istr, wide, pascal_p)) diff --git a/gcc/testsuite/ChangeLog.apple-ppc b/gcc/testsuite/ChangeLog.apple-ppc index d2e8602d15b..7d22b382ece 100644 --- a/gcc/testsuite/ChangeLog.apple-ppc +++ b/gcc/testsuite/ChangeLog.apple-ppc @@ -1,3 +1,11 @@ +2006-04-17 Devang Patel <dpatel@apple.com> + + Radar 4499790 + * gcc.apple/R4499790.c: New. + * gcc.apple/R4499790-2.c: New. + * gcc.apple/pascal-strings-2.c: Update. + * g++.dg/pascal-strings-2.C: Update. + 2006-04-12 Mike Stump <mrs@apple.com> Radar 4477426 4466768 diff --git a/gcc/testsuite/g++.dg/pascal-strings-2.C b/gcc/testsuite/g++.dg/pascal-strings-2.C index e74c67f89c7..5fa350e5329 100644 --- a/gcc/testsuite/g++.dg/pascal-strings-2.C +++ b/gcc/testsuite/g++.dg/pascal-strings-2.C @@ -4,7 +4,7 @@ /* { dg-do compile } */ /* { dg-options "-fpascal-strings" } */ -const wchar_t *pascalStr1 = L"\pHi!"; /* { dg-warning "unknown escape sequence" } */ +const wchar_t *pascalStr1 = L"\pHi!"; /* { dg-bogus "unknown escape sequence" } */ const wchar_t *pascalStr2 = L"Bye\p!"; /* { dg-warning "unknown escape sequence" } */ const wchar_t *initErr0 = "\pHi"; /* { dg-error "cannot convert" } */ diff --git a/gcc/testsuite/gcc.apple/R4499790-2.c b/gcc/testsuite/gcc.apple/R4499790-2.c new file mode 100644 index 00000000000..9c1d1b7db01 --- /dev/null +++ b/gcc/testsuite/gcc.apple/R4499790-2.c @@ -0,0 +1,21 @@ +/* Test case for radar 4499790 */ +/* { dg-do run } */ +/* { dg-options "-fpascal-strings" } */ + +typedef __WCHAR_TYPE__ wchar_t; +extern void abort (void); +int main(int argc, char* argv[]) +{ + + char st[] = "\pfoo"; // pascal string + wchar_t wt[] = L"\pbar"; // pascal Unicode string + + if (st[0] != 3) + abort (); + if (wt[0] != 3) + abort (); + + return 0; +} + + diff --git a/gcc/testsuite/gcc.apple/R4499790.c b/gcc/testsuite/gcc.apple/R4499790.c new file mode 100644 index 00000000000..83bebf869e2 --- /dev/null +++ b/gcc/testsuite/gcc.apple/R4499790.c @@ -0,0 +1,22 @@ +/* Test case for radar 4499790 */ +/* { dg-do run } */ +/* { dg-options "-fpascal-strings -fshort-wchar" } */ + +extern void abort (void); +typedef unsigned short UInt16; +typedef UInt16 UniChar; +int main(int argc, char* argv[]) +{ + + char st[] = "\pfoo"; // pascal string + UniChar wt[] = L"\pbar"; // pascal Unicode string + + if (st[0] != 3) + abort (); + if (wt[0] != 3) + abort (); + + return 0; +} + + diff --git a/gcc/testsuite/gcc.apple/pascal-strings-2.c b/gcc/testsuite/gcc.apple/pascal-strings-2.c index b25c6cf8013..04b1b709672 100644 --- a/gcc/testsuite/gcc.apple/pascal-strings-2.c +++ b/gcc/testsuite/gcc.apple/pascal-strings-2.c @@ -6,7 +6,7 @@ typedef __WCHAR_TYPE__ wchar_t; -const wchar_t *pascalStr1 = L"\pHi!"; /* { dg-warning "unknown escape sequence" } */ +const wchar_t *pascalStr1 = L"\pHi!"; /* { dg-bogus "unknown escape sequence" } */ const wchar_t *pascalStr2 = L"Bye\p!"; /* { dg-warning "unknown escape sequence" } */ const wchar_t *initErr0 = "\pHi"; /* { dg-warning "incompatible pointer type" } */ diff --git a/libcpp/ChangeLog.apple-ppc b/libcpp/ChangeLog.apple-ppc index ecf7403a52c..a29c435c610 100644 --- a/libcpp/ChangeLog.apple-ppc +++ b/libcpp/ChangeLog.apple-ppc @@ -1,3 +1,8 @@ +2006-04-17 Devang Patel <dpatel@apple.com> + + Radar 4499790 + * charset.c (cpp_interpret_string): Enable pascal strings for wchars. + 2005-12-13 Mike Stump <mrs@apple.com> * Revert 2005-12-07 Devang Patel <dpatel@apple.com> Radar 4137741 diff --git a/libcpp/charset.c b/libcpp/charset.c index abb5c8d4da4..485e838c937 100644 --- a/libcpp/charset.c +++ b/libcpp/charset.c @@ -1318,13 +1318,19 @@ cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count, struct _cpp_strbuf tbuf; const uchar *p, *base, *limit; size_t i; + /* APPLE LOCAL begin pascal strings */ + size_t width = CPP_OPTION (pfile, wchar_precision); + size_t cwidth = CPP_OPTION (pfile, char_precision); + size_t pascal_string_max_length = width_to_mask (wide ? width : cwidth); + size_t pascal_string_length_byte_size = ((wide ? width : cwidth)/cwidth); + /* APPLE LOCAL end pascal strings */ struct cset_converter cvt = wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc; tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len); tbuf.text = xmalloc (tbuf.asize); /* APPLE LOCAL pascal strings */ - tbuf.len = (pascal_p ? 1 : 0); /* Reserve space for Pascal length byte. */ + tbuf.len = (pascal_p ? pascal_string_length_byte_size : 0); /* Reserve space for Pascal length byte. */ for (i = 0; i < count; i++) { @@ -1363,9 +1369,25 @@ cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count, /* For Pascal strings, compute the length byte. */ if (pascal_p) { - *tbuf.text = (unsigned char) (tbuf.len - 1); - if (tbuf.len > 256) - cpp_error (pfile, CPP_DL_ERROR, "Pascal string is too long"); + if (wide) + { + /* Conversion routine uses tbuf.len as the starting point in destination + buffer. However we are adding string lenght at the beginning. Save tbuf.len + and restore it later. */ + size_t saved_tbuf_len = tbuf.len; + unsigned char uclen = (unsigned char) (saved_tbuf_len/pascal_string_length_byte_size - 1); + tbuf.len = 0; + APPLY_CONVERSION (cvt, &uclen, 1, &tbuf); + tbuf.len = saved_tbuf_len; + if (tbuf.len/pascal_string_length_byte_size > pascal_string_max_length) + cpp_error (pfile, CPP_DL_ERROR, "Pascal string is too long"); + } + else + { + *tbuf.text = (unsigned char) (tbuf.len - 1); + if (tbuf.len > 256) + cpp_error (pfile, CPP_DL_ERROR, "Pascal string is too long"); + } } /* APPLE LOCAL end pascal strings */ |