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