diff options
author | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-18 01:20:06 +0000 |
---|---|---|
committer | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-18 01:20:06 +0000 |
commit | 2cd58ad70f2065e7717dff301b3a65349d1a9be0 (patch) | |
tree | ee99eee77195e9d423d2ec6b517c2cf6ab9bae94 /libgfortran/io/transfer.c | |
parent | 30aea172c1db83aa6b99622d0042f2085c46879c (diff) | |
download | gcc-2cd58ad70f2065e7717dff301b3a65349d1a9be0.tar.gz |
2004-08-18 Victor Leikehman <lei@il.ibm.com>
PR fortran/13278
* trans-io.c (transfer_namelist_element): New. Recursively handle
derived-type variables. Pass string lengths.
(build_dt): Code moved to build_namelist, with some
changes and additions.
(gfc_build_io_library_fndecls): Declare the fifth
argument in st_set_nml_var_char -- string_length.
libgfortran/
* io/transfer.c (st_set_nml_var)
* io/write.c (namelist_write): Allow var_name and var_name_len to be
null. For strings, use string_length field instead of len.
* io/io.h (struct namelist_type): New field string_length.
(st_set_nml_var_char): New argument string_length.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86166 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran/io/transfer.c')
-rw-r--r-- | libgfortran/io/transfer.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index ff4bc26f317..d4bec91ea31 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -24,6 +24,7 @@ Boston, MA 02111-1307, USA. */ #include "config.h" #include <string.h> +#include <assert.h> #include "libgfortran.h" #include "io.h" @@ -1507,17 +1508,28 @@ st_write_done (void) static void st_set_nml_var (void * var_addr, char * var_name, int var_name_len, - int kind, bt type) + int kind, bt type, int string_length) { namelist_info *t1 = NULL, *t2 = NULL; namelist_info *nml = (namelist_info *) get_mem (sizeof( namelist_info )); nml->mem_pos = var_addr; - nml->var_name = (char*) get_mem (var_name_len+1); - strncpy (nml->var_name,var_name,var_name_len); - nml->var_name[var_name_len] = 0; + if (var_name) + { + assert (var_name_len > 0); + nml->var_name = (char*) get_mem (var_name_len+1); + strncpy (nml->var_name, var_name, var_name_len); + nml->var_name[var_name_len] = 0; + } + else + { + assert (var_name_len == 0); + nml->var_name = NULL; + } + nml->len = kind; nml->type = type; + nml->string_length = string_length; nml->next = NULL; @@ -1539,34 +1551,35 @@ void st_set_nml_var_int (void * var_addr, char * var_name, int var_name_len, int kind) { - st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_INTEGER); + st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_INTEGER, 0); } void st_set_nml_var_float (void * var_addr, char * var_name, int var_name_len, int kind) { - st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_REAL); + st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_REAL, 0); } void st_set_nml_var_char (void * var_addr, char * var_name, int var_name_len, - int kind) + int kind, gfc_strlen_type string_length) { - st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_CHARACTER); + st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_CHARACTER, + string_length); } void st_set_nml_var_complex (void * var_addr, char * var_name, int var_name_len, int kind) { - st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_COMPLEX); + st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_COMPLEX, 0); } void st_set_nml_var_log (void * var_addr, char * var_name, int var_name_len, int kind) { - st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_LOGICAL); + st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_LOGICAL, 0); } |