81 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $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);
 | 
						|
}
 |