diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c76a47f0fe..7197370f36c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-03-17 Neil Booth + + * 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 * fix-header.c (read_scan_file): Need to malloc arguments to add_path. 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. */