]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/33253 (namelist: reading back a string with apostrophe)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 6 Sep 2007 01:20:02 +0000 (01:20 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 6 Sep 2007 01:20:02 +0000 (01:20 +0000)
2007-09-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libfortran/33253
* io/write.c (nml_write_obj): Set the delimiter correctly before calling
write_character. (namelist_write): Clean up the code a little and add
comments to clarify what its doing.

From-SVN: r128170

libgfortran/ChangeLog
libgfortran/io/write.c

index 0c1dcff5745b83c02cbf5f7941081f764d48006c..c1589e8a7f387bb8c2291946be3efef943528b47 100644 (file)
@@ -1,4 +1,11 @@
-2007-03-04  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+2007-09-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libfortran/33253
+       * io/write.c (nml_write_obj): Set the delimiter correctly before calling
+       write_character. (namelist_write): Clean up the code a little and add
+       comments to clarify what its doing.
+
+2007-09-04  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/33225
        * io/write.c (stdbool.h): Add include. (sign_t): Move typedef to
index 72f68b432fc9e69b2d01b14b038a63ce78d2e2e4..4792a222b9a7e07fde184f0f043784f66a9815c2 100644 (file)
@@ -868,6 +868,7 @@ nml_write_obj (st_parameter_dt *dtp, namelist_info * obj, index_type offset,
   size_t base_name_len;
   size_t base_var_name_len;
   size_t tot_len;
+  unit_delim tmp_delim;
 
   /* Write namelist variable names in upper case. If a derived type,
      nothing is output.  If a component, base and base_name are set.  */
@@ -984,11 +985,13 @@ nml_write_obj (st_parameter_dt *dtp, namelist_info * obj, index_type offset,
               break;
 
            case GFC_DTYPE_CHARACTER:
-             if (dtp->u.p.nml_delim)
-               write_character (dtp, &dtp->u.p.nml_delim, 1);
+             tmp_delim = dtp->u.p.current_unit->flags.delim;
+             if (dtp->u.p.nml_delim == '"')
+               dtp->u.p.current_unit->flags.delim = DELIM_QUOTE;
+             if (dtp->u.p.nml_delim == '\'')
+               dtp->u.p.current_unit->flags.delim = DELIM_APOSTROPHE;
              write_character (dtp, p, obj->string_length);
-             if (dtp->u.p.nml_delim)
-               write_character (dtp, &dtp->u.p.nml_delim, 1);
+             dtp->u.p.current_unit->flags.delim = tmp_delim;
               break;
 
            case GFC_DTYPE_REAL:
@@ -1130,7 +1133,6 @@ namelist_write (st_parameter_dt *dtp)
   /* Set the delimiter for namelist output.  */
 
   tmp_delim = dtp->u.p.current_unit->flags.delim;
-  dtp->u.p.current_unit->flags.delim = DELIM_NONE;
   switch (tmp_delim)
     {
     case (DELIM_QUOTE):
@@ -1146,10 +1148,12 @@ namelist_write (st_parameter_dt *dtp)
       break;
     }
 
+  /* Temporarily disable namelist delimters.  */
+  dtp->u.p.current_unit->flags.delim = DELIM_NONE;
+
   write_character (dtp, "&", 1);
 
   /* Write namelist name in upper case - f95 std.  */
-
   for (i = 0 ;i < dtp->namelist_name_len ;i++ )
     {
       c = toupper (dtp->namelist_name[i]);
@@ -1165,14 +1169,14 @@ namelist_write (st_parameter_dt *dtp)
          t1 = nml_write_obj (dtp, t2, dummy_offset, dummy, dummy_name);
        }
     }
+
 #ifdef HAVE_CRLF
   write_character (dtp, "  /\r\n", 5);
 #else
   write_character (dtp, "  /\n", 4);
 #endif
 
-  /* Recover the original delimiter.  */
-
+  /* Restore the original delimiter.  */
   dtp->u.p.current_unit->flags.delim = tmp_delim;
 }