summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-17 06:41:06 +0000
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-17 06:41:06 +0000
commit65a6d98ce28508fb8b59e298e43cd39c26bb96ab (patch)
tree8b2722d0b6eec418537a94d6fbb9ddc51f7ce249
parent3289939f014324197752d67b58e7c2bf0711b8bd (diff)
downloadgcc-65a6d98ce28508fb8b59e298e43cd39c26bb96ab.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64471 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-opts.c5
-rw-r--r--gcc/cpplex.c45
-rw-r--r--gcc/cpplib.h15
4 files changed, 49 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c76a47f0fe..7197370f36c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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.
2003-03-17 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index adab26d7195..8c639cca293 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -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)
{
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index 7a8af905a4c..93e04b8b529 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -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':
diff --git a/gcc/cpplib.h b/gcc/cpplib.h
index 7664b1f1379..edd521b041e 100644
--- a/gcc/cpplib.h
+++ b/gcc/cpplib.h
@@ -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. */