diff --git a/libf2c/ChangeLog b/libf2c/ChangeLog index 0da1c9712ea..0b6e261d3bc 100644 --- a/libf2c/ChangeLog +++ b/libf2c/ChangeLog @@ -1,3 +1,21 @@ +2000-12-09 Toon Moene + + Update to Netlib version 20001205. + Thanks go to David M. Gay for these updates. + + * libF77/Version.c: Update version information. + * libF77/z_log.c: Improve accuracy of real(log(z)) for + z near (+-1,eps) with |eps| small. + * libF77/s_cat.c: Adjust call when ftnint and ftnlen are + of different size. + * libF77/dtime_.c, libF77/etime_.c: Use floating point divide. + + * libI77/Version.c: Update version information. + * libI77/rsne.c, libI77/xwsne.c: Adjust code for when ftnint + and ftnlen differ in size. + * libI77/lread.c: Fix reading of namelist logical values followed + by = where starts with T or F. + 2000-11-26 Toon Moene * libI77/Version.c, libF77/Version.c, libU77/Version.c: diff --git a/libf2c/libF77/Version.c b/libf2c/libF77/Version.c index 1f4a1786939..aa32ebfc4e6 100644 --- a/libf2c/libF77/Version.c +++ b/libf2c/libF77/Version.c @@ -1,4 +1,4 @@ -static char junk[] = "\n@(#)LIBF77 VERSION 19991115\n"; +static char junk[] = "\n@(#)LIBF77 VERSION 20000929\n"; /* */ @@ -69,6 +69,17 @@ char __G77_LIBF77_VERSION__[] = "0.5.26 20001209 (experimental)"; also vanishes or not. VERSION not changed. 15 Nov. 1999: s_rnge.c: add casts for the case of sizeof(ftnint) == sizeof(int) < sizeof(long). + 10 March 2000: z_log.c: improve accuracy of Real(log(z)) for, e.g., + z near (+-1,eps) with |eps| small. For the old + evaluation, compile with -DPre20000310 . + 20 April 2000: s_cat.c: tweak argument types to accord with + calls by f2c when ftnint and ftnlen are of + different sizes (different numbers of bits). + 4 July 2000: adjustments to permit compilation by C++ compilers; + VERSION string remains unchanged. NOT APPLIED FOR G77. + 29 Sept. 2000: dtime_.c, etime_.c: use floating-point divide. + dtime_.d, erf_.c, erfc_.c, etime.c: for use with + "f2c -R", compile with -DREAL=float. */ #include diff --git a/libf2c/libF77/dtime_.c b/libf2c/libF77/dtime_.c index 4b37320d43b..e2c3a03cb7a 100644 --- a/libf2c/libF77/dtime_.c +++ b/libf2c/libF77/dtime_.c @@ -45,8 +45,8 @@ dtime_(float *tarray) static struct tms t0; times(&t); - tarray[0] = (t.tms_utime - t0.tms_utime) / Hz; - tarray[1] = (t.tms_stime - t0.tms_stime) / Hz; + tarray[0] = (double)(t.tms_utime - t0.tms_utime) / Hz; + tarray[1] = (double)(t.tms_stime - t0.tms_stime) / Hz; t0 = t; return tarray[0] + tarray[1]; #endif diff --git a/libf2c/libF77/etime_.c b/libf2c/libF77/etime_.c index e88cfd88648..0c3209d2612 100644 --- a/libf2c/libF77/etime_.c +++ b/libf2c/libF77/etime_.c @@ -41,6 +41,7 @@ etime_(float *tarray) struct tms t; times(&t); - return (tarray[0] = t.tms_utime/Hz) + (tarray[1] = t.tms_stime/Hz); + return (tarray[0] = (double)t.tms_utime/Hz) + + (tarray[1] = (double)t.tms_stime/Hz); #endif } diff --git a/libf2c/libF77/s_cat.c b/libf2c/libF77/s_cat.c index f462fd24945..77a94f64745 100644 --- a/libf2c/libF77/s_cat.c +++ b/libf2c/libF77/s_cat.c @@ -22,9 +22,9 @@ VOID #ifdef KR_headers -s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnlen rnp[], *np, ll; +s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnint rnp[], *np; ftnlen ll; #else -s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll) +s_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) #endif { ftnlen i, nc; diff --git a/libf2c/libF77/z_log.c b/libf2c/libF77/z_log.c index 34c56d42a8c..9dcc7f73fe5 100644 --- a/libf2c/libF77/z_log.c +++ b/libf2c/libF77/z_log.c @@ -10,7 +10,54 @@ extern double f__cabs(double, double); void z_log(doublecomplex *r, doublecomplex *z) #endif { + double s, s0, t, t2, u, v; double zi = z->i, zr = z->r; + r->i = atan2(zi, zr); +#ifdef Pre20000310 r->r = log( f__cabs( zr, zi ) ); +#else + if (zi < 0) + zi = -zi; + if (zr < 0) + zr = -zr; + if (zr < zi) { + t = zi; + zi = zr; + zr = t; + } + t = zi/zr; + s = zr * sqrt(1 + t*t); + /* now s = f__cabs(zi,zr), and zr = |zr| >= |zi| = zi */ + if ((t = s - 1) < 0) + t = -t; + if (t > .01) + r->r = log(s); + else { + +#ifdef Comment + + log(1+x) = x - x^2/2 + x^3/3 - x^4/4 + - ... + + = x(1 - x/2 + x^2/3 -+...) + + [sqrt(y^2 + z^2) - 1] * [sqrt(y^2 + z^2) + 1] = y^2 + z^2 - 1, so + + sqrt(y^2 + z^2) - 1 = (y^2 + z^2 - 1) / [sqrt(y^2 + z^2) + 1] + +#endif /*Comment*/ + + t = ((zr*zr - 1.) + zi*zi) / (s + 1); + t2 = t*t; + s = 1. - 0.5*t; + u = v = 1; + do { + s0 = s; + u *= t2; + v += 2; + s += u/v - t*u/(v+1); + } while(s > s0); + r->r = s*t; + } +#endif } diff --git a/libf2c/libI77/Version.c b/libf2c/libI77/Version.c index 5cb46a68256..1d994a1318d 100644 --- a/libf2c/libI77/Version.c +++ b/libf2c/libI77/Version.c @@ -1,4 +1,4 @@ -static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 19991115\n"; +static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 20001205\n"; /* */ @@ -314,6 +314,15 @@ wrtfmt.c: /* Compiling libf2c with -DALWAYS_FLUSH should prevent losing */ /* any data in buffers should the program fault. It also */ /* makes the program run more slowly. */ +/* 20 April 2000: rsne.c, xwsne.c: tweaks that only matter if ftnint and */ +/* ftnlen are of different fundamental types (different numbers */ +/* of bits). Since these files will not compile when this */ +/* change matters, the above VERSION string remains unchanged. */ +/* 4 July 2000: adjustments to permit compilation by C++ compilers; */ +/* VERSION string remains unchanged. NOT APPLIED FOR G77 */ +/* 5 Dec. 2000: lread.c: under namelist input, when reading a logical array, */ +/* treat Tstuff= and Fstuff= as new assignments rather than as */ +/* logical constants. */ diff --git a/libf2c/libI77/lread.c b/libf2c/libI77/lread.c index 3d400596224..4b62a5cbadf 100644 --- a/libf2c/libI77/lread.c +++ b/libf2c/libI77/lread.c @@ -339,11 +339,93 @@ l_C(Void) return(0); } + static char nmLbuf[256], *nmL_next; + static int (*nmL_getc_save)(Void); +#ifdef KR_headers + static int (*nmL_ungetc_save)(/* int, FILE* */); +#else + static int (*nmL_ungetc_save)(int, FILE*); +#endif + + static int +nmL_getc(Void) +{ + int rv; + if (rv = *nmL_next++) + return rv; + l_getc = nmL_getc_save; + l_ungetc = nmL_ungetc_save; + return (*l_getc)(); + } + + static int +#ifdef KR_headers +nmL_ungetc(x, f) int x; FILE *f; +#else +nmL_ungetc(int x, FILE *f) +#endif +{ + f = f; /* banish non-use warning */ + return *--nmL_next = x; + } + + static int +#ifdef KR_headers +Lfinish(ch, dot, rvp) int ch, dot, *rvp; +#else +Lfinish(int ch, int dot, int *rvp) +#endif +{ + char *s, *se; + static char what[] = "namelist input"; + + s = nmLbuf + 2; + se = nmLbuf + sizeof(nmLbuf) - 1; + *s++ = ch; + while(!issep(GETC(ch)) && ch!=EOF) { + if (s >= se) { + nmLbuf_ovfl: + return *rvp = err__fl(f__elist->cierr,131,what); + } + *s++ = ch; + if (ch != '=') + continue; + if (dot) + return *rvp = err__fl(f__elist->cierr,112,what); + got_eq: + *s = 0; + nmL_getc_save = l_getc; + l_getc = nmL_getc; + nmL_ungetc_save = l_ungetc; + l_ungetc = nmL_ungetc; + nmLbuf[1] = *(nmL_next = nmLbuf) = ','; + *rvp = f__lcount = 0; + return 1; + } + if (dot) + goto done; + for(;;) { + if (s >= se) + goto nmLbuf_ovfl; + *s++ = ch; + if (!isblnk(ch)) + break; + if (GETC(ch) == EOF) + goto done; + } + if (ch == '=') + goto got_eq; + done: + Ungetc(ch, f__cf); + return 0; + } + static int l_L(Void) { - int ch; - if(f__lcount>0) return(0); + int ch, rv, sawdot; + if(f__lcount>0) + return(0); f__lcount = 1; f__ltype=0; GETC(ch); @@ -357,15 +439,23 @@ l_L(Void) err(f__elist->cierr,(EOF),"lread"); GETC(ch); } - if(ch == '.') GETC(ch); + sawdot = 0; + if(ch == '.') { + sawdot = 1; + GETC(ch); + } switch(ch) { case 't': case 'T': + if (nml_read && Lfinish(ch, sawdot, &rv)) + return rv; f__lx=1; break; case 'f': case 'F': + if (nml_read && Lfinish(ch, sawdot, &rv)) + return rv; f__lx=0; break; default: diff --git a/libf2c/libI77/rsne.c b/libf2c/libI77/rsne.c index c9d5f1015f4..77ffdf70bd2 100644 --- a/libf2c/libI77/rsne.c +++ b/libf2c/libI77/rsne.c @@ -302,8 +302,8 @@ x_rsne(cilist *a) Vardesc *v; dimen *dn, *dn0, *dn1; ftnlen *dims, *dims1; - ftnlen b, b0, b1, ex, no, no1, nomax, size, span; - ftnint type; + ftnlen b, b0, b1, ex, no, nomax, size, span; + ftnint no1, type; char *vaddr; long iva, ivae; dimen dimens[MAXDIM], substr; @@ -338,7 +338,7 @@ x_rsne(cilist *a) #endif } have_amp: - if (ch = getname(buf,(int) sizeof(buf))) + if (ch = getname(buf,sizeof(buf))) return ch; nl = (Namelist *)a->cifmt; if (strcmp(buf, nl->name)) @@ -393,7 +393,7 @@ x_rsne(cilist *a) if (ch <= ' ' && ch >= 0 || ch == ',') continue; Ungetc(ch,f__cf); - if (ch = getname(buf,(int) sizeof(buf))) + if (ch = getname(buf,sizeof(buf))) return ch; goto havename; } diff --git a/libf2c/libI77/xwsne.c b/libf2c/libI77/xwsne.c index 71f6f1d5da5..babec475325 100644 --- a/libf2c/libI77/xwsne.c +++ b/libf2c/libI77/xwsne.c @@ -24,10 +24,9 @@ x_wsne(cilist *a) Namelist *nl; char *s; Vardesc *v, **vd, **vde; - ftnint *number, type; + ftnint number, type; ftnlen *dims; ftnlen size; - static ftnint one = 1; extern ftnlen f__typesize[]; nl = (Namelist *)a->cifmt; @@ -49,7 +48,7 @@ x_wsne(cilist *a) PUT(*s++); PUT(' '); PUT('='); - number = (dims = v->dims) ? dims + 1 : &one; + number = (dims = v->dims) ? dims[1] : 1; type = v->type; if (type < 0) { size = -type; @@ -57,7 +56,7 @@ x_wsne(cilist *a) } else size = f__typesize[type]; - l_write(number, v->addr, size, type); + l_write(&number, v->addr, size, type); if (vd < vde) { if (f__recpos+2 >= L_len) nl_donewrec();