summaryrefslogtreecommitdiff
path: root/libgfortran/io/transfer.c
diff options
context:
space:
mode:
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-18 01:20:06 +0000
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-18 01:20:06 +0000
commit2cd58ad70f2065e7717dff301b3a65349d1a9be0 (patch)
treeee99eee77195e9d423d2ec6b517c2cf6ab9bae94 /libgfortran/io/transfer.c
parent30aea172c1db83aa6b99622d0042f2085c46879c (diff)
downloadgcc-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.c33
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);
}