Initial revision
This commit is contained in:
75
lang/occam/lib/builtin.c
Normal file
75
lang/occam/lib/builtin.c
Normal file
@@ -0,0 +1,75 @@
|
||||
/* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user