aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2006-04-18 00:28:42 +0000
committerDevang Patel <dpatel@apple.com>2006-04-18 00:28:42 +0000
commit817428304d9249368db2b258b0e9779d19cefc06 (patch)
tree2690289b4f287017a23718e5e2779f984e789d7c
parentec274a6bb0e8eacc3421a771d8f733be0ca6b924 (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-ppc5
-rw-r--r--gcc/c-lex.c12
-rw-r--r--gcc/cp/ChangeLog.apple-ppc6
-rw-r--r--gcc/cp/parser.c25
-rw-r--r--gcc/testsuite/ChangeLog.apple-ppc8
-rw-r--r--gcc/testsuite/g++.dg/pascal-strings-2.C2
-rw-r--r--gcc/testsuite/gcc.apple/R4499790-2.c21
-rw-r--r--gcc/testsuite/gcc.apple/R4499790.c22
-rw-r--r--gcc/testsuite/gcc.apple/pascal-strings-2.c2
-rw-r--r--libcpp/ChangeLog.apple-ppc5
-rw-r--r--libcpp/charset.c30
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 */