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 | |
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')
-rw-r--r-- | libgfortran/io/io.h | 3 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 33 | ||||
-rw-r--r-- | libgfortran/io/write.c | 9 |
3 files changed, 31 insertions, 14 deletions
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 8ad25993ce4..87a70f836cd 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -90,6 +90,7 @@ typedef struct namelist_type void * mem_pos; int value_acquired; int len; + int string_length; bt type; struct namelist_type * next; } @@ -545,7 +546,7 @@ void st_set_nml_var_int (void * , char * , int , int ); void st_set_nml_var_float (void * , char * , int , int ); #define st_set_nml_var_char prefix(st_set_nml_var_char) -void st_set_nml_var_char (void * , char * , int , int ); +void st_set_nml_var_char (void * , char * , int , int, gfc_strlen_type); #define st_set_nml_var_complex prefix(st_set_nml_var_complex) void st_set_nml_var_complex (void * , char * , int , int ); 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); } diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 1af8537d751..67c769ae920 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -1122,8 +1122,11 @@ namelist_write (void) num ++; t2 = t1; t1 = t1->next; - write_character(t2->var_name, strlen(t2->var_name)); - write_character("=",1); + if (t2->var_name) + { + write_character(t2->var_name, strlen(t2->var_name)); + write_character("=",1); + } len = t2->len; p = t2->mem_pos; switch (t2->type) @@ -1135,7 +1138,7 @@ namelist_write (void) write_logical (p, len); break; case BT_CHARACTER: - write_character (p, len); + write_character (p, t2->string_length); break; case BT_REAL: write_real (p, len); |