home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / X_PROLOG.LZH / X_PROLOG / SOURCES / INIT.C < prev    next >
C/C++ Source or Header  |  1990-08-13  |  4KB  |  166 lines

  1. /*
  2.  *        X PROLOG  Vers. 2.0
  3.  *
  4.  *
  5.  *    Written by :     Andreas Toenne
  6.  *            CS Dept. , IRB
  7.  *            University of Dortmund, W-Germany
  8.  *            <at@unido.uucp>
  9.  *            <....!seismo!unido!at>
  10.  *            <at@unido.bitnet>
  11.  *
  12.  *    Copyright :    This software is copyrighted by Andreas Toenne.
  13.  *            Permission is granted hereby to copy the entire
  14.  *            package including this copyright notice without fee.
  15.  *
  16.  */
  17.  
  18. #include <stdio.h> 
  19. #include <ctype.h>
  20. #include "prolog.h"
  21. #include "error.h"
  22. #include "extern.h"
  23.  
  24.  
  25. extern functor *get_functor();        /* functor */
  26. extern short biassert();        /* bidatabase */
  27. extern term *read_term();        /* reader */
  28. extern term *term_copy();        /* terms */
  29. extern term *push_proto();        /* memory */
  30.  
  31. struct _exp                /* list of all expression functors */
  32. {
  33.     char *name;
  34.     short arity;
  35. } exp[] =
  36. { "+", 2, "-", 2, "*", 2, "/", 2, "mod", 2, "-", 1, "/\\", 2, "\\/", 2,
  37.   "<<", 2, ">>", 2, "\\", 1, "cputime", 0, "heapused", 0,
  38.    NULL, 0};
  39.  
  40. struct _stdf                /* list of all std functors */
  41. {
  42.     char *name;
  43.     short arity;
  44. } stdf[] =
  45. { ".", 2, "$call", 1, "xfx", 0, "xfy", 0, "yfx", 0, "yfy", 0, "fx", 0, "fy", 0,
  46.   "xf", 0, "yf", 0, ",", 2, "-", 1, "end_of_file", 0, ";", 2, ":-", 2, 
  47.   "[]", 0, "user", 0, "true", 0, "assert", 1, NULL, 0};
  48.  
  49. struct _oper                /* list of all std operators */
  50. {
  51.     char *name;
  52.     functor **type;
  53.     short prio;
  54. } oper[] =        
  55. {
  56.     { ":-", &XFXFUNCTOR, 255},
  57.     { "?-", &FXFUNCTOR, 255},
  58.     { ":-", &FXFUNCTOR, 255},
  59.     { ";", &XFYFUNCTOR, 254},
  60.     { ",", &XFYFUNCTOR, 254},
  61.     { "spy", &FXFUNCTOR, 250},
  62.     { "nospy", &FXFUNCTOR, 250},
  63.     { "\\", &FXFUNCTOR, 60},
  64.     { ".", &XFYFUNCTOR, 51},
  65.     { "is", &XFXFUNCTOR, 40},
  66.     { "=..", &XFXFUNCTOR, 40},
  67.     { "=", &XFXFUNCTOR, 40},
  68.     { "\\=", &XFXFUNCTOR, 40},
  69.     { "<", &XFXFUNCTOR, 40},
  70.     { "=<", &XFXFUNCTOR, 40},
  71.     { ">=", &XFXFUNCTOR, 40},
  72.     { ">", &XFXFUNCTOR, 40},
  73.     { "==", &XFXFUNCTOR, 40},
  74.     { "\\==", &XFXFUNCTOR, 40},
  75.     { "=:=", &XFXFUNCTOR, 40},
  76.     { "=\\=", &XFXFUNCTOR, 40},
  77.     { "@<", &XFXFUNCTOR, 40},
  78.     { "@>", &XFXFUNCTOR, 40},
  79.     { "@=<", &XFXFUNCTOR, 40},
  80.     { "@>=", &XFXFUNCTOR, 40},
  81.     { "-", &FXFUNCTOR, 31},
  82.     { "-", &YFXFUNCTOR, 31},
  83.     { "+", &YFXFUNCTOR, 31},
  84.     { "/\\", &YFXFUNCTOR, 31},
  85.     { "\\/", &YFXFUNCTOR, 21},
  86.     { "*", &YFXFUNCTOR, 21},
  87.     { "/", &YFXFUNCTOR, 21},
  88.     { "mod", &XFXFUNCTOR, 11},
  89.     { "<<", &XFXFUNCTOR, 11},
  90.     { ">>", &XFXFUNCTOR, 11},
  91.     { NULL, NULL, 0}
  92. };
  93.     
  94. /*    create all std functors */
  95. /*    declare the std operators and expressions */
  96.  
  97. void init_std()
  98. {
  99.     short i;
  100.     functor *f;
  101.     
  102.     for (i=0; stdf[i].name; i++)
  103.         stdfunctor[i] = get_functor(stdf[i].name, stdf[i].arity);
  104.  
  105.     for (i=0; oper[i].name; i++)
  106.         add_operator(oper[i].name, *oper[i].type, oper[i].prio);
  107.  
  108.     for (i=0; exp[i].name; i++)
  109.     {
  110.         f = get_functor(exp[i].name, exp[i].arity);
  111.         f->info[0] = i+1;
  112.     }
  113. }
  114.  
  115. /*    Initialise all streams (coldstart) */
  116.  
  117. void init_streams()
  118. {
  119.     short i;
  120.     
  121.     for (i=0; i<MAXSTREAMS; i++)
  122.         streams[i].status = CLOSED;
  123.         
  124.     streams[0].fp = stdin;
  125.     streams[0].atom = USERATOM;
  126.     streams[0].status = INPUT;
  127.     streams[1].fp = stdout;
  128.     streams[1].atom = USERATOM;
  129.     streams[1].status = OUTPUT;
  130.     in = (stream *)&(streams[0]);
  131.     out = (stream *)&(streams[1]);
  132. }
  133.  
  134. /*    Very small bootstrapper */
  135. /*    Simply reads terms and tries to assert them */
  136. /*    No questions are allowed */
  137.  
  138. short bootload(name)
  139. char *name;                /* name of the boot file */
  140. {
  141.     term *t;
  142.     term *oldnext, *oldtop;        /* save copystack */
  143.  
  144.     if ((in->fp = fopen(name, "r")) == NULL)
  145.         panic(BADBOOT);
  146.  
  147.     in->atom = NILATOM;
  148.     oldnext = copynext;
  149.     oldtop = copytop;
  150.     while (TRUE)
  151.     {
  152.         t = read_term();
  153.         if (c_errno)
  154.             break;
  155.         if (!biassertz(&t))
  156.             panic(BADBOOT);
  157.     }
  158.     if (c_errno != EEOF)
  159.         panic(BADBOOT);
  160.     fclose(in->fp);
  161.     copytop = oldtop;
  162.     copynext = oldnext;
  163.     in->fp = stdin;
  164.     in->atom = USERATOM;
  165. }
  166.