76 lines
1.1 KiB
C
76 lines
1.1 KiB
C
|
/* builtin.c - built in named processes */
|
||
|
#include "channel.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);
|
||
|
}
|