/* $Header$ */
/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */

/*	builtin.c - built in named processes */
#include "ocm_chan.h"
#ifndef nil
#define nil 0
#endif

extern int errno;

static void nullterm(s) register char *s;
/* Change Occam string to C string */
{
	register len= (*s & 0377);
	register char *p;

	while (--len>=0) {
		p=s++;
		*p = *s;
	}
	*s=0;
}

static void lenterm(s) register char *s;
/* Change C string to Occam string */
{
	register i=0;
	register c0, c1;

	c0=0;
	do {
		c1=s[i];
		s[i++]=c0;
		c0=c1;
	} while (c0!=0);
	*s= i-1;
}

void b_open(mode, name, index) register char *mode, *name; long *index;
/* PROC open(VAR index, VALUE name[], mode[])=	*/
{
	register FILE *fp;
	register i;

	nullterm(name);
	nullterm(mode);

	fp=fopen(name, mode);

	lenterm(name);
	lenterm(mode);

	if (fp==nil)
		*index= -errno;
	else {
		/* Find free file channel, there must be one free! */

		for (i=0; (file[i].f.flgs&C_F_INUSE)!=0; i++) ;

		file[i].f.flgs|=C_F_INUSE;
		unix_file[i]=fp;
		*index=i;
	}
}

void b_close(index) long index;
/* PROC close(VALUE index)=	*/
{
	fclose(unix_file[index]);
	file[index].f.flgs&= ~C_F_INUSE;
}

void b_exit(code) long code;
/* PROC exit(VALUE code)=	*/
{
	exit((int) code);
}