V9/cmd/p/pad.c
#include <stdio.h>
#include "pad.h"
char *malloc();
#define NPCBL 8 /* Number of entries in the circular list */
PAD *
Pfopen(f, m)
char *f, *m;
{
int fd;
PAD *p;
if (*m != 'r') /* hack */
return (NULL);
if ((fd = open(f, 0)) < 0)
return (NULL);
if ((p = Pfdopen(fd)) == NULL)
close(fd);
return (p);
}
PAD *
Pfdopen(fd)
int fd;
{
register PAD *p;
register i;
if ((p = (PAD *)malloc(sizeof(PAD))) == NULL)
return (NULL);
p->Pfile = fd;
p->Pcbl=(_PCBL *)malloc(NPCBL*sizeof(_PCBL));
if(p->Pcbl==NULL){
free((char *)p);
return (NULL);
}
p->Pcbb = p->Pcbl;
for(i=0; i<NPCBL; i++){
p->Pcbl[i].Pnextp = &p->Pcbl[(i+1)%NPCBL];
p->Pcbl[(i+1)%NPCBL].Pprevp = &p->Pcbl[i];
p->Pcbl[i].Pbase = NULL;
p->Pcbl[i].Phiwat = NULL;
p->Pcbl[i].Pptr = NULL;
p->Pcbl[i].Pcnt = 0;
}
return (p);
}
int
_Pfilbuf(p)
register PAD *p;
{
register _PCBL *pcbl;
pcbl = p->Pcbl;
if (pcbl->Phiwat >= pcbl->Pbase + BUFSIZ) {
p->Pcbl = pcbl = pcbl->Pnextp;
if (pcbl->Pcnt <= 0) /* stale data */
pcbl->Phiwat = pcbl->Pbase;
}
if (pcbl->Pbase == NULL) {
if ((pcbl->Pbase = (char *) malloc(BUFSIZ)) == NULL) {
fprintf(stderr, "pad: can't malloc\n"); /* ? */
return (EOF);
}
pcbl->Phiwat = pcbl->Pbase;
}
if (pcbl->Pcnt <= 0) {
pcbl->Pptr = pcbl->Phiwat;
pcbl->Pcnt = read(p->Pfile, pcbl->Pptr, (pcbl->Pbase + BUFSIZ) - pcbl->Phiwat);
if (pcbl->Pcnt > 0)
pcbl->Phiwat += pcbl->Pcnt;
}
if (--pcbl->Pcnt < 0) {
pcbl->Pcnt = 0;
return (EOF);
}
return (*pcbl->Pptr++);
}
Pclose(p)
register PAD *p;
{
register i;
for(i=0; i<NPCBL; i++)
if (p->Pcbb[i].Pbase)
free(p->Pcbb[i].Pbase);
free((char *)p->Pcbb);
close(p->Pfile);
free((char *)p);
}
int
Pbackc(p)
register PAD *p;
{
register _PCBL *pcbl;
pcbl=p->Pcbl;
if(pcbl->Pptr <= pcbl->Pbase){
pcbl=pcbl->Pprevp; /* Only local... */
if(pcbl->Pptr <= pcbl->Pbase)
return(EOF);
p->Pcbl=pcbl; /* ...until now */
pcbl->Pcnt = 0;
}
++pcbl->Pcnt;
return(*--pcbl->Pptr);
}