DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦8b6187767⟧ TextFile

    Length: 13056 (0x3300)
    Types: TextFile
    Names: »STDIO.H«

Derivation

└─⟦d3d1d07f5⟧ Bits:30009789/_.ft.Ibm2.50006621.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »STDIO.H« 

TextFile

#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»