home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
X_PROLOG.LZH
/
X_PROLOG
/
SOURCES
/
INIT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-13
|
4KB
|
166 lines
/*
* X PROLOG Vers. 2.0
*
*
* Written by : Andreas Toenne
* CS Dept. , IRB
* University of Dortmund, W-Germany
* <at@unido.uucp>
* <....!seismo!unido!at>
* <at@unido.bitnet>
*
* Copyright : This software is copyrighted by Andreas Toenne.
* Permission is granted hereby to copy the entire
* package including this copyright notice without fee.
*
*/
#include <stdio.h>
#include <ctype.h>
#include "prolog.h"
#include "error.h"
#include "extern.h"
extern functor *get_functor(); /* functor */
extern short biassert(); /* bidatabase */
extern term *read_term(); /* reader */
extern term *term_copy(); /* terms */
extern term *push_proto(); /* memory */
struct _exp /* list of all expression functors */
{
char *name;
short arity;
} exp[] =
{ "+", 2, "-", 2, "*", 2, "/", 2, "mod", 2, "-", 1, "/\\", 2, "\\/", 2,
"<<", 2, ">>", 2, "\\", 1, "cputime", 0, "heapused", 0,
NULL, 0};
struct _stdf /* list of all std functors */
{
char *name;
short arity;
} stdf[] =
{ ".", 2, "$call", 1, "xfx", 0, "xfy", 0, "yfx", 0, "yfy", 0, "fx", 0, "fy", 0,
"xf", 0, "yf", 0, ",", 2, "-", 1, "end_of_file", 0, ";", 2, ":-", 2,
"[]", 0, "user", 0, "true", 0, "assert", 1, NULL, 0};
struct _oper /* list of all std operators */
{
char *name;
functor **type;
short prio;
} oper[] =
{
{ ":-", &XFXFUNCTOR, 255},
{ "?-", &FXFUNCTOR, 255},
{ ":-", &FXFUNCTOR, 255},
{ ";", &XFYFUNCTOR, 254},
{ ",", &XFYFUNCTOR, 254},
{ "spy", &FXFUNCTOR, 250},
{ "nospy", &FXFUNCTOR, 250},
{ "\\", &FXFUNCTOR, 60},
{ ".", &XFYFUNCTOR, 51},
{ "is", &XFXFUNCTOR, 40},
{ "=..", &XFXFUNCTOR, 40},
{ "=", &XFXFUNCTOR, 40},
{ "\\=", &XFXFUNCTOR, 40},
{ "<", &XFXFUNCTOR, 40},
{ "=<", &XFXFUNCTOR, 40},
{ ">=", &XFXFUNCTOR, 40},
{ ">", &XFXFUNCTOR, 40},
{ "==", &XFXFUNCTOR, 40},
{ "\\==", &XFXFUNCTOR, 40},
{ "=:=", &XFXFUNCTOR, 40},
{ "=\\=", &XFXFUNCTOR, 40},
{ "@<", &XFXFUNCTOR, 40},
{ "@>", &XFXFUNCTOR, 40},
{ "@=<", &XFXFUNCTOR, 40},
{ "@>=", &XFXFUNCTOR, 40},
{ "-", &FXFUNCTOR, 31},
{ "-", &YFXFUNCTOR, 31},
{ "+", &YFXFUNCTOR, 31},
{ "/\\", &YFXFUNCTOR, 31},
{ "\\/", &YFXFUNCTOR, 21},
{ "*", &YFXFUNCTOR, 21},
{ "/", &YFXFUNCTOR, 21},
{ "mod", &XFXFUNCTOR, 11},
{ "<<", &XFXFUNCTOR, 11},
{ ">>", &XFXFUNCTOR, 11},
{ NULL, NULL, 0}
};
/* create all std functors */
/* declare the std operators and expressions */
void init_std()
{
short i;
functor *f;
for (i=0; stdf[i].name; i++)
stdfunctor[i] = get_functor(stdf[i].name, stdf[i].arity);
for (i=0; oper[i].name; i++)
add_operator(oper[i].name, *oper[i].type, oper[i].prio);
for (i=0; exp[i].name; i++)
{
f = get_functor(exp[i].name, exp[i].arity);
f->info[0] = i+1;
}
}
/* Initialise all streams (coldstart) */
void init_streams()
{
short i;
for (i=0; i<MAXSTREAMS; i++)
streams[i].status = CLOSED;
streams[0].fp = stdin;
streams[0].atom = USERATOM;
streams[0].status = INPUT;
streams[1].fp = stdout;
streams[1].atom = USERATOM;
streams[1].status = OUTPUT;
in = (stream *)&(streams[0]);
out = (stream *)&(streams[1]);
}
/* Very small bootstrapper */
/* Simply reads terms and tries to assert them */
/* No questions are allowed */
short bootload(name)
char *name; /* name of the boot file */
{
term *t;
term *oldnext, *oldtop; /* save copystack */
if ((in->fp = fopen(name, "r")) == NULL)
panic(BADBOOT);
in->atom = NILATOM;
oldnext = copynext;
oldtop = copytop;
while (TRUE)
{
t = read_term();
if (c_errno)
break;
if (!biassertz(&t))
panic(BADBOOT);
}
if (c_errno != EEOF)
panic(BADBOOT);
fclose(in->fp);
copytop = oldtop;
copynext = oldnext;
in->fp = stdin;
in->atom = USERATOM;
}