149 lines
2.3 KiB
C
149 lines
2.3 KiB
C
#include "f2c.h"
|
|
#include "fio.h"
|
|
#include "fmt.h"
|
|
#include "lio.h"
|
|
int L_len;
|
|
|
|
t_putc(c)
|
|
{
|
|
recpos++;
|
|
putc(c,cf);
|
|
return(0);
|
|
}
|
|
lwrt_I(n) ftnint n;
|
|
{
|
|
char buf[LINTW],*p;
|
|
#ifdef USE_STRLEN
|
|
(void) sprintf(buf," %ld",(long)n);
|
|
if(recpos+strlen(buf)>=L_len)
|
|
#else
|
|
if(recpos + sprintf(buf," %ld",(long)n) >= L_len)
|
|
#endif
|
|
(*donewrec)();
|
|
for(p=buf;*p;PUT(*p++));
|
|
}
|
|
lwrt_L(n, len) ftnint n; ftnlen len;
|
|
{
|
|
if(recpos+LLOGW>=L_len)
|
|
(*donewrec)();
|
|
(void) wrt_L((uint *)&n,LLOGW, len);
|
|
}
|
|
lwrt_A(p,len) char *p; ftnlen len;
|
|
{
|
|
int i;
|
|
if(recpos+len>=L_len)
|
|
(*donewrec)();
|
|
if (!recpos)
|
|
{ PUT(' '); ++recpos; }
|
|
for(i=0;i<len;i++) PUT(*p++);
|
|
}
|
|
|
|
static int
|
|
l_g(buf, absn) char *buf; double absn;
|
|
{
|
|
doublereal n;
|
|
char *fmt;
|
|
|
|
n = absn;
|
|
if (absn < 0)
|
|
absn = -absn;
|
|
fmt = LLOW <= absn && absn < LHIGH ? LFFMT : LEFMT;
|
|
#ifdef USE_STRLEN
|
|
sprintf(buf, fmt, n);
|
|
return strlen(buf);
|
|
#else
|
|
return sprintf(buf, fmt, n);
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
l_put(s) register char *s;
|
|
{
|
|
register int c, (*pn)() = putn;
|
|
while(c = *s++)
|
|
(*pn)(c);
|
|
}
|
|
|
|
lwrt_F(n) double n;
|
|
{
|
|
char buf[LEFBL];
|
|
|
|
if(recpos + l_g(buf,n) >= L_len)
|
|
(*donewrec)();
|
|
l_put(buf);
|
|
}
|
|
lwrt_C(a,b) double a,b;
|
|
{
|
|
char *ba, *bb, bufa[LEFBL], bufb[LEFBL];
|
|
int al, bl;
|
|
|
|
al = l_g(bufa, a);
|
|
for(ba = bufa; *ba == ' '; ba++)
|
|
--al;
|
|
bl = l_g(bufb, b) + 1; /* intentionally high by 1 */
|
|
for(bb = bufb; *bb == ' '; bb++)
|
|
--bl;
|
|
if(recpos + al + bl + 3 >= L_len && recpos)
|
|
(*donewrec)();
|
|
PUT(' ');
|
|
PUT('(');
|
|
l_put(ba);
|
|
PUT(',');
|
|
if (recpos + bl >= L_len) {
|
|
(*donewrec)();
|
|
PUT(' ');
|
|
}
|
|
l_put(bb);
|
|
PUT(')');
|
|
}
|
|
l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
|
|
{
|
|
#define Ptr ((flex *)ptr)
|
|
int i;
|
|
ftnint x;
|
|
double y,z;
|
|
real *xx;
|
|
doublereal *yy;
|
|
for(i=0;i< *number; i++)
|
|
{
|
|
switch((int)type)
|
|
{
|
|
default: fatal(204,"unknown type in lio");
|
|
case TYSHORT:
|
|
x=Ptr->flshort;
|
|
goto xint;
|
|
case TYLONG:
|
|
x=Ptr->flint;
|
|
xint: lwrt_I(x);
|
|
break;
|
|
case TYREAL:
|
|
y=Ptr->flreal;
|
|
goto xfloat;
|
|
case TYDREAL:
|
|
y=Ptr->fldouble;
|
|
xfloat: lwrt_F(y);
|
|
break;
|
|
case TYCOMPLEX:
|
|
xx= &Ptr->flreal;
|
|
y = *xx++;
|
|
z = *xx;
|
|
goto xcomplex;
|
|
case TYDCOMPLEX:
|
|
yy = &Ptr->fldouble;
|
|
y= *yy++;
|
|
z = *yy;
|
|
xcomplex:
|
|
lwrt_C(y,z);
|
|
break;
|
|
case TYLOGICAL:
|
|
lwrt_L(Ptr->flint, len);
|
|
break;
|
|
case TYCHAR:
|
|
lwrt_A(ptr,len);
|
|
break;
|
|
}
|
|
ptr += len;
|
|
}
|
|
return(0);
|
|
}
|