|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13056 (0x3300)
Types: TextFile
Names: »STDIO.H«
└─⟦d3d1d07f5⟧ Bits:30009789/_.ft.Ibm2.50006621.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »STDIO.H«
#define STDIOEDIT 10
/* tell(fd) */
/* seek(fd, offset, origin) */
/* open(filename,mode) mode = 0,1,2 */
/* creat(filename) */
/* close(fd) */
/* fopen(filename,mode,buffer_size) mode = "r","w","a","rw" */
/* write(fd,buffer,byte_count) */
/* read(fd,buffer,byte_count) */
/* cio(mode,fcb_pointer,buffer,byte_count) */
/* cpmio(mode,fcb_pointer,buffer) */
/*
int * allocs;
#include "alloc.h"
*/
#define TRUE 1
#define FALSE 0
#define ERROR (-1)
#define BDOSERR 255
#define BCE 1 /* Byte count error */
#define NOFD 2 /* No open FD's */
#define NOFCB 3 /* All fcb area in use */
#define INVFD 4 /* Invalid FD, unopened file */
#define INVMODE 5 /* IO type mismatch */
#define OPENERR 6 /* Error on CC_OPEN */
#define CREATERR 7 /* Error on CC_CREAT */
#define FSPECERR 8 /* Invalid filename */
#define BADDEV 9 /* Device out of range */
#define CLOSEERR 10 /* bdos error in close */
#define INVREC 11 /* Invalid record in seek */
#define INVSEEK 12
#define BUFOVF 30
#define INVBUF 31
#define READERR 32
#define EOFERR 33
#define NOGETC 34
#define REC_SIZE 128 /* Byte count of a CP/M record */
#define EXT_SIZE 128 /* Records in a extent 1..EXT_SIZE */
#define FCB_SIZE 33 /* Bytes in a CP/M fcb */
#define FCB_ASIZE 37 /* Full fcb size */
#define SOVER 6 /* Bytes to over allocate seq. buf. */
#define FCB_READ 0
#define FCB_WRITE 1
#define FCB_R_W 2
#define INIT_DMA 0x80 /* Each open sets dma here */
#define START 0 /* Seek from beginning */
#define CURRENT 1 /* Seek from current record */
#define LAST 2 /* Seek from end */
/* Byte offsets into FCB */
#define EX 12 /* Byte address of extent value */
#define RC 15 /* Record count in extent */
#define NR 32 /* Byte address of next record value */
#define FM 33 /* File mode */
#define ME 34 /* Maximum extent */
#define PS 35 /* Pointer to seq buffer (2 bytes) */
/* Integer offsets into seq. buffer */
#define AP 0 /* Active pointer */
#define AC 1 /* Active count */
#define BS 2 /* Buffer size */
#define BU 3 /* Start of buffer */
/* BDOS calling codes */
#define SET_DRIVE 14 /* Select disk drive */
#define CC_OPEN 15
#define CC_CLOSE 16
#define CC_FIND 17 /* Find first occurence */
#define CC_NEXT 18 /* Find next occurence */
#define CC_DELETE 19
#define CC_READ 20 /* Read next CP/M record */
#define CC_WRITE 21 /* Write next CP/M record */
#define CC_CREAT 22
#define GET_DRIVE 25 /* Interrogate drive number */
#define SET_DMA 26
int errno;
seek(fd,offset,origin)
char *fd;
int offset;
char origin;
æ
register int t3;
int t1, t2;
switch(origin)
æ
case CURRENT:
t3 = fdÆEXÅ * EXT_SIZE;
t1 = cc_ex(offset+fdÆNRÅ+t3);
t2 = cc_nr(offset+fdÆNRÅ+t3);
break;
case START:
t1 = cc_ex(offset);
t2 = cc_nr(offset);
break;
case LAST:
if(back_up(fd,offset) == ERROR)
return ERROR;
else
return TRUE;
default:
errno = INVSEEK;
return ERROR;
å
t3 = fdÆEXÅ;
if(move_ex(fd,t1) == ERROR)
return ERROR;
if(move_nr(fd,t2) == ERROR)
æ
move_ex(fd,t3);
return ERROR;
å
return TRUE;
å
unlink(filename)
char filenameÆÅ;
æ
char temp_fcbÆFCB_SIZEÅ;
fill_fcb(temp_fcb,filename); /* where is the check? */
bdos(CC_DELETE,temp_fcb);
return TRUE;
å
open(filename,mode)
char filenameÆÅ, *mode;
æ
register char *fd;
if((fd = get_fd()) == ERROR)
return ERROR;
if(fill_fcb(fd,filename) < 0)
return ERROR;
if(mode > 2)
æ
errno = INVMODE;
return FALSE;
å
fdÆFMÅ = mode;
int t1, new, old;
if(*fd != 0)
æ
old = bdos(GET_DRIVE,0);
new = *fd;
if(new < 'A' øø new > 'D')
æ
errno = BADDEV;
return ERROR;
å
*fd = 0;
bdos(SET_DRIVE,new-'A');
å
else
new = 0;
bdos(SET_DMA,INIT_DMA);
if(bdos(CC_OPEN,fd) == BDOSERR)
æ
errno = OPENERR;
free(fd);
if(new)
bdos(SET_DRIVE,old);
return ERROR;
å
if(new)
æ
bdos(SET_DRIVE,old);
*fd = new;
å
return fd;
å
creat(filename)
char filenameÆÅ;
æ
register char *fd;
if((fd = get_fd()) == ERROR)
return ERROR;
if(fill_fcb(fd,filename) < 0)
return ERROR;
fdÆFMÅ = FCB_WRITE;
int t1, new, old;
if(*fd)
æ
old = bdos(GET_DRIVE,0);
new = *fd;
if(new < 'A' øø new > 'D')
æ
errno = BADDEV;
return ERROR;
å
*fd = 0;
bdos(SET_DRIVE,new-'A');
å
else
new = 0;
bdos(CC_DELETE,fd);
if(bdos(CC_CREAT,fd) == BDOSERR)
æ
errno = CREATERR;
free(fd);
if(new)
bdos(SET_DRIVE,old);
return ERROR;
å
if(new)
æ
bdos(SET_DRIVE,old);
*fd = new;
å
return fd;
å
close(fd)
char *fd;
æ
register int *p1;
int t1, new, old;
if(fd<3)
return 0;
switch(fdÆFMÅ)æ
case 0:
case 1:
case 2:
case 'R':
case 'W':
case 'A':
case 'X':
break;
default:
errno = INVFD;
return -1;
å
if(*fd)
æ
old = bdos(GET_DRIVE,0);
new = *fd;
if(new < 'A' øø new > 'D')
æ
errno = BADDEV;
return ERROR;
å
*fd = 0;
bdos(SET_DRIVE,new-'A');
å
else
new = 0;
t1 = FALSE;
if(bdos(CC_CLOSE,fd) == BDOSERR)
æ
errno = CLOSEERR;
t1 = ERROR;
å
if(new)
bdos(SET_DRIVE,old);
if(fdÆFMÅ > 3)
æ
p1 = &fdÆPSÅ;
free(*p1);
å
free(fd);
return t1;
å
tell(fd)
char *fd;
æ
return fdÆNRÅ + fdÆEXÅ*EXT_SIZE;
å
read(fd,buffer,byte_count)
char *fd, *buffer;
int byte_count;
æ
switch(fdÆFMÅ)æ
case FCB_READ:
case FCB_R_W:
case 'R':
return cio(CC_READ,fd,buffer,byte_count);
å
errno = INVMODE;
return ERROR;
å
write(fd,buffer,byte_count)
char *fd, *buffer;
int byte_count;
æ
register int t1;
switch(fdÆFMÅ)æ
case FCB_WRITE:
case FCB_R_W:
case 'W':
case 'A':
t1 = cio(CC_WRITE,fd,buffer,byte_count);
if(fdÆMEÅ < fdÆEXÅ)
fdÆMEÅ = fdÆEXÅ;
return t1;
default:
errno = INVMODE;
return ERROR;
å
å
cio(mode,fcb_pointer,buffer,byte_count)
char mode, *fcb_pointer, *buffer;
int byte_count;
æ
register int records;
int bytes;
if(byte_count < REC_SIZE)
æ
errno = BCE;
return ERROR;
å
bytes = 0;
for(records = byte_count/REC_SIZE; records; --records)
æ
if(cpmio(mode,fcb_pointer,buffer) != TRUE)
æ
errno = mode;
return bytes;
å
buffer += REC_SIZE;
bytes += REC_SIZE;
å
return bytes;
å
cpmio(mode,fcb_pointer,buffer)
char mode, *fcb_pointer,*buffer;
æ
register char def_device;
char t1;
char old_device;
old_device = fcb_pointerÆ0Å;
def_device = bdos(GET_DRIVE,0);
if(old_device)
æ
if(def_device != fcb_pointerÆ0Å - 'A')
bdos(SET_DRIVE,(fcb_pointerÆ0Å - 'A'));
fcb_pointerÆ0Å = 0;
å
bdos(SET_DMA,buffer);
t1 = (bdos(mode,fcb_pointer) == 0);
fcb_pointerÆ0Å = old_device;
bdos(SET_DRIVE,def_device);
return t1;
å
fspec(fp,fcb) /* parse fspec. if valid return true and set
ip low 16 bytes of fcb, else return false. */
char *fp, *fcb;
æ
register int c;
char c1;
if(*fp == 0)
æ
errno = FSPECERR;
return FALSE;
å
if(fpÆ1Å == ':')
æ
c1=toupper(*fp);
if((c1 < 'A') øø (c1 > 'D'))
æ
errno=FSPECERR;
return FALSE;
å
*fcb++ = c1;
fp+=2;
å
else
*fcb++ = 0;
for(c=0;(c<8) && (*fp!='.') && (*fp);++c)
*fcb++ = toupper(*fp++);
while(c++<8)
*fcb++ = ' ';
if((*fp) && (*fp != '.'))
æ
errno = FSPECERR;
return FALSE;
å
if(*fp=='.') ++fp;
for(c=0;(c<3) && (*fp);++c)
*fcb++ = toupper(*fp++);
while(c++ < 3)
*fcb++ = ' ';
if(*fp)
æ
errno=FSPECERR;
return FALSE;
å
return TRUE;
å
/*
dump_fcb(addr)
char *addr;
æ
register int t1;
for(t1 = 0; t1 < FCB_SIZE; ++t1)
printf("%x:%cØn",*addr,*addr++);
putchar('Øn');
å
*/
back_up(fd,offset)
char *fd;
int offset;
æ
register int ex;
int nr;
ex = fdÆEXÅ;
nr = fdÆNRÅ;
if(fdÆMEÅ == 255)
æ
to_end(fd);
fdÆMEÅ = fdÆEXÅ;
å
else
move_ex(fd,fdÆMEÅ);
fdÆNRÅ = fdÆRCÅ;
if(seek(fd,-offset,CURRENT) == ERROR)
æ
move_ex(fd,ex);
move_nr(fd,nr);
return ERROR;
å
else
return TRUE;
å
to_end(fd)
char *fd;
æ
register int t1;
char temp_fcbÆFCB_SIZEÅ;
for(t1=0; t1<12; ++t1)
temp_fcbÆt1Å = fdÆt1Å;
for(t1=13; t1<FCB_SIZE;)
temp_fcbÆt1++Å = 0;
bdos(SET_DMA,INIT_DMA);
for(++(temp_fcbÆEXÅ); bdos(CC_OPEN,temp_fcb) != BDOSERR;
++(temp_fcbÆEXÅ))
;
if(--(temp_fcbÆEXÅ) == fdÆEXÅ)
return;
bdos(CC_CLOSE,fd);
for(t1=0; t1<FCB_SIZE; ++t1)
fdÆt1Å = temp_fcbÆt1Å;
å
move_ex(fd,where)
char *fd;
int where;
æ
register int t1;
char temp_fcbÆFCB_SIZEÅ;
if(fdÆEXÅ == where)
return TRUE;
for(t1=0; t1 < 12; ++t1)
temp_fcbÆt1Å = fdÆt1Å;
for(t1=12; t1 < FCB_SIZE; ++t1)
temp_fcbÆt1Å = 0;
temp_fcbÆEXÅ = where;
bdos(SET_DMA,INIT_DMA);
if(bdos(CC_OPEN,temp_fcb) != BDOSERR)
æ
bdos(CC_CLOSE,fd);
for(t1=0; t1 < FCB_SIZE; ++t1)
fdÆt1Å = temp_fcbÆt1Å;
return TRUE;
å
errno = INVREC;
return ERROR;
å
move_nr(fd,where)
char *fd;
int where;
æ
if(fdÆNRÅ == where)
return TRUE;
if(where <= fdÆRCÅ && (where >= 0 && where < REC_SIZE))
æ
fdÆNRÅ = where;
return TRUE;
å
errno = INVREC;
return ERROR;
å
cc_ex(where)
int where;
æ
return where / EXT_SIZE;
å
cc_nr(where)
int where;
æ
return where % EXT_SIZE;
å
fill_fcb(fcb_pointer,filename)
char *fcb_pointer, filenameÆÅ;
æ
register int t1;
if(!fspec(filename,fcb_pointer))
return ERROR;
for(t1 = 12; t1 < FCB_ASIZE;)
fcb_pointerÆt1++Å = 0;
fcb_pointerÆMEÅ = 255;
return TRUE;
å
get_fd()
æ
register char *p1;
if(p1 = alloc(FCB_ASIZE))
return p1;
return ERROR;
å
fopen(filename,mode,buffer_size)
char filenameÆÅ, *mode;
int buffer_size;
æ
register char *fd;
if((buffer_size % REC_SIZE) øø buffer_size == 0)
æ
errno = INVBUF;
return ERROR;
å
int *p1;
switch(toupper(*mode))
æ
case 'R':
if((fd = open(filename,FCB_READ)) != ERROR)
break;
if(toupper(modeÆ1Å) != 'W')
return ERROR;
case 'W':
if((fd = creat(filename)) == ERROR)
return ERROR;
break;
case 'A':
if((fd = open(filename,FCB_WRITE)) == ERROR)
return ERROR;
if(seek(fd,0,LAST) == ERROR)
return ERROR;
break;
default:
errno = INVMODE;
return ERROR;
å
p1 = &fdÆPSÅ;
if((*p1 = alloc(buffer_size+SOVER)) == FALSE)
æ
errno = BUFOVF;
return ERROR;
å
p1 = *p1;
p1ÆAPÅ = &p1ÆBUÅ;
p1ÆACÅ = 0;
p1ÆBSÅ = buffer_size;
switch(toupper(*mode))æ
case 'A':
case 'W':
fdÆFMÅ = toupper(*mode);
break;
default:
switch(toupper(modeÆ1Å))æ
case 'W':
fdÆFMÅ = 'X';
break;
default:
fdÆFMÅ = 'R';
å
å
return fd;
å
fclose(fd)
int fd;
æ
putc(26,fd);
if(fflush(fd) == ERROR)
return ERROR;
return close(fd);
å
pgetc(fd)
int fd;
æ
register char c;
if((c = getc(fd)) == 'Ør')
if(getc(fd) == 'Øn')
c = 'Øn';
else
ungetc(fd);
return c;
å
getc(fd)
char *fd;
æ
register int *p1;
if(fdÆFMÅ != 'R' && fdÆFMÅ != 'X')
æ
errno = INVFD;
return ERROR;
å
p1 = *(p1 = &fdÆPSÅ);
if(p1ÆACÅ <= 0)
if(fill_buf(fd) == ERROR)
return ERROR;
--p1ÆACÅ;
char *c1;
return *(c1 = p1ÆAPÅ++);
å
getw(fd)
char *fd;
æ
register int r1;
int r2;
if((r1 = getc(fd)) == ERROR
øø
(r2 = getc(fd)) == ERROR)
return ERROR;
return (r1<<8) ø r2;
å
ungetc(c,fd)
char c, *fd;
æ
int *p1;
if(fdÆFMÅ != 'R' && fdÆFMÅ != 'X')
æ
errno = INVFD;
return ERROR;
å
char *c1;
p1 = *(p1 = &fdÆPSÅ);
++p1ÆACÅ;
*(c1 = --p1ÆAPÅ) = c;
å
pputc(c,fd)
char c;
int fd;
æ
if(c == 'Øn')
if(putc('Ør',fd) == ERROR)
return ERROR;
putc(c,fd);
å
putc(c,fd)
char c, *fd;
æ
register int *p1;
if(fd < 3)
æ
putchar(c);
return TRUE;
å
char *c1;
switch(fdÆFMÅ)æ
case 'X':
case 'W':
case 'A':
p1 = *(p1 = &fdÆPSÅ);
if(p1ÆACÅ >= p1ÆBSÅ)
if(write_buf(fd) == ERROR)
return ERROR;
++p1ÆACÅ;
*(c1 = p1ÆAPÅ++) = c;
return TRUE;
default:
errno = INVFD;
return ERROR;
å
å
putw(i,fd)
int i, fd;
æ
if(putc(i>>8,fd) == ERROR)
return ERROR;
if(putc(i,fd) == ERROR)
return ERROR;
return TRUE;
å
fflush(fd)
char *fd;
æ
register int *p1;
switch(fdÆFMÅ)æ
case 'X':
case 'W':
case 'A':
p1 = *(p1 = &fdÆPSÅ);
if(p1ÆACÅ)
return write_buf(fd);
return TRUE;
default:
errno = INVFD;
return ERROR;
å
å
fill_buf(fd)
char *fd;
æ
register int *p1;
p1 = *(p1 = &fdÆPSÅ);
if((p1ÆACÅ = read(fd,&p1ÆBUÅ,p1ÆBSÅ)) <= 0)
æ
errno = EOFERR;
return ERROR;
å
p1ÆAPÅ = &p1ÆBUÅ;
return TRUE;
å
write_buf(fd)
char *fd;
æ
register int *p1;
p1 = *(p1 = &fdÆPSÅ);
if(write(fd,&p1ÆBUÅ,p1ÆBSÅ) != p1ÆBSÅ)
return ERROR;
p1ÆAPÅ = &p1ÆBUÅ;
p1ÆACÅ = 0;
return TRUE;
å
toupper(cc)
char cc;
æ
register char c;
if((c=cc) >= 'a' && c <= 'z')
return c-' ';
return c;
å
«eof»