[Bug libfortran/22570] Null Characters instead of blanks in text output.
stevenb at suse dot de
gcc-bugzilla@gcc.gnu.org
Thu Jul 21 10:53:00 GMT 2005
------- Additional Comments From stevenb at suse dot de 2005-07-21 10:12 -------
Subject: Re: Null Characters instead of blanks in t extoutput
On Thursday 21 July 2005 11:10, THOMAS Paul Richard 169137 wrote:
> Steven,
>
> Whilst waiting for somebody to show up to a meeting, I developed the third
> correction.
>
> > To recap-
> >
> > The three buglets that I produced are:
> >
> > (1) The receipt of a slash should clear the pending skips and
> > spaces(last night's patch);
> > (2) The skips and spaces need to accumulate to cope with
> > sequences of tabs and X-edits,
> > as mentioned and tested this morning; and
> > (3) The function read.c(read_x)must ignore
> > current_unit->bytes_left, except where the
> > record length is known. I will check out a clean way to do
> > this tonight. I think that
> > it is trivial but need to be sure that I pick the right condition.
>
> The patches to transfer.c and read.c that correct all three of the above
> are enclosed.
>
> They have been regtested on Cygwin.
>
> Will provide changelog entries and testcase(s) tonight, when I will
> resubmit. I would be grateful if you would try the various failing SPEC
> cases and let me know what happens.
Hi Paul,
Thanks for your efforts. Sadly these patches still do not fix mgrid :-(
In addition, it makes sixtrack worse. The expected output is of the form,
1.340689733836071700000000000000000
0.146543110072956760000000000000000
1.260311090193034800000000000000000
-0.042293577150839000000000000000000
-64.139440118247251000000000000000000
0.000703903375558890710000000000000
1.340690456452690900000000000000000
0.146543147601565030000000000000000
1.260311267783928500000000000000000
-0.042293584340409571000000000000000
-64.139440156078706000000000000000000
0.000703903375535219540000000000000
450000.000000000000000000000000000000000
450316.755142387060000000000000000000000
450316.755142376410000000000000000000000
But now I get something that looks like memory corruption:
1.291130196023531517823812000000000
0000000000 0.143847492053550962687325000000000
4800000000 1.230797727535498431450378000000000
4200000000 -0.041176487158203642358067500000000
M SEED 1 -64.137216332498809379103480000000000
UTION 0.000703904640534278491954822700000
0957530000 1.291130872561160991551787000000000
1602036000 0.143847531118832500096615900000000
5055850000 1.230797901908041502849755000000000
3846270600 -0.041176494385251151408855460000000
6256300000 -64.137216367717257980984870000000000
8443759257 0.000703904640508020307959613500000
5815140000 450000.000000000000000000000000000000000
2841676000 450316.755711623525712639100000000000000
5223840000 450316.755711611709557473700000000000000
A test case demonstrating the problem with the '\0' characters is this:
IMPLICIT NONE
INTEGER IOUT,IOA, III
REAL CC
IOA=18
CC=3.1425
OPEN(UNIT=18, FORM='FORMATTED', STATUS='UNKNOWN')
WRITE(18,100) IOA, IOA, CC, IOA
C REWIND(18)
C READ(18,'(A10,18(2X,I4))') C10, K
100 FORMAT(1x/5x,'PARTICLE ',i3,' STABLE - RANDOM SEED ', i8,
+' MOMENTUM DEVIATION ',g12.5 /5x,'REVOLUTION ',i8/)
CLOSE(UNIT=18)!,STATUS='DELETE')
END
The output I get is (with '^@' == '\0' again):
================================================
PARTICLE 18 STABLE - RANDOM SEED 18 MOMENTUM DEVIATION 3.1425
^@^@^@^@^@REVOLUTION 18
================================================
I have attached the whole collection of patches that is in my local
tree right now. It is your fixes plus Jerry's for the BN/BZ thing.
Gr.
Steven
Index: io/read.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/read.c,v
retrieving revision 1.14
diff -u -3 -p -r1.14 read.c
--- io/read.c 13 Jul 2005 18:43:11 -0000 1.14
+++ io/read.c 21 Jul 2005 09:44:30 -0000
@@ -691,24 +691,46 @@ read_f (fnode * f, char *dest, int lengt
p++;
w--;
- while (w > 0)
+ if (g.blank_status == BLANK_UNSPECIFIED) /* Normal processing of exponent */
{
- if (*p == ' ')
+ while (w > 0 && isdigit (*p))
{
- if (g.blank_status == BLANK_ZERO) *p = '0';
- if (g.blank_status == BLANK_NULL)
+ exponent = 10 * exponent + *p - '0';
+ p++;
+ w--;
+ }
+
+ /* Only allow trailing blanks */
+
+ while (w > 0)
+ {
+ if (*p != ' ')
+ goto bad_float;
+ p++;
+ w--;
+ }
+ }
+ else /* BZ or BN status is enabled */
+ {
+ while (w > 0)
+ {
+ if (*p == ' ')
{
- p++;
- w--;
- continue;
+ if (g.blank_status == BLANK_ZERO) *p = '0';
+ if (g.blank_status == BLANK_NULL)
+ {
+ p++;
+ w--;
+ continue;
+ }
}
+ else if (!isdigit (*p))
+ goto bad_float;
+
+ exponent = 10 * exponent + *p - '0';
+ p++;
+ w--;
}
- if (!isdigit (*p))
- goto bad_float;
-
- exponent = 10 * exponent + *p - '0';
- p++;
- w--;
}
exponent = exponent * exponent_sign;
@@ -784,12 +806,14 @@ read_f (fnode * f, char *dest, int lengt
void
read_x (fnode * f)
{
- int n, m;
+ int n;
n = f->u.n;
- m = (int)current_unit->bytes_left;
- if (f->format == FMT_X)
- n = (n > m) ? m : n;
- if (n)
+
+ if ((current_unit->flags.pad == PAD_NO || is_internal_unit ())
+ && current_unit->bytes_left < n)
+ n = current_unit->bytes_left;
+
+ if (n > 0)
read_block (&n);
}
Index: io/transfer.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/transfer.c,v
retrieving revision 1.48
diff -u -3 -p -r1.48 transfer.c
--- io/transfer.c 14 Jul 2005 06:21:58 -0000 1.48
+++ io/transfer.c 21 Jul 2005 09:44:31 -0000
@@ -687,8 +687,8 @@ formatted_transfer (bt type, void *p, in
case FMT_TR:
consume_data_flag = 0 ;
- pos = current_unit->recl - current_unit->bytes_left + f->u.n;
- skips = f->u.n;
+ pos = current_unit->recl - current_unit->bytes_left + f->u.n +skips;
+ skips = f->u.n + skips;
pending_spaces = pos - max_pos;
/* Writes occur just before the switch on f->format, above, so that
@@ -776,6 +776,7 @@ formatted_transfer (bt type, void *p, in
case FMT_SLASH:
consume_data_flag = 0 ;
+ skips = pending_spaces = 0;
next_record (0);
break;
Index: io/unit.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/unit.c,v
retrieving revision 1.12
diff -u -3 -p -r1.12 unit.c
--- io/unit.c 17 May 2005 17:02:38 -0000 1.12
+++ io/unit.c 21 Jul 2005 09:44:31 -0000
@@ -304,7 +304,7 @@ init_units (void)
u->flags.access = ACCESS_SEQUENTIAL;
u->flags.form = FORM_FORMATTED;
u->flags.status = STATUS_OLD;
- u->flags.blank = BLANK_ZERO;
+ u->flags.blank = BLANK_UNSPECIFIED;
u->flags.position = POSITION_ASIS;
u->recl = options.default_recl;
@@ -326,7 +326,7 @@ init_units (void)
u->flags.access = ACCESS_SEQUENTIAL;
u->flags.form = FORM_FORMATTED;
u->flags.status = STATUS_OLD;
- u->flags.blank = BLANK_ZERO;
+ u->flags.blank = BLANK_UNSPECIFIED;
u->flags.position = POSITION_ASIS;
u->recl = options.default_recl;
@@ -348,7 +348,7 @@ init_units (void)
u->flags.access = ACCESS_SEQUENTIAL;
u->flags.form = FORM_FORMATTED;
u->flags.status = STATUS_OLD;
- u->flags.blank = BLANK_ZERO;
+ u->flags.blank = BLANK_UNSPECIFIED;
u->flags.position = POSITION_ASIS;
u->recl = options.default_recl;
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22570
More information about the Gcc-bugs
mailing list