perl compilation problems on a fortune 32:16

Michael Greim greim at sbsvax.UUCP
Fri May 27 21:38:47 AEST 1988


In article <1988May17.192100.17287 at light.uucp> from May 18 Bakul Shah writes
concerning problems when compiling perl :

>BTW, if ``printf("%.20g", 5.0);'' gives you 5.0000000000000000 instead
>of just 5, you may need to patch ecvt.o.  Without this fix perl is not
>happy.  Unfortunately I don't remember all the gory details at this
>moment and that'll have to wait until I find the original ecvt.o from my
>backup floppies (ugh...) and prepare a patch.

I installed perl (patchlevel 14) on our machines and had a similar problem
on a SIEMENS PC-MX2 running SINIX v2.0 (derived from Sys3 and/or GENIX).
printf("%.20g", 10.0) would give me "1.e+01". Maybe the following
workaround is of use for some people. Look at the comments to see
what is done. (Excuse the bad English :-)

*** old.str.c	Fri May 27 13:25:33 1988
--- str.c	Fri May 27 13:22:42 1988
***************
*** 70,76 ****
--- 70,87 ----
      GROWSTR(&(str->str_ptr), &(str->str_len), 24);
      s = str->str_ptr;
      if (str->str_nok) {
+ # ifdef SINIX
+ 	/*
+ 	 * mg, 24.feb.88
+ 	 * on mx2 the following returns for 10 : 1.e+01. I just try first, if
+ 	 * the number happens to be an integer number, then i print it with
+ 	 * %d, else with %g. To produce integers I use an eps condition.
+ 	 * This may return false results, but I think it is better.
+ 	 */
+ 	fiddle (str->str_nval, s);
+ # else
  	sprintf(s,"%.20g",str->str_nval);
+ # endif
  	while (*s) s++;
      }
      *s = '\0';
***************
*** 536,538 ****
--- 547,582 ----
      str_numset(str,n);
      return str;
  }
+ 
+ # ifdef SINIX
+ static
+ fiddle (d, s)
+ double d;
+ char * s;
+ /* mg, 24.feb.88
+  * this routine tries to work around the faulty g-format on SIEMENS
+  * SINIX MX2 (for 10.0 it generates 1.e+01), by first checking, whether
+  * the argument lies near enough at an integer. This may be false for
+  * some real (!) double values. A better fix would be to remember
+  * int's and double's
+  */
+ {
+ 	int i;
+ 	static double imin = -2147483648.0;
+ 	static double imax =  2147483647.0;
+ 	double b, c;
+ 
+ 	if (d < imin || d > imax ) {
+ 		sprintf (s, "%.20g", d);
+ 		return;
+ 	}
+ 	c = d < 0.0 ? -d : d;
+ 	i = d;
+ 	b = i;
+ 	b = (b-d) < 0 ? (d-b) : (b-d);
+ 	if (b < d * 1.0e-5)
+ 		sprintf (s, "%1d", i);
+ 	else
+ 		sprintf (s, "%.20g", d);
+ }
+ # endif SINIX


	Michael
-- 

snail-mail : Michael Greim,
			 Universitaet des Saarlandes, FB 10 - Informatik (Dept. of CS),
             Bau 36, Im Stadtwald 15, D-6600 Saarbruecken 11, West Germany
E-mail     : greim at sbsvax.UUCP



More information about the Comp.unix.questions mailing list