c-opts.c: Default TARGET_EBCDIC to 0 if not defined.
authorNeil Booth <neil@daikokuya.co.uk>
Mon, 17 Mar 2003 06:41:06 +0000 (06:41 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Mon, 17 Mar 2003 06:41:06 +0000 (06:41 +0000)
* c-opts.c: Default TARGET_EBCDIC to 0 if not defined.
(c_common_init): Set EBCDIC in cpp options.
* cpplex.c (maybe_read_ucs, cpp_parse_escape): Use EBCDIC option,
not conditional compilation.
* cpplib.h (struct cpp_options): New entry EBCDIC.

From-SVN: r64471

gcc/ChangeLog
gcc/c-opts.c
gcc/cpplex.c
gcc/cpplib.h

index 6c76a47f0fe77ef0bd7171e9f12a318c9712889c..7197370f36cc9c441a28a6258a38b5cf81bc32be 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-17  Neil Booth  <neil@daikokuya.co.uk>
+
+       * c-opts.c: Default TARGET_EBCDIC to 0 if not defined.
+       (c_common_init): Set EBCDIC in cpp options.
+       * cpplex.c (maybe_read_ucs, cpp_parse_escape): Use EBCDIC option,
+       not conditional compilation.
+       * cpplib.h (struct cpp_options): New entry EBCDIC.
+
 2003-03-17  Neil Booth  <neil@daikokuya.co.uk>
 
        * fix-header.c (read_scan_file): Need to malloc arguments to add_path.
index adab26d719590521745748afe3890d3fd0219bf5..8c639cca2937a79e6b321cd170fe4c20e0375b58 100644 (file)
@@ -40,6 +40,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 # define TARGET_SYSTEM_ROOT NULL
 #endif
 
+#ifndef TARGET_EBCDIC
+# define TARGET_EBCDIC 0
+#endif
+
 static int saved_lineno;
 
 /* CPP's options.  */
@@ -1590,6 +1594,7 @@ c_common_init ()
   cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
   cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
   cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
+  cpp_opts->EBCDIC = TARGET_EBCDIC;
 
   if (flag_preprocess_only)
     {
index 7a8af905a4ce4c35ca5a957bfb510a68e8232f77..93e04b8b5293f8b7dba5620887a72b7e22906745 100644 (file)
@@ -1731,14 +1731,15 @@ maybe_read_ucs (pfile, pstr, limit, pc)
        }
     }
 
-#ifdef TARGET_EBCDIC
-  cpp_error (pfile, DL_ERROR, "universal-character-name on EBCDIC target");
-  code = 0x3f;  /* EBCDIC invalid character */
-#else
- /* True extended characters are OK.  */
-  if (code >= 0xa0
-      && !(code & 0x80000000)
-      && !(code >= 0xD800 && code <= 0xDFFF))
+  if (CPP_OPTION (pfile, EBCDIC))
+    {
+      cpp_error (pfile, DL_ERROR, "universal-character-name on EBCDIC target");
+      code = 0x3f;  /* EBCDIC invalid character */
+    }
+  /* True extended characters are OK.  */
+  else if (code >= 0xa0
+          && !(code & 0x80000000)
+          && !(code >= 0xD800 && code <= 0xDFFF))
     ;
   /* The standard permits $, @ and ` to be specified as UCNs.  We use
      hex escapes so that this also works with EBCDIC hosts.  */
@@ -1747,7 +1748,6 @@ maybe_read_ucs (pfile, pstr, limit, pc)
   /* Don't give another error if one occurred above.  */
   else if (length == 0)
     cpp_error (pfile, DL_ERROR, "universal-character-name out of range");
-#endif
 
   *pstr = p;
   *pc = code;
@@ -1766,11 +1766,20 @@ cpp_parse_escape (pfile, pstr, limit, wide)
      const unsigned char *limit;
      int wide;
 {
+  /* Values of \a \b \e \f \n \r \t \v respectively.  */
+  static const uchar ascii[]  = {  7,  8, 27, 12, 10, 13,  9, 11 };
+  static const uchar ebcdic[] = { 47, 22, 39, 12, 21, 13,  5, 11 };
+
   int unknown = 0;
-  const unsigned char *str = *pstr;
+  const unsigned char *str = *pstr, *charconsts;
   cppchar_t c, mask;
   unsigned int width;
 
+  if (CPP_OPTION (pfile, EBCDIC))
+    charconsts = ebcdic;
+  else
+    charconsts = ascii;
+
   if (wide)
     width = CPP_OPTION (pfile, wchar_precision);
   else
@@ -1784,12 +1793,12 @@ cpp_parse_escape (pfile, pstr, limit, wide)
   switch (c)
     {
     case '\\': case '\'': case '"': case '?': break;
-    case 'b': c = TARGET_BS;     break;
-    case 'f': c = TARGET_FF;     break;
-    case 'n': c = TARGET_NEWLINE; break;
-    case 'r': c = TARGET_CR;     break;
-    case 't': c = TARGET_TAB;    break;
-    case 'v': c = TARGET_VT;     break;
+    case 'b': c = charconsts[1];  break;
+    case 'f': c = charconsts[3];  break;
+    case 'n': c = charconsts[4];  break;
+    case 'r': c = charconsts[5];  break;
+    case 't': c = charconsts[6];  break;
+    case 'v': c = charconsts[7];  break;
 
     case '(': case '{': case '[': case '%':
       /* '\(', etc, are used at beginning of line to avoid confusing Emacs.
@@ -1801,14 +1810,14 @@ cpp_parse_escape (pfile, pstr, limit, wide)
       if (CPP_WTRADITIONAL (pfile))
        cpp_error (pfile, DL_WARNING,
                   "the meaning of '\\a' is different in traditional C");
-      c = TARGET_BELL;
+      c = charconsts[0];
       break;
 
     case 'e': case 'E':
       if (CPP_PEDANTIC (pfile))
        cpp_error (pfile, DL_PEDWARN,
                   "non-ISO-standard escape sequence, '\\%c'", (int) c);
-      c = TARGET_ESC;
+      c = charconsts[2];
       break;
 
     case 'u': case 'U':
index 7664b1f137950762506644568d467702f66903c4..edd521b041ef5d0c0b2b797f2e949b0e21c82f01 100644 (file)
@@ -329,6 +329,12 @@ struct cpp_options
   /* True for traditional preprocessing.  */
   unsigned char traditional;
 
+  /* True to warn about precompiled header files we couldn't use.  */
+  bool warn_invalid_pch;
+
+  /* True if dependencies should be restored from a precompiled header.  */
+  bool restore_pch_deps;
+
   /* Dependency generation.  */
   struct
   {
@@ -355,14 +361,11 @@ struct cpp_options
   /* True means chars (wide chars) are unsigned.  */
   bool unsigned_char, unsigned_wchar;
 
+  /* True if target is EBCDIC.  */
+  bool EBCDIC;
+
   /* Nonzero means __STDC__ should have the value 0 in system headers.  */
   unsigned char stdc_0_in_system_headers;
-
-  /* True to warn about precompiled header files we couldn't use.  */
-  bool warn_invalid_pch;
-
-  /* True if dependencies should be restored from a precompiled header.  */
-  bool restore_pch_deps;
 };
 
 /* Call backs.  */