diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2008-05-06 21:06:20 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2008-05-06 21:06:20 +0000 |
commit | 006601890b953c9177624f9f533b997f344802ad (patch) | |
tree | afe9f21644dc49be8c1557eb5347bf2f587920d2 /gcc/fortran/trans-const.c | |
parent | 1b38192d61001d9cd1b15baf233a9e8847d06889 (diff) | |
download | gcc-006601890b953c9177624f9f533b997f344802ad.zip gcc-006601890b953c9177624f9f533b997f344802ad.tar.gz gcc-006601890b953c9177624f9f533b997f344802ad.tar.bz2 |
arith.c: (gfc_arith_concat...
* arith.c: (gfc_arith_concat, gfc_compare_string,
gfc_compare_with_Cstring, hollerith2representation,
gfc_hollerith2int, gfc_hollerith2real, gfc_hollerith2complex,
gfc_hollerith2character, gfc_hollerith2logical): Use wide
characters for character constants.
* data.c (create_character_intializer): Likewise.
* decl.c (gfc_set_constant_character_len): Likewise.
* dump-parse-tree.c (show_char_const): Correctly dump wide
character strings.
error.c (print_wide_char): Rename into gfc_print_wide_char.
(show_locus): Adapt to new prototype of gfc_print_wide_char.
expr.c (free_expr0): Representation is now disjunct from
character string value, so we always free it.
(gfc_copy_expr, find_substring_ref, gfc_simplify_expr): Adapt
to wide character strings.
* gfortran.h (gfc_expr): Make value.character.string a wide string.
(gfc_wide_toupper, gfc_wide_strncasecmp, gfc_wide_memset,
gfc_widechar_to_char, gfc_char_to_widechar): New prototypes.
(gfc_get_wide_string): New macro.
(gfc_print_wide_char): New prototype.
* io.c (format_string): Make a wide string.
(next_char, gfc_match_format, compare_to_allowed_values,
gfc_match_open): Deal with wide strings.
* module.c (mio_expr): Convert between wide strings and ASCII ones.
* primary.c (match_hollerith_constant, match_charkind_name):
Handle wide strings.
* resolve.c (build_default_init_expr): Likewise.
* scanner.c (gfc_wide_toupper, gfc_wide_memset,
gfc_char_to_widechar): New functions.
(wide_strchr, gfc_widechar_to_char, gfc_wide_strncasecmp):
Changes in prototypes.
(gfc_define_undef_line, load_line, preprocessor_line,
include_line, load_file, gfc_read_orig_filename): Handle wide
strings.
* simplify.c (gfc_simplify_achar, gfc_simplify_adjustl,
gfc_simplify_adjustr, gfc_simplify_char, gfc_simplify_iachar,
gfc_simplify_ichar, simplify_min_max, gfc_simplify_new_line,
gfc_simplify_repeat): Handle wide strings.
(wide_strspn, wide_strcspn): New helper functions.
(gfc_simplify_scan, gfc_simplify_trim, gfc_simplify_verify):
Handle wide strings.
* symbol.c (generate_isocbinding_symbol): Likewise.
* target-memory.c (size_character, gfc_target_expr_size,
encode_character, gfc_target_encode_expr, gfc_interpret_character,
gfc_target_interpret_expr): Handle wide strings.
* trans-const.c (gfc_conv_string_init): Lower wide strings to
narrow ones.
(gfc_conv_constant_to_tree): Likewise.
* trans-expr.c (gfc_conv_substring_expr): Handle wide strings.
* trans-io.c (gfc_new_nml_name_expr): Likewise.
* trans-stmt.c (gfc_trans_label_assign): Likewise.
From-SVN: r135006
Diffstat (limited to 'gcc/fortran/trans-const.c')
-rw-r--r-- | gcc/fortran/trans-const.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/gcc/fortran/trans-const.c b/gcc/fortran/trans-const.c index 37251ef..6c9032f 100644 --- a/gcc/fortran/trans-const.c +++ b/gcc/fortran/trans-const.c @@ -105,7 +105,8 @@ gfc_build_localized_cstring_const (const char *msgid) tree gfc_conv_string_init (tree length, gfc_expr * expr) { - char *s; + gfc_char_t *s; + char *c; HOST_WIDE_INT len; int slen; tree str; @@ -120,14 +121,21 @@ gfc_conv_string_init (tree length, gfc_expr * expr) if (len > slen) { - s = gfc_getmem (len); - memcpy (s, expr->value.character.string, slen); - memset (&s[slen], ' ', len - slen); - str = gfc_build_string_const (len, s); + s = gfc_get_wide_string (len); + memcpy (s, expr->value.character.string, slen * sizeof (gfc_char_t)); + gfc_wide_memset (&s[slen], ' ', len - slen); + + /* FIXME -- currently ignore wide character strings; see assert + above. */ + c = gfc_widechar_to_char (s, len); gfc_free (s); } else - str = gfc_build_string_const (len, expr->value.character.string); + c = gfc_widechar_to_char (expr->value.character.string, + expr->value.character.length); + + str = gfc_build_string_const (len, c); + gfc_free (c); return str; } @@ -214,6 +222,9 @@ gfc_conv_tree_to_mpfr (mpfr_ptr f, tree source) tree gfc_conv_constant_to_tree (gfc_expr * expr) { + tree res; + char *s; + gcc_assert (expr->expr_type == EXPR_CONSTANT); /* If it is has a prescribed memory representation, we build a string @@ -267,8 +278,12 @@ gfc_conv_constant_to_tree (gfc_expr * expr) } case BT_CHARACTER: - return gfc_build_string_const (expr->value.character.length, - expr->value.character.string); + gcc_assert (expr->ts.kind == 1); + s = gfc_widechar_to_char (expr->value.character.string, + expr->value.character.length); + res = gfc_build_string_const (expr->value.character.length, s); + gfc_free (s); + return res; case BT_HOLLERITH: return gfc_build_string_const (expr->representation.length, |