diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2005-11-05 09:34:07 +0100 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2005-11-05 08:34:07 +0000 |
commit | 25fc05eb629e6befabbe5ed43510d91acf47562a (patch) | |
tree | 24d8f3b9b29d15f5a5b0db76b7d7bc01e309ac71 /gcc/fortran/trans-intrinsic.c | |
parent | 5a522c1580b321aaf4e366d4c2495ded0b50a84a (diff) | |
download | gcc-25fc05eb629e6befabbe5ed43510d91acf47562a.zip gcc-25fc05eb629e6befabbe5ed43510d91acf47562a.tar.gz gcc-25fc05eb629e6befabbe5ed43510d91acf47562a.tar.bz2 |
intrinsic.c (add_functions): Add function version of TTYNAM.
* intrinsic.c (add_functions): Add function version of TTYNAM.
* intrinsic.h: Add prototypes for gfc_check_ttynam and
gfc_resolve_ttynam.
* gfortran.h: Add case for GFC_ISYM_TTYNAM.
* iresolve.c (gfc_resolve_ttynam): New function.
* trans-decl.c (gfc_build_intrinsic_function_decls): Add a tree
for function call to library ttynam.
* check.c (gfc_check_ttynam): New function.
* trans-intrinsic.c (gfc_conv_intrinsic_ttynam): New function.
(): Call gfc_conv_intrinsic_ttynam.
* trans.h: Add prototype for gfor_fndecl_ttynam.
* intrinsics/tty.c (ttynam): New function.
From-SVN: r106522
Diffstat (limited to 'gcc/fortran/trans-intrinsic.c')
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index b81b543..8a1fa0c 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -1037,6 +1037,44 @@ gfc_conv_intrinsic_char (gfc_se * se, gfc_expr * expr) } +/* Return a character string containing the tty name. */ + +static void +gfc_conv_intrinsic_ttynam (gfc_se * se, gfc_expr * expr) +{ + tree var; + tree len; + tree tmp; + tree arglist; + tree type; + tree cond; + tree gfc_int4_type_node = gfc_get_int_type (4); + + type = build_pointer_type (gfc_character1_type_node); + var = gfc_create_var (type, "pstr"); + len = gfc_create_var (gfc_int4_type_node, "len"); + + tmp = gfc_conv_intrinsic_function_args (se, expr); + arglist = gfc_chainon_list (NULL_TREE, gfc_build_addr_expr (NULL, var)); + arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len)); + arglist = chainon (arglist, tmp); + + tmp = gfc_build_function_call (gfor_fndecl_ttynam, arglist); + gfc_add_expr_to_block (&se->pre, tmp); + + /* Free the temporary afterwards, if necessary. */ + cond = build2 (GT_EXPR, boolean_type_node, len, + build_int_cst (TREE_TYPE (len), 0)); + arglist = gfc_chainon_list (NULL_TREE, var); + tmp = gfc_build_function_call (gfor_fndecl_internal_free, arglist); + tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ()); + gfc_add_expr_to_block (&se->post, tmp); + + se->expr = var; + se->string_length = len; +} + + /* Get the minimum/maximum value of all the parameters. minmax (a1, a2, a3, ...) { @@ -3073,6 +3111,10 @@ gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr) gfc_conv_intrinsic_transfer (se, expr); break; + case GFC_ISYM_TTYNAM: + gfc_conv_intrinsic_ttynam (se, expr); + break; + case GFC_ISYM_UBOUND: gfc_conv_intrinsic_bound (se, expr, 1); break; |