diff --git a/WEGA/contrib/cpm/cpm3/cflsbuf.c b/WEGA/contrib/cpm/cpm3/cflsbuf.c new file mode 100644 index 0000000..0807550 --- /dev/null +++ b/WEGA/contrib/cpm/cpm3/cflsbuf.c @@ -0,0 +1,87 @@ +/* cflsbuf.c 1.10 83/05/13 */ + +#include +#include "cpmio.h" +#include "cpmfio.h" + +/* + * Flush a full block to floppy disk file + * (these routines are never called unless a full block is + * to be written) + * Create a new extent if required + */ + +extern int flp_fmt; + +c_flush(fptr) + register C_FILE *fptr; +{ + + int it; + int alloc(); + + if (!(fptr->c_flag & WRITE)) { + fprintf(stderr, "no write access"); + return (EOF); + } + fptr->c_seccnt += blksiz/128; + fptr -> c_blk -= flp_fmt; + it = getblno( fptr ); + if (putblock( it, fptr->c_base, -1) == EOF) + return (EOF); + if (fptr->c_blk == 16) { + fptr->c_dirp->blkcnt = (char) 0x80; + savedir(); + /* create lew extent */ + if ((it = creext(fptr->c_ext)) == NULL) { + fprintf(stderr,"can't create new extent, current: %d\n", + fptr->c_ext); + return (EOF); + } + fptr->c_dirp = dirbuf+it; + fptr->c_ext = it; + fptr->c_blk = 0; + fptr->c_seccnt = 0; + fptr->c_extno++; + fptr->c_dirp->extno= fptr->c_extno; + } + fptr->c_buf = fptr->c_base; + fptr->c_cnt = blksiz; + it = alloc(); + if( it == 0 ) { + fprintf(stderr, "disk full\n"); + return (EOF); + } + putblno( fptr, it ); + return (0); +} + +c_flsbuf(c, fptr) + register C_FILE *fptr; +{ + if (c_flush(fptr) == EOF) + return (EOF); + *(fptr->c_buf++) = c; + fptr->c_cnt--; + return (c); +} + +/* + * move the contents of 'buf' into the cpm block buffer, + * flush the buffer if full (for binary file transfers) + */ + +c_write(fptr, buf, cnt) + register C_FILE *fptr; + char *buf; +{ + int i = cnt; + + while (i-- > 0) { + *(fptr->c_buf++) = *(buf++); + if (--fptr->c_cnt == 0) + if (c_flush(fptr) == EOF) + return (EOF); + } + return (cnt); +}