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