From 914b7558194b8c197fe47d131c504e3065bd1996 Mon Sep 17 00:00:00 2001 From: Bill Joy Date: Sat, 2 Feb 1980 23:53:44 -0800 Subject: [PATCH] BSD 3 development Work on file usr/src/libI77/Makefile Work on file usr/src/libI77/Makeout Work on file usr/src/libI77/dfe.c Work on file usr/src/libI77/backspace.c Work on file usr/src/libI77/dballoc.c Work on file usr/src/libI77/ctest.c Work on file usr/src/libI77/close.c Work on file usr/src/libI77/endfile.c Work on file usr/src/libI77/fmt.h Work on file usr/src/libI77/fio.h Work on file usr/src/libI77/err.c Work on file usr/src/libI77/fmt.c Work on file usr/src/libI77/due.c Work on file usr/src/libI77/iio.c Work on file usr/src/libI77/inquire.c Work on file usr/src/libI77/ftest.c Work on file usr/src/libI77/lib.c Work on file usr/src/libI77/fmtlib.c Work on file usr/src/libI77/lio.h Work on file usr/src/libI77/lread.c Work on file usr/src/libI77/lio.c Work on file usr/src/libI77/open.c Work on file usr/src/libI77/sfe.c Work on file usr/src/libI77/rsfe.c Work on file usr/src/libI77/rdfmt.c Work on file usr/src/libI77/stest.c Work on file usr/src/libI77/uio.c Work on file usr/src/libI77/sue.c Work on file usr/src/libI77/pwd.c Work on file usr/src/libI77/rewind.c Work on file usr/src/libI77/util.c Work on file usr/src/libI77/wrtfmt.c Work on file usr/src/libI77/wsfe.c Synthesized-from: 3bsd --- usr/src/libI77/Makefile | 42 ++++ usr/src/libI77/Makeout | 40 ++++ usr/src/libI77/backspace.c | 53 +++++ usr/src/libI77/close.c | 49 +++++ usr/src/libI77/ctest.c | 17 ++ usr/src/libI77/dballoc.c | 159 +++++++++++++++ usr/src/libI77/dfe.c | 118 +++++++++++ usr/src/libI77/due.c | 48 +++++ usr/src/libI77/endfile.c | 56 ++++++ usr/src/libI77/err.c | 109 ++++++++++ usr/src/libI77/fio.h | 110 +++++++++++ usr/src/libI77/fmt.c | 393 +++++++++++++++++++++++++++++++++++++ usr/src/libI77/fmt.h | 56 ++++++ usr/src/libI77/fmtlib.c | 23 +++ usr/src/libI77/ftest.c | 42 ++++ usr/src/libI77/iio.c | 92 +++++++++ usr/src/libI77/inquire.c | 77 ++++++++ usr/src/libI77/lib.c | 33 ++++ usr/src/libI77/lio.c | 132 +++++++++++++ usr/src/libI77/lio.h | 41 ++++ usr/src/libI77/lread.c | 379 +++++++++++++++++++++++++++++++++++ usr/src/libI77/open.c | 106 ++++++++++ usr/src/libI77/pwd.c | 78 ++++++++ usr/src/libI77/rdfmt.c | 221 +++++++++++++++++++++ usr/src/libI77/rewind.c | 16 ++ usr/src/libI77/rsfe.c | 67 +++++++ usr/src/libI77/sfe.c | 21 ++ usr/src/libI77/stest.c | 30 +++ usr/src/libI77/sue.c | 63 ++++++ usr/src/libI77/uio.c | 42 ++++ usr/src/libI77/util.c | 117 +++++++++++ usr/src/libI77/wrtfmt.c | 255 ++++++++++++++++++++++++ usr/src/libI77/wsfe.c | 68 +++++++ 33 files changed, 3153 insertions(+) create mode 100644 usr/src/libI77/Makefile create mode 100644 usr/src/libI77/Makeout create mode 100644 usr/src/libI77/backspace.c create mode 100644 usr/src/libI77/close.c create mode 100644 usr/src/libI77/ctest.c create mode 100644 usr/src/libI77/dballoc.c create mode 100644 usr/src/libI77/dfe.c create mode 100644 usr/src/libI77/due.c create mode 100644 usr/src/libI77/endfile.c create mode 100644 usr/src/libI77/err.c create mode 100644 usr/src/libI77/fio.h create mode 100644 usr/src/libI77/fmt.c create mode 100644 usr/src/libI77/fmt.h create mode 100644 usr/src/libI77/fmtlib.c create mode 100644 usr/src/libI77/ftest.c create mode 100644 usr/src/libI77/iio.c create mode 100644 usr/src/libI77/inquire.c create mode 100644 usr/src/libI77/lib.c create mode 100644 usr/src/libI77/lio.c create mode 100644 usr/src/libI77/lio.h create mode 100644 usr/src/libI77/lread.c create mode 100644 usr/src/libI77/open.c create mode 100644 usr/src/libI77/pwd.c create mode 100644 usr/src/libI77/rdfmt.c create mode 100644 usr/src/libI77/rewind.c create mode 100644 usr/src/libI77/rsfe.c create mode 100644 usr/src/libI77/sfe.c create mode 100644 usr/src/libI77/stest.c create mode 100644 usr/src/libI77/sue.c create mode 100644 usr/src/libI77/uio.c create mode 100644 usr/src/libI77/util.c create mode 100644 usr/src/libI77/wrtfmt.c create mode 100644 usr/src/libI77/wsfe.c diff --git a/usr/src/libI77/Makefile b/usr/src/libI77/Makefile new file mode 100644 index 0000000000..0661f35bba --- /dev/null +++ b/usr/src/libI77/Makefile @@ -0,0 +1,42 @@ +.SUFFIXES: .o .x .c +CFLAGS=-O +.c.o: + $(CC) $(CFLAGS) -c $< +.c.x: + $(CC) $(CFLAGS) -c $< + ar ru libI77.a $*.o + -rm $*.o + > $*.x +FILES=backspace.x dfe.x due.x iio.x inquire.x \ + lib.x rewind.x rsfe.x \ + rdfmt.x sue.x uio.x wsfe.x sfe.x fmt.x \ + lio.x lread.x open.x close.x util.x \ + endfile.x wrtfmt.x err.x fmtlib.x +SOURCE=rewind.c endfile.c uio.c due.c dfe.c \ + Makefile backspace.c close.c err.c fio.h fmt.c fmt.h \ + fmtlib.c ftest.c lib.c open.c rdfmt.c rsfe.c sfe.c \ + sue.c util.c wrtfmt.c wsfe.c iio.c lio.h lio.c \ + inquire.c lread.c +libI77.a: $(FILES) +lio.h: ../vaxvax/ftypes + chmod 0666 lio.h +lio.x lread.x: lio.h +fmt.x rdfmt.x rsfe.x testfmt.x wrtfmt.x wsfe.x: fmt.h +$(FILES): fio.h /usr/include/stdio.h/ +45: $(SOURCE) Makefile + uucp $? res45!/v7/usr/src/libI77 + touch 45 +inter: $(SOURCE) Makefile + uucp $? inter!/usr/sif/fort/libI77 + touch inter +real: $(SOURCE) + cp $? /usr/src/libI77 + touch real +export: $(SOURCE) + cp $? /usr/sif/fort/11export/libI77 + touch export +install: + cp libI77.a /usr/lib/libI77.a +list: + @pr -w72 *.h *.c Makefile +all: inter real export diff --git a/usr/src/libI77/Makeout b/usr/src/libI77/Makeout new file mode 100644 index 0000000000..de0318060f --- /dev/null +++ b/usr/src/libI77/Makeout @@ -0,0 +1,40 @@ +cc -O -c lio.c +"lio.c", line 129: warning: illegal pointer combination +ar ru libI77.a lio.o +rm lio.o +> lio.x +cc -O -c lread.c +ar ru libI77.a lread.o +rm lread.o +> lread.x +cc -O -c open.c +ar ru libI77.a open.o +rm open.o +> open.x +cc -O -c close.c +ar ru libI77.a close.o +rm close.o +> close.x +cc -O -c util.c +"util.c", line 68: warning: illegal combination of pointer and integer +ar ru libI77.a util.o +rm util.o +> util.x +cc -O -c endfile.c +ar ru libI77.a endfile.o +rm endfile.o +> endfile.x +cc -O -c wrtfmt.c +"wrtfmt.c", line 73: warning: illegal combination of pointer and integer +"wrtfmt.c", line 93: warning: illegal combination of pointer and integer +ar ru libI77.a wrtfmt.o +rm wrtfmt.o +> wrtfmt.x +cc -O -c err.c +ar ru libI77.a err.o +rm err.o +> err.x +cc -O -c fmtlib.c +ar ru libI77.a fmtlib.o +rm fmtlib.o +> fmtlib.x diff --git a/usr/src/libI77/backspace.c b/usr/src/libI77/backspace.c new file mode 100644 index 0000000000..88049c324e --- /dev/null +++ b/usr/src/libI77/backspace.c @@ -0,0 +1,53 @@ +#include "fio.h" +f_back(a) alist *a; +{ unit *b; + int n,i; + long x; + char buf[32]; + if(a->aunit >= MXUNIT || a->aunit < 0) + err(a->aerr,101,"backspace") + b= &units[a->aunit]; + if(b->useek==0) err(a->aerr,106,"backspace") + if(b->ufd==NULL) err(a->aerr,114,"backspace") + if(b->uend==1) + { b->uend=0; + return(0); + } + if(b->uwrt) + { t_runc(b); + nowreading(b); + } + if(b->url>0) + { long y; + x=ftell(b->ufd); + y = x % b->url; + if(y == 0) x--; + x /= b->url; + x *= b->url; + fseek(b->ufd,x,0); + return(0); + } + if(b->ufmt==0) + { fseek(b->ufd,-(long)sizeof(int),1); + fread((char *)&n,sizeof(int),1,b->ufd); + fseek(b->ufd,-(long)n-2*sizeof(int),1); + return(0); + } + for(;;) + { long y; + y = x=ftell(b->ufd); + if(xufd,x,0); + n=fread(buf,1,(int)(y-x), b->ufd); + for(i=n-2;i>=0;i--) + { + if(buf[i]!='\n') continue; + fseek(b->ufd,(long)(i+1-n),1); + return(0); + } + if(x==0) return(0); + else if(n<=0) err(a->aerr,(EOF),"backspace") + fseek(b->ufd, x, 0); + } +} diff --git a/usr/src/libI77/close.c b/usr/src/libI77/close.c new file mode 100644 index 0000000000..97db3da6ba --- /dev/null +++ b/usr/src/libI77/close.c @@ -0,0 +1,49 @@ +#include "fio.h" +f_clos(a) cllist *a; +{ unit *b; + if(a->cunit >= MXUNIT) return(0); + b= &units[a->cunit]; + if(b->ufd==NULL) return(0); + b->uend=0; + if(a->csta!=0) + switch(*a->csta) + { + default: + keep: + case 'k': + if(b->uwrt) t_runc(b); + if(fclose(b->ufd) != 0) abort(); + if(b->ufnm!=0) free(b->ufnm); + b->ufnm=NULL; + b->ufd=NULL; + return(0); + case 'd': + delete: + fclose(b->ufd); + if(b->ufnm!=0) + { unlink(b->ufnm); /*SYSDEP*/ + free(b->ufnm); + } + b->ufnm=NULL; + b->ufd=NULL; + return(0); + } + else if(b->uscrtch==1) goto delete; + else goto keep; +} +f_exit() +{ int i; + cllist xx; + xx.cerr=1; + xx.csta=NULL; + for(i=0;iallocs && allocp<=alloct); + for(p=allocp; ; ) { + for(temp=0; ; ) { + if(!testbusy(p->ptr)) { + while(!testbusy((q=p->ptr)->ptr)) { + ASSERT(q>p&&qptr = q->ptr; + } + if(q>=p+nw && p+nw>=p) + goto found; + } + q = p; + p = clearbusy(p->ptr); + if(p>q) + ASSERT(p<=alloct); + else if(q!=alloct || p!=allocs) { + write(2,"corrupt arena\n",14); +#ifdef debug + abort(); +#endif + exit(0175); + } else if(++temp>1) + break; + } + temp = (nw+BLOCK/WORD)&~(BLOCK/WORD-1); + q = sbrk(temp*WORD); /*SYSDEP*/ + if((int)q == -1) + return(NULL); + ASSERT(q>alloct); + alloct->ptr = q; + if(q!=alloct+1) + alloct->ptr = setbusy(alloct->ptr); + alloct = q->ptr = q+temp-1; + alloct->ptr = setbusy(allocs); + } +found: + allocp = p + nw; + ASSERT(allocp<=alloct); + if(q>allocp) { + allocx = allocp->ptr; + allocp->ptr = p->ptr; + } + p->ptr = setbusy(allocp); +#ifdef verbose + printf("= %o\n",p+1); +#endif + return(p+1); +} +/* freeing strategy tuned for LIFO allocation +*/ +free(p) + struct store *p; +{ + struct store *savep=p; +#ifdef verbose + printf("free(%o)\n",p); +#endif + ASSERT(p>clearbusy(allocs[1].ptr)&&p<=alloct); + allocp = --p; + ASSERT(testbusy(p->ptr)); + p->ptr = clearbusy(p->ptr); + ASSERT(p->ptr > allocp && p->ptr <= alloct); +} +char *calloc(nbytes,count) +{ char *c; + c=(char *)malloc(nbytes*count); + return(c); +} +/* +ahist(s) char *s; +{ char **ap; + printf("%s allocp %o alloct %o\n",s,allocp,alloct); + for(ap= allocs;apptr = (s++)->ptr; + if(q

=p) + (q+(q+nw-p))->ptr = allocx; + return(q); +} diff --git a/usr/src/libI77/dfe.c b/usr/src/libI77/dfe.c new file mode 100644 index 0000000000..c7c6d1fb11 --- /dev/null +++ b/usr/src/libI77/dfe.c @@ -0,0 +1,118 @@ +#include "fio.h" +#include "fmt.h" +extern int rd_ed(),rd_ned(),y_getc(),y_putc(),y_err(); +extern int y_rev(), y_rsk(); +extern int w_ed(),w_ned(); +s_rdfe(a) cilist *a; +{ + int n; + if(!init) f_init(); + if(n=c_dfe(a,READ))return(n); + reading=1; + if(curunit->uwrt) nowreading(curunit); + getn = y_getc; + doed = rd_ed; + doned = rd_ned; + dorevert = donewrec = y_err; + doend = y_rsk; + if(pars_f(fmtbuf)<0) + err(a->cierr,100,"startio"); + fmt_bg(); + return(0); +} +s_wdfe(a) cilist *a; +{ + int n; + if(!init) f_init(); + if(n=c_dfe(a,WRITE)) return(n); + reading=0; + if(!curunit->uwrt) nowwriting(curunit); + putn = y_putc; + doed = w_ed; + doned= w_ned; + dorevert = donewrec = y_err; + doend = y_rev; + if(pars_f(fmtbuf)<0) + err(a->cierr,100,"startwrt"); + fmt_bg(); + return(0); +} +e_rdfe() +{ + en_fio(); + return(0); +} +e_wdfe() +{ + en_fio(); + return(0); +} +c_dfe(a,flag) cilist *a; +{ + sequential=0; + formatted=external=1; + elist=a; + cursor=scale=recpos=0; + if(a->ciunit>MXUNIT || a->ciunit<0) + err(a->cierr,101,"startchk"); + curunit = &units[a->ciunit]; + if(curunit->ufd==NULL && fk_open(flag,DIR,FMT,a->ciunit)) + err(a->cierr,104,"dfe"); + cf=curunit->ufd; + if(!curunit->ufmt) err(a->cierr,102,"dfe") + if(!curunit->useek) err(a->cierr,104,"dfe") + fmtbuf=a->cifmt; + fseek(cf,(long)curunit->url * (a->cirec-1),0); + curunit->uend = 0; + return(0); +} +y_rsk() +{ + if(curunit->uend || curunit->url <= recpos + || curunit->url == 1) return; + do { + getc(cf); + } while(++recpos < curunit->url); +} +y_getc() +{ + int ch; + if(curunit->uend) return(-1); + if((ch=getc(cf))!=EOF) + { + recpos++; + if(curunit->url>=recpos || + curunit->url==1) + return(ch); + else return(' '); + } + if(feof(cf)) + { + curunit->uend=1; + errno=0; + return(-1); + } + err(elist->cierr,errno,"readingd"); +} +y_putc(c) +{ + recpos++; + if(recpos <= curunit->url || curunit->url==1) + putc(c,cf); + else + err(elist->cierr,110,"dout"); + return(0); +} +y_rev() +{ /*what about work done?*/ + if(curunit->url==1 || recpos==curunit->url) + return(0); + while(recposurl) + (*putn)(' '); + recpos=0; + return(0); +} +y_err() +{ + err(elist->cierr, 110, "dfe"); +} diff --git a/usr/src/libI77/due.c b/usr/src/libI77/due.c new file mode 100644 index 0000000000..dae2cc6596 --- /dev/null +++ b/usr/src/libI77/due.c @@ -0,0 +1,48 @@ +#include "fio.h" +s_rdue(a) cilist *a; +{ + int n; + if(n=c_due(a,READ)) return(n); + reading=1; + if(curunit->uwrt) nowreading(curunit); + return(0); +} +s_wdue(a) cilist *a; +{ + int n; + if(n=c_due(a,WRITE)) return(n); + reading=0; + if(!curunit->uwrt) nowwriting(curunit); + return(0); +} +c_due(a,flag) cilist *a; +{ + if(!init) f_init(); + if(a->ciunit>=MXUNIT || a->ciunit<0) + err(a->cierr,101,"startio"); + recpos=sequential=formatted=0; + external=1; + curunit = &units[a->ciunit]; + elist=a; + if(curunit->ufd==NULL && fk_open(flag,DIR,UNF,a->ciunit) ) err(a->cierr,104,"due"); + cf=curunit->ufd; + if(curunit->ufmt) err(a->cierr,102,"cdue") + if(!curunit->useek) err(a->cierr,104,"cdue") + if(curunit->ufd==NULL) err(a->cierr,114,"cdue") + fseek(cf,(long)(a->cirec-1)*curunit->url,0); + curunit->uend = 0; + return(0); +} +e_rdue() +{ + if(curunit->url==1 || recpos==curunit->url) + return(0); + fseek(cf,(long)(curunit->url-recpos),1); + if(ftell(cf)%curunit->url) + err(elist->cierr,200,"syserr"); + return(0); +} +e_wdue() +{ + return(e_rdue()); +} diff --git a/usr/src/libI77/endfile.c b/usr/src/libI77/endfile.c new file mode 100644 index 0000000000..f0e05e19a8 --- /dev/null +++ b/usr/src/libI77/endfile.c @@ -0,0 +1,56 @@ +#include "fio.h" +static alist *ax; +f_end(a) alist *a; +{ + unit *b; + if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile"); + b = &units[a->aunit]; + if(b->ufd==NULL) return(0); + b->uend=1; + if( b->useek==0) return(0); + ax=a; + if(b->uwrt) nowreading(b); + return(t_runc(b)); +} +t_runc(b) unit *b; +{ + char buf[128],nm[16]; + FILE *tmp; + int n,m; + long loc,len; + if(b->url) return(0); /*don't truncate direct files*/ + loc=ftell(b->ufd); + fseek(b->ufd,0L,2); + len=ftell(b->ufd); + if(loc==len || b->useek==0 || b->ufnm==NULL) return(0); + strcpy(nm,"tmp.FXXXXXX"); + if(b->uwrt) nowreading(b); + mktemp(nm); + tmp=fopen(nm,"w"); + fseek(b->ufd,0L,0); + for(;loc>0;) + { + n=fread(buf,1,loc>128?128:(int)loc,b->ufd); + if(n>loc) n=loc; + loc -= n; + fwrite(buf,1,n,tmp); + } + fflush(tmp); + for(n=0;n<10;n++) + { + if((m=fork())==-1) continue; + else if(m==0) + { + execl("/bin/cp","cp",nm,b->ufnm,0); + execl("/usr/bin/cp","cp",nm,b->ufnm,0); + fprintf(stdout,"no cp\n"); + exit(1); + } + wait(&m); + if(m!=0) err(ax->aerr,111,"endfile"); + fclose(tmp); + unlink(nm); + return(0); + } + err(ax->aerr,111,"endfile"); +} diff --git a/usr/src/libI77/err.c b/usr/src/libI77/err.c new file mode 100644 index 0000000000..379186606f --- /dev/null +++ b/usr/src/libI77/err.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include "fio.h" +#define STR(x) (x==NULL?"":x) + +/*global definitions*/ +unit units[MXUNIT]; /*unit table*/ +flag init; /*0 on entry, 1 after initializations*/ +cilist *elist; /*active external io list*/ +flag reading; /*1 if reading, 0 if writing*/ +flag cplus,cblank; +char *fmtbuf; +flag external; /*1 if external io, 0 if internal */ +int (*doed)(),(*doned)(); +int (*doend)(),(*donewrec)(),(*dorevert)(); +flag sequential; /*1 if sequential io, 0 if direct*/ +flag formatted; /*1 if formatted io, 0 if unformatted*/ +int (*getn)(),(*putn)(); /*for formatted io*/ +FILE *cf; /*current file*/ +unit *curunit; /*current unit*/ +int recpos; /*place in current record*/ +int cursor,scale; + +/*error messages*/ +char *F_err[] = +{ + "error in format", + "illegal unit number", + "formatted io not allowed", + "unformatted io not allowed", + "direct io not allowed", + "sequential io not allowed", + "can't backspace file", + "null file name", + "can't stat file", + "unit not connected", + "off end of record", + "truncation failed in endfile", + "incomprehensible list input", + "out of free space", + "unit not connected", + "read unexpected character", + "blank logical input field", +}; +#define MAXERR (sizeof(F_err)/sizeof(char *)+100) +fatal(n,s) char *s; +{ + if(n<100 && n>=0) perror(s); /*SYSDEP*/ + else if(n>=(int)MAXERR) + { fprintf(stderr,"%s: illegal error number %d\n",s,n); + } + else if(n<0) fprintf(stderr,"%s: end of file %d\n",s,n); + else + fprintf(stderr,"%s: %s\n",s,F_err[n-100]); + fprintf(stderr,"apparent state: unit %d named %s\n",curunit-units, + STR(curunit->ufnm)); + fprintf(stderr,"last format: %s\n",STR(fmtbuf)); + fprintf(stderr,"lately %s %s %s %s IO\n",reading?"reading":"writing", + sequential?"sequential":"direct",formatted?"formatted":"unformatted", + external?"external":"internal"); + _cleanup(); + abort(); +} +/*initialization routine*/ +f_init() +{ unit *p; + init=1; + p= &units[0]; + p->ufd=stderr; + p->useek=canseek(stderr); + p->ufmt=1; + p->uwrt=1; + p = &units[5]; + p->ufd=stdin; + p->useek=canseek(stdin); + p->ufmt=1; + p->uwrt=0; + p= &units[6]; + p->ufd=stdout; + p->useek=canseek(stdout); + p->ufmt=1; + p->uwrt=1; +} +canseek(f) FILE *f; /*SYSDEP*/ +{ struct stat x; + fstat(fileno(f),&x); + if(x.st_nlink > 0 /*pipe*/ && !isatty(fileno(f))) + { + return(1); + } + return(0); +} +nowreading(x) unit *x; +{ + long loc; + x->uwrt=0; + loc=ftell(x->ufd); + freopen(x->ufnm,"r",x->ufd); + fseek(x->ufd,loc,0); +} +nowwriting(x) unit *x; +{ + long loc; + loc=ftell(x->ufd); + x->uwrt=1; + freopen(x->ufnm,"a",x->ufd); + fseek(x->ufd,loc,0); +} diff --git a/usr/src/libI77/fio.h b/usr/src/libI77/fio.h new file mode 100644 index 0000000000..fbd5911e4e --- /dev/null +++ b/usr/src/libI77/fio.h @@ -0,0 +1,110 @@ +#include +typedef long ftnint; +typedef ftnint flag; +typedef long ftnlen; +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; +/*units*/ +typedef struct +{ FILE *ufd; /*0=unconnected*/ + char *ufnm; + long uinode; + int url; /*0=sequential*/ + flag useek; /*true=can backspace, use dir, ...*/ + flag ufmt; + flag uprnt; + flag ublnk; + flag uend; + flag uwrt; /*last io was write*/ + flag uscrtch; +} unit; +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +extern int errno; +extern flag init; +extern cilist *elist; /*active external io list*/ +extern flag reading,external,sequential,formatted; +extern int (*getn)(),(*putn)(); /*for formatted io*/ +extern FILE *cf; /*current file*/ +extern unit *curunit; /*current unit*/ +extern unit units[]; +#define err(f,n,s) {if(f) errno= n; else fatal(n,s); return(n);} + +/*Table sizes*/ +#define MXUNIT 19 + +extern int recpos; /*position in current record*/ + +#define WRITE 1 +#define READ 2 +#define SEQ 3 +#define DIR 4 +#define FMT 5 +#define UNF 6 +#define EXT 7 +#define INT 8 diff --git a/usr/src/libI77/fmt.c b/usr/src/libI77/fmt.c new file mode 100644 index 0000000000..acd63ff992 --- /dev/null +++ b/usr/src/libI77/fmt.c @@ -0,0 +1,393 @@ +#include "fio.h" +#include "fmt.h" +#define skip(s) while(*s==' ') s++ +#ifdef interdata +#define SYLMX 300 +#endif +#ifdef pdp11 +#define SYLMX 300 +#endif +#ifdef vax +#define SYLMX 300 +#endif +#define GLITCH '\2' + /* special quote character for stu */ +extern int cursor,scale; +extern flag cblank,cplus; /*blanks in I and compulsory plus*/ +struct syl syl[SYLMX]; +int parenlvl,pc,revloc; +char *f_s(),*f_list(),*i_tem(),*gt_num(); +pars_f(s) char *s; +{ + parenlvl=revloc=pc=0; + if((s=f_s(s,0))==NULL) + { + return(-1); + } + return(0); +} +char *f_s(s,curloc) char *s; +{ + skip(s); + if(*s++!='(') + { + return(NULL); + } + if(parenlvl++ ==1) revloc=curloc; + if(op_gen(RET,curloc,0,0)<0 || + (s=f_list(s))==NULL) + { + return(NULL); + } + skip(s); + return(s); +} +char *f_list(s) char *s; +{ + for(;*s!=0;) + { skip(s); + if((s=i_tem(s))==NULL) return(NULL); + skip(s); + if(*s==',') s++; + else if(*s==')') + { if(--parenlvl==0) + { + op_gen(REVERT,revloc,0,0); + return(++s); + } + op_gen(GOTO,0,0,0); + return(++s); + } + } + return(NULL); +} +char *i_tem(s) char *s; +{ char *t; + int n,curloc; + if(*s==')') return(s); + if(ne_d(s,&t)) return(t); + if(e_d(s,&t)) return(t); + s=gt_num(s,&n); + if((curloc=op_gen(STACK,n,0,0))<0) return(NULL); + return(f_s(s,curloc)); +} +ne_d(s,p) char *s,**p; +{ int n,x,sign=0; + char *ap_end(); + switch(*s) + { + default: return(0); + case ':': op_gen(COLON,0,0,0); break; + case 'b': + if(*++s=='z') op_gen(BZ,0,0,0); + else op_gen(BN,0,0,0); + break; + case 's': + if(*(s+1)=='s') + { x=SS; + s++; + } + else if(*(s+1)=='p') + { x=SP; + s++; + } + else x=S; + op_gen(x,0,0,0); + break; + case '/': op_gen(SLASH,0,0,0); break; + case '-': sign=1; s++; /*OUTRAGEOUS CODING TRICK*/ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + s=gt_num(s,&n); + switch(*s) + { + default: return(0); + case 'p': if(sign) n= -n; op_gen(P,n,0,0); break; + case 'x': op_gen(X,n,0,0); break; + case 'H': + case 'h': op_gen(H,n,(int)(s+1),0); + s+=n; + break; + } + break; + case GLITCH: + case '"': + case '\'': op_gen(APOS,(int)s,0,0); + *p=ap_end(s); + return(1); + case 't': + if(*(s+1)=='l') + { x=TL; + s++; + } + else if(*(s+1)=='r') + { x=TR; + s++; + } + else x=T; + s=gt_num(s+1,&n); + s--; + op_gen(x,n,0,0); + break; + case 'x': op_gen(X,1,0,0); break; + case 'p': op_gen(P,1,0,0); break; + } + s++; + *p=s; + return(1); +} +e_d(s,p) char *s,**p; +{ int n,w,d,e,found=0,x=0; + char *sv=s; + s=gt_num(s,&n); + op_gen(STACK,n,0,0); + switch(*s++) + { + default: break; + case 'e': x=1; + case 'g': + found=1; + s=gt_num(s,&w); + if(w==0) break; + if(*s=='.') + { s++; + s=gt_num(s,&d); + } + else d=0; + if(*s!='E') + op_gen(x==1?E:G,w,d,0); + else + { s++; + s=gt_num(s,&e); + op_gen(x==1?EE:GE,w,d,e); + } + break; + case 'o': + found = 1; + s = gt_num(s, &w); + if(w==0) break; + op_gen(O, w, 0, 0); + break; + case 'l': + found=1; + s=gt_num(s,&w); + if(w==0) break; + op_gen(L,w,0,0); + break; + case 'a': + found=1; + skip(s); + if(*s>='0' && *s<='9') + { s=gt_num(s,&w); + if(w==0) break; + op_gen(AW,w,0,0); + break; + } + op_gen(A,0,0,0); + break; + case 'f': + found=1; + s=gt_num(s,&w); + if(w==0) break; + if(*s=='.') + { s++; + s=gt_num(s,&d); + } + else d=0; + op_gen(F,w,d,0); + break; + case 'd': + found=1; + s=gt_num(s,&w); + if(w==0) break; + if(*s=='.') + { s++; + s=gt_num(s,&d); + } + else d=0; + op_gen(D,w,d,0); + break; + case 'i': + found=1; + s=gt_num(s,&w); + if(w==0) break; + if(*s!='.') + { op_gen(I,w,0,0); + break; + } + s++; + s=gt_num(s,&d); + op_gen(IM,w,d,0); + break; + } + if(found==0) + { pc--; /*unSTACK*/ + *p=sv; + return(0); + } + *p=s; + return(1); +} +op_gen(a,b,c,d) +{ struct syl *p= &syl[pc]; + if(pc>=SYLMX) + { fprintf(stderr,"format too complicated:\n%s\n", + fmtbuf); + abort(); + } + p->op=a; + p->p1=b; + p->p2=c; + p->p3=d; + return(pc++); +} +char *gt_num(s,n) char *s; int *n; +{ int m=0,cnt=0; + char c; + for(c= *s;;c = *s) + { if(c==' ') + { s++; + continue; + } + if(c>'9' || c<'0') break; + m=10*m+c-'0'; + cnt++; + s++; + } + if(cnt==0) *n=1; + else *n=m; + return(s); +} +#define STKSZ 10 +int cnt[STKSZ],ret[STKSZ],cp,rp; +flag workdone; +en_fio() +{ ftnint one=1; + return(do_fio(&one,NULL,0l)); +} +do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; +{ struct syl *p; + int n,i; + for(i=0;i<*number;i++,ptr+=len) + { +loop: switch(type_f((p= &syl[pc])->op)) + { + default: + fprintf(stderr,"unknown code in do_fio: %d\n%s\n", + p->op,fmtbuf); + err(elist->cierr,100,"do_fio"); + case NED: + if((*doned)(p,ptr)) + { pc++; + goto loop; + } + pc++; + continue; + case ED: + if(cnt[cp]<=0) + { cp--; + pc++; + goto loop; + } + if(ptr==NULL) + return((*doend)()); + cnt[cp]--; + workdone=1; + if((n=(*doed)(p,ptr,len))>0) err(elist->cierr,errno,"fmt"); + if(n<0) err(elist->ciend,(EOF),"fmt"); + continue; + case STACK: + cnt[++cp]=p->p1; + pc++; + goto loop; + case RET: + ret[++rp]=p->p1; + pc++; + goto loop; + case GOTO: + if(--cnt[cp]<=0) + { cp--; + rp--; + pc++; + goto loop; + } + pc=1+ret[rp--]; + goto loop; + case REVERT: + rp=cp=0; + pc = p->p1; + if(ptr==NULL) + return((*doend)()); + if(!workdone) return(0); + if((n=(*dorevert)()) != 0) return(n); + goto loop; + case COLON: + if(ptr==NULL) + return((*doend)()); + pc++; + goto loop; + case S: + case SS: + cplus=0; + pc++; + goto loop; + case SP: + cplus = 1; + pc++; + goto loop; + case P: scale=p->p1; + pc++; + goto loop; + case BN: + cblank=0; + pc++; + goto loop; + case BZ: + cblank=1; + pc++; + goto loop; + } + } + return(0); +} +fmt_bg() +{ + workdone=cp=rp=pc=cursor=0; + cnt[0]=ret[0]=0; +} +type_f(n) +{ + switch(n) + { + default: + return(n); + case RET: + return(RET); + case REVERT: return(REVERT); + case GOTO: return(GOTO); + case STACK: return(STACK); + case X: + case SLASH: + case APOS: case H: + case T: case TL: case TR: + return(NED); + case F: + case I: + case IM: + case A: case AW: + case O: + case L: + case E: case EE: case D: + case G: case GE: + return(ED); + } +} +char *ap_end(s) char *s; +{ char quote; + quote= *s++; + for(;*s;s++) + { if(*s!=quote) continue; + if(*++s!=quote) return(s); + } + err(elist->cierr,100,"bad string"); +} diff --git a/usr/src/libI77/fmt.h b/usr/src/libI77/fmt.h new file mode 100644 index 0000000000..0f1b49841d --- /dev/null +++ b/usr/src/libI77/fmt.h @@ -0,0 +1,56 @@ +struct syl +{ int op,p1,p2,p3; +}; +#define RET 1 +#define REVERT 2 +#define GOTO 3 +#define X 4 +#define SLASH 5 +#define STACK 6 +#define I 7 +#define ED 8 +#define NED 9 +#define IM 10 +#define APOS 11 +#define H 12 +#define TL 13 +#define TR 14 +#define T 15 +#define COLON 16 +#define S 17 +#define SP 18 +#define SS 19 +#define P 20 +#define BN 21 +#define BZ 22 +#define F 23 +#define E 24 +#define EE 25 +#define D 26 +#define G 27 +#define GE 28 +#define L 29 +#define A 30 +#define AW 31 +#define O 32 +extern struct syl syl[]; +extern int pc,parenlvl,revloc; +extern int (*doed)(),(*doned)(); +extern int (*dorevert)(),(*donewrec)(),(*doend)(); +extern flag cblank,cplus,workdone; +extern int dummy(); +extern char *fmtbuf; +extern int scale; +typedef union +{ float pf; + double pd; +} ufloat; +typedef union +{ short is; + char ic; + long il; +} uint; +#define GET(x) if((x=(*getn)())<0) return(x) +#define VAL(x) (x!='\n'?x:' ') +#define PUT(x) (*putn)(x) +extern int cursor; diff --git a/usr/src/libI77/fmtlib.c b/usr/src/libI77/fmtlib.c new file mode 100644 index 0000000000..d745c6677d --- /dev/null +++ b/usr/src/libI77/fmtlib.c @@ -0,0 +1,23 @@ +#define MAXINTLENGTH 12 +char *icvt(value,ndigit,sign, base) long value; int *ndigit,*sign; +register int base; +{ static char buf[MAXINTLENGTH+1]; + register int i; + if(value>0) *sign=0; + else if(value<0) + { value = -value; + *sign= 1; + } + else + { *sign=0; + *ndigit=1; + buf[MAXINTLENGTH]='0'; + return(&buf[MAXINTLENGTH]); + } + for(i=MAXINTLENGTH-1;value>0;i--) + { *(buf+i)=(int)(value%base)+'0'; + value /= base; + } + *ndigit=MAXINTLENGTH-1-i; + return(&buf[i+1]); +} diff --git a/usr/src/libI77/ftest.c b/usr/src/libI77/ftest.c new file mode 100644 index 0000000000..695ab40171 --- /dev/null +++ b/usr/src/libI77/ftest.c @@ -0,0 +1,42 @@ +#include "fio.h" +#define FLOAT double +cilist x,y; +main(argc,argv) char **argv; +{ FLOAT dd[20]; + int ret[22]; + long one=1; + int i,n,j; + if(argc<2) + { fprintf(stderr,"%s infmt [outfmt] [n]\n",argv[0]); + exit(1); + } + setcilist(&x,5,argv[1],0,1,1); + argc--; + argv++; + if(argc<2 || argv[1][0]!='(') + setcilist(&y,6,argv[0],0,1,1); + else + { setcilist(&y,6,argv[1],0,1,1); + argc--; + argv++; + } + if(argc>=2) n=atoi(argv[1]); + else n=1; + j=0; + ret[j++]=s_rsfe(&x); + for(i=0;i= icend) err(svic->iciend,(EOF),"endfile"); + if(icpos++ < svic->icirlen) + return(*icptr++); + else err(svic->icierr,110,"recend"); +} +z_putc(c) +{ + if(icptr >= icend) err(svic->icierr,110,"inwrite"); + if(icpos++ < svic->icirlen) + *icptr++ = c; + else err(svic->icierr,110,"recend"); + return(0); +} +z_rnew() +{ + icptr = svic->iciunit + (++icnum)*svic->icirlen; + icpos = 0; +} +s_rsfi(a) icilist *a; +{ int n; + if(n=c_si(a)) return(n); + reading=1; + doed=rd_ed; + doned=rd_ned; + getn=z_getc; + dorevert = donewrec = y_ierr; + doend = z_rnew; + return(0); +} +s_wsfi(a) icilist *a; +{ int n; + if(n=c_si(a)) return(n); + reading=0; + doed=w_ed; + doned=w_ned; + putn=z_putc; + dorevert = donewrec = y_ierr; + doend = z_wnew; + return(0); +} +c_si(a) icilist *a; +{ + fmtbuf=a->icifmt; + if(pars_f(fmtbuf)<0) + err(a->icierr,100,"startint"); + fmt_bg(); + sequential=formatted=1; + external=0; + cblank=cplus=scale=0; + svic=a; + icnum=icpos=0; + icptr=svic->iciunit; + icend=icptr+svic->icirlen*svic->icirnum; + return(0); +} +z_wnew() +{ + while(icpos++ < svic->icirlen) + *icptr++ = ' '; + icpos = 0; + icnum++; +} +e_rsfi() +{ int n; + n = en_fio(); + fmtbuf = NULL; + return(n); +} +e_wsfi() +{ + int n; + n = en_fio(); + fmtbuf = NULL; + if(icnum >= svic->icirnum) + return(n); + while(icpos++ < svic->icirlen) + *icptr++ = ' '; + return(n); +} +y_ierr() +{ + err(elist->cierr, 110, "iio"); +} diff --git a/usr/src/libI77/inquire.c b/usr/src/libI77/inquire.c new file mode 100644 index 0000000000..24925c1488 --- /dev/null +++ b/usr/src/libI77/inquire.c @@ -0,0 +1,77 @@ +#include "fio.h" +f_inqu(a) inlist *a; +{ flag byfile,legal; + int i; + unit *p; + char buf[256]; + long x; + if(a->infile!=NULL) + { byfile=1; + g_char(a->infile,a->infilen,buf); + x=inode(buf); + for(i=0,p=NULL;iinunitinunit>=0) + { legal=1; + p= &units[a->inunit]; + } + else + { legal=0; + p=NULL; + } + } + if(a->inex!=NULL) + if(byfile && x>0 || !byfile && p!=NULL) + *a->inex=1; + else *a->inex=0; + if(a->inopen!=NULL) + if(byfile) *a->inopen=(p!=NULL); + else *a->inopen=(p!=NULL && p->ufd!=NULL); + if(a->innum!=NULL) *a->innum= p-units; + if(a->innamed!=NULL) + if(byfile || p!=NULL && p->ufnm!=NULL) + *a->innamed=1; + else *a->innamed=0; + if(a->inname!=NULL) + if(byfile) + b_char(buf,a->inname,a->innamlen); + else if(p!=NULL && p->ufnm!=NULL) + b_char(p->ufnm,a->inname,a->innamlen); + if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL) + if(p->url) + b_char("direct",a->inacc,a->inacclen); + else b_char("sequential",a->inacc,a->inacclen); + if(a->inseq!=NULL) + if(byfile || p!=NULL && p->useek) + b_char("yes",a->inseq,a->inseqlen); + else b_char("no",a->inseq,a->inseqlen); + if(a->indir!=NULL) + if(byfile || p!=NULL && p->useek) + b_char("yes",a->indir,a->indirlen); + else b_char("no",a->indir,a->indirlen); + if(a->infmt!=NULL) + if(p!=NULL && p->ufmt) + b_char("formatted",a->infmt,a->infmtlen); + else if(p!=NULL) + b_char("unformatted",a->infmt,a->infmtlen); + if(a->inform!=NULL) + b_char("yes",a->inform,a->informlen); + if(a->inunf) + if(byfile || p!=NULL && p->useek) + b_char("yes",a->inunf,a->inunflen); + else b_char("unknown",a->inunf,a->inunflen); + if(a->inrecl!=NULL && p!=NULL) + *a->inrecl=p->url; + if(a->innrec!=NULL && p!=NULL && p->url>0) + *a->innrec=ftell(p->ufd)/p->url+1; + if(a->inblank && p!=NULL && p->ufmt) + if(p->ublnk) + b_char("zero",a->inblank,a->inblanklen); + else b_char("blank",a->inblank,a->inblanklen); + return(0); +} diff --git a/usr/src/libI77/lib.c b/usr/src/libI77/lib.c new file mode 100644 index 0000000000..1a1e5e9c06 --- /dev/null +++ b/usr/src/libI77/lib.c @@ -0,0 +1,33 @@ +#include "fio.h" +setcilist(x,u,fmt,rec,xerr,end) cilist *x; +char *fmt; +{ + x->ciunit=u; + x->cifmt=fmt; + x->cirec=rec; + x->cierr=xerr; + x->ciend=end; +} +setolist(x,xunit,fname,sta,fm,rl,blnk,oerr) olist *x; + char *fname,*sta,*fm,*blnk; +{ + x->oerr=oerr; + x->ounit=xunit; + x->ofnm=fname; + x->ofnmlen=strlen(fname); + x->osta=sta; + x->ofm=fm; + x->orl=rl; + x->oblnk=blnk; +} +stcllist(x,xunit,stat,cerr) cllist *x; char *stat; +{ + x->cerr=cerr; + x->cunit=xunit; + x->csta=stat; +} +setalist(x,xunit,aerr) alist *x; +{ + x->aunit=xunit; + x->aerr=aerr; +} diff --git a/usr/src/libI77/lio.c b/usr/src/libI77/lio.c new file mode 100644 index 0000000000..c859337bcd --- /dev/null +++ b/usr/src/libI77/lio.c @@ -0,0 +1,132 @@ +#include "fio.h" +#include "lio.h" +extern int l_write(); +int t_putc(); +s_wsle(a) cilist *a; +{ + int n; + if(!init) f_init(); + if(n=c_le(a,WRITE)) return(n); + reading=0; + external=1; + formatted=1; + putn = t_putc; + lioproc = l_write; + if(!curunit->uwrt) + return(nowwriting(curunit)); + else return(0); +} +e_wsle() +{ + t_putc('\n'); + recpos=0; + return(0); +} +t_putc(c) +{ + recpos++; + putc(c,cf); +} +lwrt_I(n) ftnint n; +{ + char buf[LINTW],*p; + sprintf(buf," %ld",(long)n); + if(recpos+strlen(buf)>=LINE) + { t_putc('\n'); + recpos=0; + } + for(p=buf;*p;t_putc(*p++)); +} +lwrt_L(n) ftnint n; +{ + if(recpos+LLOGW>=LINE) + { t_putc('\n'); + recpos=0; + } + wrt_L(&n,LLOGW); +} +lwrt_A(p,len) char *p; ftnlen len; +{ + int i; + if(recpos+len>=LINE) + { + t_putc('\n'); + recpos=0; + } + t_putc(' '); + for(i=0;i=LINE) + { + t_putc('\n'); + recpos=0; + } + scale=0; + wrt_F(&n,LFW,LFD,(ftnlen)sizeof(n)); + } + else + { + if(recpos+LEW>=LINE) + { t_putc('\n'); + recpos=0; + } + wrt_E(&n,LEW,LED,LEE,(ftnlen)sizeof(n)); + } +} +lwrt_C(a,b) double a,b; +{ + if(recpos+2*LFW+3>=LINE) + { t_putc('\n'); + recpos=0; + } + t_putc(' '); + t_putc('('); + lwrt_F(a); + t_putc(','); + lwrt_F(b); + t_putc(')'); +} +l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len; +{ + int i; + ftnint x; + double y,z; + float *xx; + double *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); + break; + case TYCHAR: lwrt_A((char *)ptr,len); + break; + } + ptr = (char *)ptr + len; + } + return(0); +} diff --git a/usr/src/libI77/lio.h b/usr/src/libI77/lio.h new file mode 100644 index 0000000000..d54bf037c3 --- /dev/null +++ b/usr/src/libI77/lio.h @@ -0,0 +1,41 @@ +/* copy of ftypes from the compiler */ +/* variable types + * numeric assumptions: + * int < reals < complexes + * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX + */ + +#define TYUNKNOWN 0 +#define TYADDR 1 +#define TYSHORT 2 +#define TYLONG 3 +#define TYREAL 4 +#define TYDREAL 5 +#define TYCOMPLEX 6 +#define TYDCOMPLEX 7 +#define TYLOGICAL 8 +#define TYCHAR 9 +#define TYSUBR 10 +#define TYERROR 11 + +#define NTYPES (TYERROR+1) + +#define LINTW 12 +#define LINE 80 +#define LLOGW 2 +#define LLOW 1.0 +#define LHIGH 10.0 +#define LFW 12 +#define LFD 8 +#define LEW 16 +#define LED 9 +#define LEE 2 + +typedef union +{ short flshort; + ftnint flint; + float flreal; + double fldouble; +} flex; +extern int scale; +extern int (*lioproc)(); diff --git a/usr/src/libI77/lread.c b/usr/src/libI77/lread.c new file mode 100644 index 0000000000..725f77cc26 --- /dev/null +++ b/usr/src/libI77/lread.c @@ -0,0 +1,379 @@ +#include "fio.h" +#include "fmt.h" +#include "lio.h" +#include "ctype.h" +extern char *fmtbuf; +int (*lioproc)(); + +#define isblnk(x) (ltab[x+1]&B) +#define issep(x) (ltab[x+1]&SX) +#define isapos(x) (ltab[x+1]&AX) +#define isexp(x) (ltab[x+1]&EX) +#define issign(x) (ltab[x+1]&SG) +#define SX 1 +#define B 2 +#define AX 4 +#define EX 8 +#define SG 16 +char ltab[128+1] = { /* offset one for EOF */ + 0, + 0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +char l_comma, l_first; +t_getc() +{ int ch; + if(curunit->uend) return(EOF); + if((ch=getc(cf))!=EOF) return(ch); + if(feof(cf)) curunit->uend = 1; + return(EOF); +} +e_rsle() +{ + int ch; + if(curunit->uend) return(0); + while((ch=t_getc())!='\n' && ch!=EOF); + return(0); +} + +flag lquit; +int lcount,ltype; +char *lchar; +double lx,ly; +#define ERR(x) if(n=(x)) return(n) +#define GETC(x) (x=t_getc()) + +l_read(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len; +{ int i,n,ch; + double *yy; + float *xx; + for(i=0;i<*number;i++) + { + if(lquit) return(0); + if(curunit->uend) err(elist->ciend, EOF, "list in") + if(lcount == 0) { + ltype = NULL; + if(!l_first) l_comma = 0; + else l_first = 0; + for(;;) { + GETC(ch); + switch(ch) { + case EOF: + goto loopend; + case ' ': + case '\n': + continue; + case '/': + lquit = 1; + goto loopend; + case ',': + if(l_comma) { + lcount = 1; + ungetc(ch, cf); + goto loopend; + } + l_comma = 1; + continue; + default: + ungetc(ch, cf); + goto rddata; + } + } + } + rddata: + switch((int)type) + { + case TYSHORT: + case TYLONG: + case TYREAL: + case TYDREAL: + ERR(l_R()); + break; + case TYCOMPLEX: + case TYDCOMPLEX: + ERR(l_C()); + break; + case TYLOGICAL: + ERR(l_L()); + break; + case TYCHAR: + ERR(l_CHAR()); + break; + } + loopend: + if(lquit) return(0); + if(feof(cf)) err(elist->ciend,(EOF),"list in") + else if(ferror(cf)) + { clearerr(cf); + err(elist->cierr,errno,"list in") + } + if(ltype==NULL) goto bump; + switch((int)type) + { + case TYSHORT: + ptr->flshort=lx; + break; + case TYLOGICAL: + case TYLONG: + ptr->flint=lx; + break; + case TYREAL: + ptr->flreal=lx; + break; + case TYDREAL: + ptr->fldouble=lx; + break; + case TYCOMPLEX: + xx=(float *)ptr; + *xx++ = lx; + *xx = ly; + break; + case TYDCOMPLEX: + yy=(double *)ptr; + *yy++ = lx; + *yy = ly; + break; + case TYCHAR: + b_char(lchar,(char *)ptr,len); + break; + } + bump: + if(lcount>0) lcount--; + ptr = (flex *)((char *)ptr + len); + } + return(0); +} +l_R() +{ double a,b,c,d; + int i,ch,sign=0,da,db,dc; + a=b=c=d=0; + da=db=dc=0; + if(lcount>0) return(0); + ltype=NULL; + da=rd_int(&a); + if(da== -1) sign=da; + if(GETC(ch)!='*') + { ungetc(ch,cf); + db=1; + b=a; + a=1; + } + else + db=rd_int(&b); + if(GETC(ch)!='.') + { dc=c=0; + ungetc(ch,cf); + } + else dc=rd_int(&c); + if(isexp(GETC(ch))) db=rd_int(&d); + else if(issign(ch)) + { ungetc(ch, cf); + db = rd_int(&d); + } + else + { ungetc(ch,cf); + d=0; + } + lcount=a; + if(!db && !dc) + return(0); + if(db && b<0) + { sign=1; + b = -b; + } + for(i=0;i0) return(0); + ltype=NULL; + GETC(ch); + if(ch!='(') + { if(fscanf(cf,"%d",&lcount)!=1) + if(!feof(cf)) err(elist->cierr,112,"complex format") + else err(elist->cierr,(EOF),"lread"); + if(GETC(ch)!='*') + { ungetc(ch,cf); + if(!feof(cf)) err(elist->cierr,112,"no star") + else err(elist->cierr,(EOF),"lread"); + } + if(GETC(ch)!='(') + { ungetc(ch,cf); + return(0); + } + } + lcount = 1; + ltype=TYLONG; + fscanf(cf,"%lf",&lx); + while(isblnk(GETC(ch)) || (ch == '\n')); + if(ch!=',') + { ungetc(ch,cf); + err(elist->cierr,112,"no comma"); + } + while(isblnk(GETC(ch))); + ungetc(ch,cf); + fscanf(cf,"%lf",&ly); + while(isblnk(GETC(ch))); + if(ch!=')') err(elist->cierr,112,"no )"); + while(isblnk(GETC(ch))); + if(ch != '\n') ungetc(ch,cf); + return(0); +} +l_L() +{ + int ch; + if(lcount>0) return(0); + ltype=NULL; + GETC(ch); + if(isdigit(ch)) + { ungetc(ch,cf); + fscanf(cf,"%d",&lcount); + if(GETC(ch)!='*') + if(!feof(cf)) err(elist->cierr,112,"no star") + else err(elist->cierr,(EOF),"lread"); + } + else ungetc(ch,cf); + if(GETC(ch)=='.') GETC(ch); + switch(ch) + { + case 't': + case 'T': + lx=1; + break; + case 'f': + case 'F': + lx=0; + break; + default: + if(isblnk(ch) || issep(ch) || ch==EOF) + { ungetc(ch,cf); + return(0); + } + else err(elist->cierr,112,"logical"); + } + ltype=TYLONG; + lcount = 1; + while(!issep(GETC(ch)) && ch!=EOF); + ungetc(ch, cf); + return(0); +} +#define BUFSIZE 128 +l_CHAR() +{ int ch,size,i; + char quote,*p; + if(lcount>0) return(0); + ltype=NULL; + + GETC(ch); + if(isdigit(ch)) + { ungetc(ch,cf); + fscanf(cf,"%d",&lcount); + if(GETC(ch)!='*') err(elist->cierr,112,"no star"); + } + else ungetc(ch,cf); + if(GETC(ch)=='\'' || ch=='"') quote=ch; + else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) + { ungetc(ch,cf); + return(0); + } + else err(elist->cierr,112,"no quote"); + ltype=TYCHAR; + if(lchar!=NULL) free(lchar); + size=BUFSIZE; + p=lchar=(char *)malloc(size); + if(lchar==NULL) err(elist->cierr,113,"no space"); + for(i=0;;) + { while(GETC(ch)!=quote && ch!='\n' + && ch!=EOF && ++iuwrt) + return(nowreading(curunit)); + else return(0); +} +c_le(a,flag) cilist *a; +{ + fmtbuf="list io"; + if(a->ciunit>=MXUNIT || a->ciunit<0) + err(a->cierr,101,"stler"); + scale=recpos=0; + elist=a; + curunit = &units[a->ciunit]; + if(curunit->ufd==NULL && fk_open(flag,SEQ,FMT,a->ciunit)) + err(a->cierr,102,"lio"); + cf=curunit->ufd; + if(!curunit->ufmt) err(a->cierr,103,"lio") + return(0); +} +do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len; +{ + return((*lioproc)(number,ptr,len,*type)); +} diff --git a/usr/src/libI77/open.c b/usr/src/libI77/open.c new file mode 100644 index 0000000000..ab892a2860 --- /dev/null +++ b/usr/src/libI77/open.c @@ -0,0 +1,106 @@ +#include "sys/types.h" +#include "sys/stat.h" +#include "fio.h" +f_open(a) olist *a; +{ unit *b; + int n; + char buf[256]; + cllist x; + if(a->ounit>=MXUNIT || a->ounit<0) + err(a->oerr,101,"open") + b= &units[a->ounit]; + if(b->ufd!=0) goto connected; +unconnected: + b->url=a->orl; + if(a->oblnk && *a->oblnk=='b') b->ublnk=1; + else b->ublnk=0; + if(a->ofm==0) + { if(b->url>0) b->ufmt=0; + else b->ufmt=1; + } + else if(*a->ofm=='f') b->ufmt=1; + else b->ufmt=0; + if(a->osta==0) goto unknown; + switch(*a->osta) + { + unknown: + default: + case 'o': + if(a->ofnm==0) err(a->oerr,107,"open") + g_char(a->ofnm,a->ofnmlen,buf); + b->uscrtch=0; + if(*a->osta=='o' && access(buf,0)) + err(a->oerr,errno,"open") + done: + b->ufnm=(char *) calloc(strlen(buf)+1,sizeof(char)); + if(b->ufnm==NULL) err(a->oerr,113,"no space"); + strcpy(b->ufnm,buf); + b->uend=0; + if(isdev(buf)) + { b->ufd = fopen(buf,"r"); + if(b->ufd==NULL) err(a->oerr,errno,buf) + else b->uwrt = 0; + } + else + { b->ufd = fopen(buf, "a"); + if(b->ufd != NULL) b->uwrt = 1; + else if((b->ufd = fopen(buf, "r")) != NULL) + { fseek(b->ufd, 0L, 2); + b->uwrt = 0; + } + else err(a->oerr, errno, buf) + } + b->useek=canseek(b->ufd); + if((b->uinode=inode(buf))==-1) + err(a->oerr,108,"open") + if(a->orl && b->useek) rewind(b->ufd); + return(0); + case 's': + b->uscrtch=1; + strcpy(buf,"tmp.FXXXXXX"); + mktemp(buf); + goto done; + case 'n': + b->uscrtch=0; + if(a->ofnm==0) err(a->oerr,107,"open") + g_char(a->ofnm,a->ofnmlen,buf); + /*SYSDEP access*/ + if(access(buf, 0) == -1) close(creat(buf, 0666)); + goto done; + } +connected: + if(a->ofnm==0) + { + same: if(a->oblnk!= 0) b->ublnk= *a->oblnk== 'b'?0:1; + return(0); + } + g_char(a->ofnm,a->ofnmlen,buf); + if(inode(buf)==b->uinode) goto same; + x.cunit=a->ounit; + x.csta=0; + x.cerr=a->oerr; + if((n=f_clos(&x))!=0) return(n); + goto unconnected; +} +fk_open(rd,seq,fmt,n) ftnint n; +{ char nbuf[10]; + olist a; + sprintf(nbuf,"fort.%D",n); + a.oerr=1; + a.ounit=n; + a.ofnm=nbuf; + a.ofnmlen=strlen(nbuf); + a.osta=NULL; + a.oacc= seq==SEQ?"s":"d"; + a.ofm = fmt==FMT?"f":"u"; + a.orl = seq==DIR?1:0; + a.oblnk=NULL; + return(f_open(&a)); +} +isdev(s) char *s; +{ struct stat x; + int j; + if(stat(s, &x) == -1) return(0); + if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(0); + else return(1); +} diff --git a/usr/src/libI77/pwd.c b/usr/src/libI77/pwd.c new file mode 100644 index 0000000000..e3cad7e21f --- /dev/null +++ b/usr/src/libI77/pwd.c @@ -0,0 +1,78 @@ +/* + * Print working (current) directory + */ +#include +#include +#include + +char dot[] "."; +char dotdot[] ".."; +char root[] "/"; +char name[512]; +int file; +int off -1; +struct stat x; +struct direct y; + +main() +{ + for (;;) { + stat(dot, &x); + if ((file = open(dotdot,0)) < 0) prname(); + do { + if (read(file, &y, sizeof(y)) < sizeof(y)) + prname(); + } while (y.d_ino != x.st_ino); + close(file); + if (y.d_ino == 2) + ckroot(); + cat(); + chdir(dotdot); + } +} + +ckroot() +{ + register i; + + if (stat(y.d_name,&x)<0 || chdir(root)<0 || (file=open(root,0))<0) + prname(); + i = x.st_dev; + do { + if (read(file,&y,sizeof(y)) < sizeof(y)) + prname(); + if (y.d_ino == 0) + continue; + if (stat(y.d_name,&x) < 0) + prname(); + } while (x.st_dev!=i || (x.st_mode&S_IFMT)!=S_IFDIR); + if (strcmp(dot, y.d_name) || strcmp(dotdot, y.d_name)) + cat(); + write(1, root, 1); + prname(); +} + +prname() +{ + if (off<0) + off = 0; + name[off] = '\n'; + write(1, name, off+1); + exit(0); +} + +cat() +{ + register i, j; + + i = -1; + while (y.d_name[++i] != 0); + if ((off+i+2) > 511) + prname(); + for(j=off+1; j>=0; --j) + name[j+i+1] = name[j]; + off=i+off+1; + name[i] = root[0]; + for(--i; i>=0; --i) + name[i] = y.d_name[i]; +} diff --git a/usr/src/libI77/rdfmt.c b/usr/src/libI77/rdfmt.c new file mode 100644 index 0000000000..5d42d6be0d --- /dev/null +++ b/usr/src/libI77/rdfmt.c @@ -0,0 +1,221 @@ +#include "fio.h" +#include "fmt.h" +extern int cursor; +rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; +{ int ch; + for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch); + if(cursor<0) + { if(recpos+cursor < 0) err(elist->cierr,110,"fmt") + if(curunit->useek) fseek(cf,(long) cursor,1); + else err(elist->cierr,106,"fmt"); + cursor=0; + } + switch(p->op) + { + default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n", + p->op,fmtbuf); + abort(); + case I: ch = (rd_I(ptr,p->p1,len, 10)); + break; + case IM: ch = (rd_I(ptr,p->p1,len, 10)); + break; + case O: ch = (rd_I(ptr, p->p1, len, 8)); + break; + case L: ch = (rd_L(ptr,p->p1)); + break; + case A: ch = (rd_A(ptr,len)); + break; + case AW: + ch = (rd_AW(ptr,p->p1,len)); + break; + case E: case EE: + case D: + case G: + case GE: + case F: ch = (rd_F(ptr,p->p1,p->p2,len)); + break; + } + if(ch == 0) return(ch); + else if(feof(cf)) return(EOF); + clearerr(cf); + return(errno); +} +rd_ned(p,ptr) char *ptr; struct syl *p; +{ + switch(p->op) + { + default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n", + p->op,fmtbuf); + abort(); + case APOS: + return(rd_POS(p->p1)); + case H: return(rd_H(p->p1,p->p2)); + case SLASH: return((*donewrec)()); + case TR: + case X: cursor += p->p1; + return(1); + case T: cursor=p->p1-recpos - 1; + return(1); + case TL: cursor -= p->p1; + return(1); + } +} +rd_I(n,w,len, base) ftnlen len; uint *n; register int base; +{ long x=0; + int i,sign=0,ch; + for(i=0;iis=x; + else if(len == sizeof(char)) n->ic = x; + else n->il=x; + return(0); +} +rd_L(n,w) ftnint *n; +{ int ch,i,v = -1; + for(i=0;i='0') + x=10*x+ch-'0'; + else if(ch=='e' || ch=='d' || ch=='.') + break; + else if(cblank && (ch==' ' || ch== '\n')) x*=10; + else if(ch==',') + { i=w; + break; + } + else return(errno = 115); + } + if(ch=='.') dot=1; + while(i='0') + y=10*y+ch-'0'; + else if(cblank && (ch==' ' || ch == '\n')) + y *= 10; + else if(ch==',') {i=w; break;} + else if(ch==' ') continue; + else continue; + ny++; + } +expon: + if(ch=='-') sz=1; + while(i='0') + z=10*z+ch-'0'; + else if(cblank && (ch==' ' || ch == '\n')) + z *= 10; + else if(ch==',') break; + else if(ch==' ') continue; + else if(ch=='+') continue; + else if(ch!='\n') return(errno=115); + } + if(!dot) + for(i=0;i0;i--) x /= 10; + for(i=scale;i<0;i++) x *= 10; + } + if(len==sizeof(float)) p->pf=x; + else p->pd=x; + return(0); +} +rd_A(p,len) char *p; ftnlen len; +{ int i,ch; + for(i=0;i=len) + { for(i=0;iaunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"rewind"); + b = &units[a->aunit]; + if(b->ufd == NULL) return(0); + if(!b->useek) err(a->aerr,106,"rewind") + if(b->uwrt) + { nowreading(b); + t_runc(b); + } + rewind(b->ufd); + b->uend=0; + return(0); +} diff --git a/usr/src/libI77/rsfe.c b/usr/src/libI77/rsfe.c new file mode 100644 index 0000000000..94a2b405e0 --- /dev/null +++ b/usr/src/libI77/rsfe.c @@ -0,0 +1,67 @@ +/* read sequential formatted external */ +#include "fio.h" +#include "fmt.h" +extern int x_getc(),rd_ed(),rd_ned(); +extern int x_endp(),x_rev(),xrd_SL(); +s_rsfe(a) cilist *a; /* start */ +{ int n; + if(!init) f_init(); + if(n=c_sfe(a,READ)) return(n); + reading=1; + sequential=1; + formatted=1; + external=1; + elist=a; + cursor=recpos=0; + scale=0; + fmtbuf=a->cifmt; + curunit= &units[a->ciunit]; + cf=curunit->ufd; + if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); + getn= x_getc; + doed= rd_ed; + doned= rd_ned; + fmt_bg(); + doend=x_endp; + donewrec=xrd_SL; + dorevert=x_rev; + cblank=curunit->ublnk; + cplus=0; + if(curunit->uwrt) nowreading(curunit); + return(0); +} +xrd_SL() +{ int ch; + if(!curunit->uend) + while((ch=getc(cf))!='\n' && ch!=EOF); + cursor=recpos=0; + return(1); +} +x_getc() +{ int ch; + if(curunit->uend) return(EOF); + if((ch=getc(cf))!=EOF && ch!='\n') + { recpos++; + return(ch); + } + if(ch=='\n') + { ungetc(ch,cf); + return(ch); + } + if(feof(cf)) + { errno=0; + curunit->uend=1; + return(-1); + } + return(-1); +} +x_endp() +{ + xrd_SL(); + return(0); +} +x_rev() +{ + xrd_SL(); + return(0); +} diff --git a/usr/src/libI77/sfe.c b/usr/src/libI77/sfe.c new file mode 100644 index 0000000000..b473ed341f --- /dev/null +++ b/usr/src/libI77/sfe.c @@ -0,0 +1,21 @@ +/* sequential formatted external common routines*/ +#include "fio.h" +extern char *fmtbuf; +e_rsfe() +{ int n; + n=en_fio(); + fmtbuf=NULL; + return(n); +} +c_sfe(a,flag) cilist *a; /* check */ +{ unit *p; + if(a->ciunit >= MXUNIT || a->ciunit<0) + err(a->cierr,101,"startio"); + p = &units[a->ciunit]; + if(p->ufd==NULL && fk_open(flag,SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe") + if(!p->ufmt) err(a->cierr,102,"sfe") + return(0); +} +e_wsfe() +{ return(e_rsfe()); +} diff --git a/usr/src/libI77/stest.c b/usr/src/libI77/stest.c new file mode 100644 index 0000000000..5897eca4cf --- /dev/null +++ b/usr/src/libI77/stest.c @@ -0,0 +1,30 @@ +#include "fio.h" +#define out(a,b) {n=b;if(n==0) fprintf(stderr,"%s:%d\n",a,errno);else \ + fprintf(stderr,"%s:%d %d\n",a,errno,n);} +extern errno; +olist xopen; +cllist xclose; +alist xaux; +cilist xio; +long one = 1; +char xx[] = "1234"; +char yy[] = "terrible junk"; +main() +{ + int n; + setolist(&xopen,9,"junk","o","u",0,NULL,0); + out("open",f_open(&xopen)); + setalist(&xaux,9,0); + out("rew",f_rew(&xaux)); + setcilist(&xio,9,NULL,0,0,0); + out("start",s_wsue(&xio)); + out("io",do_uio(&one,xx,(long)sizeof(xx)-1)); + out("endw",e_wsue()); + out("enf",f_end(&xaux)); + out("bck",f_back(&xaux)); + out("bck",f_back(&xaux)); + out("startr",s_rsue(&xio)); + out("rio",do_uio(&one,yy,(long)sizeof(xx)-1)); + out("endr",e_rsue()); + fprintf(stdout,"yy: %s\n",yy); +} diff --git a/usr/src/libI77/sue.c b/usr/src/libI77/sue.c new file mode 100644 index 0000000000..16b217a837 --- /dev/null +++ b/usr/src/libI77/sue.c @@ -0,0 +1,63 @@ +#include "fio.h" +extern int reclen; +long recloc; +s_rsue(a) cilist *a; +{ + int n; + if(!init) f_init(); + if(n=c_sue(a,READ)) return(n); + reading=1; + recpos=0; + if(curunit->uwrt) nowreading(curunit); + if(fread(&reclen,sizeof(int),1,cf) + != 1) + { if(feof(cf)) + { curunit->uend = 1; + err(a->ciend, EOF, "start"); + } + clearerr(cf); + err(a->cierr, errno, "start"); + } + return(0); +} +s_wsue(a) cilist *a; +{ + int n; + if(!init) f_init(); + if(n=c_sue(a,WRITE)) return(n); + reading=0; + reclen=0; + if(!curunit->uwrt) nowwriting(curunit); + recloc=ftell(cf); + fseek(cf,(long)sizeof(int),1); + return(0); +} +c_sue(a,flag) cilist *a; +{ + if(a->ciunit >= MXUNIT || a->ciunit < 0) + err(a->cierr,101,"startio"); + external=sequential=1; + formatted=0; + curunit = &units[a->ciunit]; + elist=a; + if(curunit->ufd==NULL && fk_open(flag,SEQ,UNF,a->ciunit)) + err(a->cierr,114,"sue"); + cf=curunit->ufd; + if(curunit->ufmt) err(a->cierr,103,"sue") + if(!curunit->useek) err(a->cierr,103,"sue") + return(0); +} +e_wsue() +{ long loc; + fwrite(&reclen,sizeof(int),1,cf); + loc=ftell(cf); + fseek(cf,recloc,0); + fwrite(&reclen,sizeof(int),1,cf); + fseek(cf,loc,0); + return(0); +} +e_rsue() +{ + fseek(cf,(long)(reclen-recpos+sizeof(int)),1); + return(0); +} diff --git a/usr/src/libI77/uio.c b/usr/src/libI77/uio.c new file mode 100644 index 0000000000..2e3e787d82 --- /dev/null +++ b/usr/src/libI77/uio.c @@ -0,0 +1,42 @@ +#include "fio.h" +int reclen; +do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; +{ + if(reading) + { + recpos += *number * len; + if(recpos>reclen) + { + err(elist->cierr,110,"eof/uio"); + } + fread(ptr,(int)len,(int)(*number),cf); + return(0); + } + else + { + reclen += *number * len; + fwrite(ptr,(int)len,(int)(*number),cf); + return(0); + } +} +do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; +{ + if(sequential) + return(do_us(number,ptr,len)); + else return(do_ud(number,ptr,len)); +} +do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; +{ + recpos += *number * len; + if(recpos > curunit->url && curunit->url!=1) + err(elist->cierr,110,"eof/uio"); + if(reading) + { + if(fread(ptr,(int)len,(int)(*number),cf) + != *number) + err(elist->cierr,errno,"eof/uio") + else return(0); + } + fwrite(ptr,(int)len,(int)(*number),cf); + return(0); +} diff --git a/usr/src/libI77/util.c b/usr/src/libI77/util.c new file mode 100644 index 0000000000..ff5cffaa8a --- /dev/null +++ b/usr/src/libI77/util.c @@ -0,0 +1,117 @@ +#include +#include +#include +#include "fio.h" +#define DIRSIZE 14 +g_char(a,alen,b) char *a,*b; ftnlen alen; +{ char *x=a+alen-1,*y=b+alen-1; + *(y+1)=0; + for(;x>=a && *x==' ';x--) *y--=0; + for(;x>=a;*y--= *x--); +} +b_char(a,b,blen) char *a,*b; ftnlen blen; +{ int i; + for(i=0;iy) for(;num>0;num--) *y++= *x++; + else for(num--;num>=0;num--) *(y+num)= *(x+num); + } + else + { register char *x=a,*y=b; + if(x>y) for(;num>0;num--) *y++= *x++; + else for(num--;num>=0;num--) *(y+num)= *(x+num); + } +} +char *curdir() +{ char name[256],*bufpos = name; + struct stat x; + struct direct y; + int file,i; + *bufpos++ = 0; +loop: stat(".",&x); + if((file=open("..",0))<0) goto done; + do + { if(read(file,&y,sizeof(y))0;cursor--) (*putn)(' '); + if(cursor<0) + { + if(cursor+recpos<0) err(elist->cierr,110,"left off"); + if(curunit->useek) fseek(cf,(long)cursor,1); + else err(elist->cierr,106,"fmt"); + cursor=0; + } + return(0); +} +w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; +{ + if(mv_cur()) return(mv_cur()); + switch(p->op) + { + default: + fprintf(stderr,"w_ed, unexpected code: %d\n%s\n", + p->op,fmtbuf); + abort(); + case I: return(wrt_I(ptr,p->p1,len, 10)); + case IM: + return(wrt_IM(ptr,p->p1,p->p2,len)); + case O: return(wrt_I(ptr, p->p1, len, 8)); + case L: return(wrt_L(ptr,p->p1)); + case A: return(wrt_A(ptr,len)); + case AW: + return(wrt_AW(ptr,p->p1,len)); + case D: + case E: + case EE: + return(wrt_E(ptr,p->p1,p->p2,p->p3,len)); + case G: + case GE: + return(wrt_G(ptr,p->p1,p->p2,p->p3,len)); + case F: return(wrt_F(ptr,p->p1,p->p2,len)); + } +} +w_ned(p,ptr) char *ptr; struct syl *p; +{ + switch(p->op) + { + default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n", + p->op,fmtbuf); + abort(); + case SLASH: + return((*donewrec)()); + case T: cursor = p->p1-recpos - 1; + return(1); + case TL: cursor -= p->p1; + return(1); + case TR: + case X: + cursor += p->p1; + return(1); + case APOS: + return(wrt_AP(p->p1)); + case H: + return(wrt_H(p->p1,p->p2)); + } +} +wrt_I(n,w,len, base) uint *n; ftnlen len; register int base; +{ int ndigit,sign,spare,i; + long x; + char *ans; + if(len==sizeof(short)) x=n->is; + else if(len == sizeof(char)) x = n->ic; + else x=n->il; + ans=icvt(x,&ndigit,&sign, base); + spare=w-ndigit; + if(sign || cplus) spare--; + if(spare<0) + for(i=0;iis; + else if(len == sizeof(char)) x = n->ic; + else x=n->il; + ans=icvt(x,&ndigit,&sign, 10); + if(sign || cplus) xsign=1; + else xsign=0; + if(ndigit+xsign>w || m+xsign>w) + { for(i=0;i=m) + spare=w-ndigit-xsign; + else + spare=w-m-xsign; + for(i=0;i 0) (*putn)(*p++); + return(0); +} +wrt_AW(p,w,len) char * p; ftnlen len; +{ + while(w>len) + { w--; + (*putn)(' '); + } + while(w-- > 0) + (*putn)(*p++); + return(0); +} +wrt_E(p,w,d,e,len) ufloat *p; ftnlen len; +{ char *s; + int dp,sign,i,delta; + char *ecvt(); + if(scale>0) d++; + s=ecvt( (len==sizeof(float)?p->pf:p->pd) ,d,&dp,&sign); + if(sign || cplus) delta=6; + else delta=5; + if(w -d) + { + (*putn)('.'); + for(i=0;i<-scale;i++) + (*putn)('0'); + for(i=0;i0 && scalepf != 0) dp -= scale; + else dp = 0; + if(dp < 100 && dp > -100) (*putn)('e'); + if(dp<0) + { (*putn)('-'); + dp = -dp; + } + else (*putn)('+'); + if(e>=3 || dp >= 100) + { (*putn)(dp/100 + '0'); + dp = dp % 100; + } + if(e!=1) (*putn)(dp/10+'0'); + (*putn)(dp%10+'0'); + return(0); +} +wrt_G(p,w,d,e,len) ufloat *p; ftnlen len; +{ double up = 1,x; + int i,oldscale=scale,n,j; + x= len==sizeof(float)?p->pf:p->pd; + if(x < 0 ) x = -x; + if(x<.1) return(wrt_E(p,w,d,e,len)); + for(i=0;i<=d;i++,up*=10) + { if(x>up) continue; + scale=0; + if(e==0) n=4; + else n=e+2; + i=wrt_F(p,w-n,d-i,len); + for(j=0;jpf:p->pd); + if(scale) + { if(scale>0) + for(i=0;i=d) sign=0; + if(sign || cplus) delta=2; + else delta=1; + n= w - (d+delta+(dp>0?dp:0)); + if(n<0) + { + for(i=0;icifmt; + curunit = &units[a->ciunit]; + cf=curunit->ufd; + if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); + putn= x_putc; + doed= w_ed; + doned= w_ned; + doend=xw_end; + dorevert=xw_rev; + donewrec=x_wSL; + fmt_bg(); + cplus=0; + cblank=curunit->ublnk; + if(!curunit->uwrt) nowwriting(curunit); + return(0); +} +x_putc(c) +{ + recpos++; + putc(c,cf); +} +pr_put(c) +{ static flag new = 1; + recpos++; + if(c=='\n') + { new=1; + putc(c,cf); + } + else if(new==1) + { new=0; + if(c=='0') putc('\n',cf); + else if(c=='1') putc('\f',cf); + } + else putc(c,cf); +} +x_wSL() +{ + (*putn)('\n'); + recpos=0; + cursor = 0; + return(1); +} +xw_end() +{ + (*putn)('\n'); + return(0); +} +xw_rev() +{ + if(workdone) (*putn)('\n'); + return(workdone=0); +} -- 2.20.1