1 /*************************************************************************
2 *									 *
3 *	 YAP Prolog 							 *
4 *									 *
5 *	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
6 *									 *
7 * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
8 *									 *
9 **************************************************************************
10 *									 *
11 * File:		other.c							 *
12 * Last rev:	Dec/90							 *
13 * mods:									 *
14 * comments:	extra routines 						 *
15 *									 *
16 *************************************************************************/
17 #ifdef SCCS
18 static char     SccsId[] = "%W% %G%";
19 #endif
20 
21 
22 #include "Yap.h"
23 #include "Yatom.h"
24 #include "YapHeap.h"
25 #if HAVE_STRING_H
26 #include <string.h>
27 #endif
28 
29 /* exile Yap_standard_regs here, otherwise WIN32 linkers may complain */
30 REGSTORE Yap_standard_regs;
31 
32 #if PUSH_REGS
33 
34 #ifdef THREADS
35 /* PushRegs always on */
36 
37 pthread_key_t Yap_yaamregs_key;
38 
39 #else
40 
41 REGSTORE *Yap_regp;
42 
43 #endif
44 
45 #else /* !PUSH_REGS */
46 
47 REGSTORE Yap_REGS;
48 
49 #endif
50 
51 Term
Yap_MkNewPairTerm(void)52 Yap_MkNewPairTerm(void)
53 {
54   register CELL  *p = H;
55 
56   RESET_VARIABLE(H);
57   RESET_VARIABLE(H+1);
58   H+=2;
59   return (AbsPair(p));
60 }
61 
62 Term
Yap_MkApplTerm(Functor f,unsigned int n,register Term * a)63 Yap_MkApplTerm(Functor f, unsigned int n, register Term *a)
64      /* build compound term with functor f and n
65       * args a */
66 {
67   CELL           *t = H;
68 
69   if (n == 0)
70     return (MkAtomTerm(NameOfFunctor(f)));
71   if (f == FunctorList)
72     return (MkPairTerm(a[0], a[1]));
73   *H++ = (CELL) f;
74   while (n--)
75     *H++ = (CELL) * a++;
76   return (AbsAppl(t));
77 }
78 
79 Term
Yap_MkNewApplTerm(Functor f,unsigned int n)80 Yap_MkNewApplTerm(Functor f, unsigned int n)
81      /* build compound term with functor f and n
82       * args a */
83 {
84   CELL           *t = H;
85 
86   if (n == 0)
87     return (MkAtomTerm(NameOfFunctor(f)));
88   if (f == FunctorList) {
89     RESET_VARIABLE(H);
90     RESET_VARIABLE(H+1);
91     H+=2;
92     return (AbsPair(t));
93   }
94   *H++ = (CELL) f;
95   while (n--) {
96     RESET_VARIABLE(H);
97     H++;
98   }
99   return (AbsAppl(t));
100 }
101 
102 
103 Term
Yap_Globalise(Term t)104 Yap_Globalise(Term t)
105 {
106   CELL *vt;
107   Term tn;
108 
109   if (!IsVarTerm(t))
110     return t;
111   vt = VarOfTerm(t);
112   if (vt <= H && vt > H0)
113     return t;
114   tn = MkVarTerm();
115   Yap_unify(t, tn);
116   return tn;
117 }
118