1 #ifndef __FDECLARE__
2 #define __FDECLARE__
3 
4 /** @file declare.h
5  *
6  *  Contains macros and function declarations.
7  */
8 
9 /* #[ License : */
10 /*
11  *   Copyright (C) 1984-2017 J.A.M. Vermaseren
12  *   When using this file you are requested to refer to the publication
13  *   J.A.M.Vermaseren "New features of FORM" math-ph/0010025
14  *   This is considered a matter of courtesy as the development was paid
15  *   for by FOM the Dutch physics granting agency and we would like to
16  *   be able to track its scientific use to convince FOM of its value
17  *   for the community.
18  *
19  *   This file is part of FORM.
20  *
21  *   FORM is free software: you can redistribute it and/or modify it under the
22  *   terms of the GNU General Public License as published by the Free Software
23  *   Foundation, either version 3 of the License, or (at your option) any later
24  *   version.
25  *
26  *   FORM is distributed in the hope that it will be useful, but WITHOUT ANY
27  *   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
28  *   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
29  *   details.
30  *
31  *   You should have received a copy of the GNU General Public License along
32  *   with FORM.  If not, see <http://www.gnu.org/licenses/>.
33  */
34 /* #] License : */
35 
36 /*
37   	#[ Macro's :
38 */
39 
40 #define MaX(x,y) ((x) > (y) ? (x): (y))
41 #define MiN(x,y) ((x) < (y) ? (x): (y))
42 #define ABS(x) ( (x) < 0 ? -(x): (x) )
43 #define SGN(x) ( (x) > 0 ? 1 : (x) < 0 ? -1 : 0 )
44 #define REDLENG(x) ((((x)<0)?((x)+1):((x)-1))/2)
45 #define INCLENG(x) (((x)<0)?(((x)*2)-1):(((x)*2)+1))
46 #define GETCOEF(x,y) x += *x;y = x[-1];x -= ABS(y);y=REDLENG(y)
47 #define GETSTOP(x,y) y=x+(*x)-1;y -= ABS(*y)-1
48 #define StuffAdd(x,y)  (((x)<0?-1:1)*(y)+((y)<0?-1:1)*(x))
49 
50 #define EXCHN(t1,t2,n) { WORD a,i; for(i=0;i<n;i++){a=t1[i];t1[i]=t2[i];t2[i]=a;} }
51 #define EXCH(x,y) { WORD a = (x); (x) = (y); (y) = a; }
52 
53 #define TOKENTOLINE(x,y) if ( AC.OutputSpaces == NOSPACEFORMAT ) { \
54 		TokenToLine((UBYTE *)(y)); } else { TokenToLine((UBYTE *)(x)); }
55 
56 #define UngetFromStream(stream,c) ((stream)->nextchar[(stream)->isnextchar++]=c)
57 #ifdef WITHRETURN
58 #define AddLineFeed(s,n) { (s)[(n)++] = CARRIAGERETURN; (s)[(n)++] = LINEFEED; }
59 #else
60 #define AddLineFeed(s,n) { (s)[(n)++] = LINEFEED; }
61 #endif
62 #define TryRecover(x) Terminate(-1)
63 #define UngetChar(c) { pushbackchar = c; }
64 #define ParseNumber(x,s) {(x)=0;while(*(s)>='0'&&*(s)<='9')(x)=10*(x)+*(s)++ -'0';}
65 #define ParseSign(sgn,s) {(sgn)=0;while(*(s)=='-'||*(s)=='+'){\
66           if ( *(s)++ == '-' ) sgn ^= 1;}}
67 #define ParseSignedNumber(x,s) { int sgn; ParseSign(sgn,s)\
68           ParseNumber(x,s) if ( sgn ) x = -x; }
69 
70 #define NCOPY(s,t,n) while ( --n >= 0 ) *s++ = *t++;
71 
72 /*#define NCOPY(s,t,n) { memcpy(s,t,n*sizeof(WORD)); s+=n; t+=n; n = -1; }*/
73 #define NCOPYI(s,t,n) while ( --n >= 0 ) *s++ = *t++;
74 #define NCOPYB(s,t,n) while ( --n >= 0 ) *s++ = *t++;
75 #define NCOPYI32(s,t,n) while ( --n >= 0 ) *s++ = *t++;
76 #define WCOPY(s,t,n) { int nn=n; WORD *ss=(WORD *)s, *tt=(WORD *)t; while ( --nn >= 0 ) *ss++=*tt++; }
77 #define NeedNumber(x,s,err) { int sgn = 1;                               \
78 		while ( *s == ' ' || *s == '\t' || *s == '-' || *s == '+' ) {    \
79 			if ( *s == '-' ) sgn = -sgn; s++; }                          \
80 		if ( chartype[*s] != 1 ) goto err;                               \
81 		ParseNumber(x,s)                                                 \
82 		if ( sgn < 0 ) (x) = -(x); while ( *s == ' ' || *s == '\t' ) s++;\
83 	}
84 #define SKIPBLANKS(s) { while ( *(s) == ' ' || *(s) == '\t' ) (s)++; }
85 #define FLUSHCONSOLE if ( AP.InOutBuf > 0 ) CharOut(LINEFEED)
86 
87 #define SKIPBRA1(s) { int lev1=0; s++; while(*s) { if(*s=='[')lev1++; \
88 					else if(*s==']'&&--lev1<0)break; s++;} }
89 #define SKIPBRA2(s) { int lev2=0; s++; while(*s) { if(*s=='{')lev2++; \
90 					else if(*s=='}'&&--lev2<0)break; \
91 					else if(*s=='[')SKIPBRA1(s) s++;} }
92 #define SKIPBRA3(s) { int lev3=0; s++; while(*s) { if(*s=='(')lev3++; \
93 					else if(*s==')'&&--lev3<0)break; \
94 					else if(*s=='{')SKIPBRA2(s) \
95 					else if(*s=='[')SKIPBRA1(s) s++;} }
96 #define SKIPBRA4(s) { int lev4=0; s++; while(*s) { if(*s=='(')lev4++; \
97 					else if(*s==')'&&--lev4<0)break; \
98 					else if(*s=='[')SKIPBRA1(s) s++;} }
99 #define SKIPBRA5(s) { int lev5=0; s++; while(*s) { if(*s=='{')lev5++; \
100 					else if(*s=='}'&&--lev5<0)break; \
101 					else if(*s=='(')SKIPBRA4(s) \
102 					else if(*s=='[')SKIPBRA1(s) s++;} }
103 
104 /*
105 #define CYCLE1(a,i) {WORD iX,jX; iX=*a; for(jX=1;jX<i;jX++)a[jX-1]=a[jX]; a[i-1]=iX;}
106 */
107 #define CYCLE1(t,a,i) {t iX=*a; WORD jX; for(jX=1;jX<i;jX++)a[jX-1]=a[jX]; a[i-1]=iX;}
108 
109 #define AddToCB(c,wx) if(c->Pointer>=c->Top) \
110 		DoubleCbuffer(c-cbuf,c->Pointer,21); \
111 		*(c->Pointer)++ = wx;
112 
113 #define EXCHINOUT { FILEHANDLE *ffFi = AR.outfile; \
114 	AR.outfile = AR.infile; AR.infile = ffFi; }
115 #define BACKINOUT { FILEHANDLE *ffFi = AR.outfile; POSITION posi; \
116 	AR.outfile = AR.infile; AR.infile = ffFi; \
117 	SetEndScratch(AR.infile,&posi); }
118 
119 #define CopyArg(to,from) { if ( *from > 0 ) { int ica = *from; NCOPY(to,from,ica) } \
120 		else if ( *from <= -FUNCTION ) *to++ = *from++;  \
121 		else { *to++ = *from++; *to++ = *from++; } }
122 
123 #if ARGHEAD > 2
124 #define FILLARG(w) { int i = ARGHEAD-2; while ( --i >= 0 ) *w++ = 0; }
125 #define COPYARG(w,t) { int i = ARGHEAD-2; while ( --i >= 0 ) *w++ = *t++; }
126 #define ZEROARG(w) { int i; for ( i = 2; i < ARGHEAD; i++ ) w[i] = 0; }
127 #else
128 #define FILLARG(w)
129 #define COPYARG(w,t)
130 #define ZEROARG(w)
131 #endif
132 
133 #if FUNHEAD > 2
134 #define FILLFUN(w) { *w++ = 0; FILLFUN3(w) }
135 #define COPYFUN(w,t) { *w++ = *t++; COPYFUN3(w,t) }
136 #else
137 #define FILLFUN(w)
138 #define COPYFUN(w,t)
139 #endif
140 
141 #if FUNHEAD > 3
142 #define FILLFUN3(w) { int ie = FUNHEAD-3; while ( --ie >= 0 ) *w++ = 0; }
143 #define COPYFUN3(w,t) { int ie = FUNHEAD-3; while ( --ie >= 0 ) *w++ = *t++; }
144 #else
145 #define COPYFUN3(w,t)
146 #define FILLFUN3(w)
147 #endif
148 
149 #if SUBEXPSIZE > 5
150 #define FILLSUB(w) { int ie = SUBEXPSIZE-5; while ( --ie >= 0 ) *w++ = 0; }
151 #define COPYSUB(w,ww) { int ie = SUBEXPSIZE-5; while ( --ie >= 0 ) *w++ = *ww++; }
152 #else
153 #define FILLSUB(w)
154 #define COPYSUB(w,ww)
155 #endif
156 
157 #if EXPRHEAD > 4
158 #define FILLEXPR(w) { int ie = EXPRHEAD-4; while ( --ie >= 0 ) *w++ = 0; }
159 #else
160 #define FILLEXPR(w)
161 #endif
162 
163 #define NEXTARG(x) if(*x>0) x += *x; else if(*x <= -FUNCTION)x++; else x += 2;
164 #define COPY1ARG(s1,t1) { int ica; if ( (ica=*t1) > 0 ) { NCOPY(s1,t1,ica) } \
165 		else if(*t1<=-FUNCTION){*s1++=*t1++;} else{*s1++=*t1++;*s1++=*t1++;} }
166 
167 /**
168  * Fills a buffer by zero in the range [begin,end).
169  *
170  * @param  w      The buffer.
171  * @param  begin  The index for the beginning of the range.
172  * @param  end    The index for the end of the range (exclusive).
173  */
174 #define ZeroFillRange(w,begin,end) do { \
175 	int tmp_i; \
176 	for ( tmp_i = begin; tmp_i < end; tmp_i++ ) { (w)[tmp_i] = 0; } \
177 } while (0)
178 
179 #define TABLESIZE(a,b) (((WORD)sizeof(a))/((WORD)sizeof(b)))
180 #define WORDDIF(x,y) (WORD)(x-y)
181 #define wsizeof(a) ((WORD)sizeof(a))
182 #define VARNAME(type,num) (AC.varnames->namebuffer+type[num].name)
183 #define DOLLARNAME(type,num) (AC.dollarnames->namebuffer+type[num].name)
184 #define EXPRNAME(num) (AC.exprnames->namebuffer+Expressions[num].name)
185 
186 #define PREV(x) prevorder?prevorder:x
187 
188 #define SETERROR(x) { Terminate(-1); return(-1); }
189 
190 /* use this macro to avoid the unused parameter warning */
191 #define DUMMYUSE(x) (void)(x);
192 
193 #ifdef _FILE_OFFSET_BITS
194 #if _FILE_OFFSET_BITS==64
195 /*:[19mar2004 mt]*/
196 
197 #define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(off_t)(x))
198 #define SETBASELENGTH(ss,x) (ss).p1 = (off_t)(x)
199 #define SETBASEPOSITION(pp,x) (pp).p1 = (off_t)(x)
200 #define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(off_t)(x)) )
201 #define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(off_t)(x)) )
202 #define DIVPOS(pp,n) ( (pp).p1/(off_t)(n) )
203 #define MULPOS(pp,n) (pp).p1 *= (off_t)(n)
204 
205 #else
206 
207 #define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(x))
208 #define SETBASELENGTH(ss,x) (ss).p1 = (x)
209 #define SETBASEPOSITION(pp,x) (pp).p1 = (x)
210 #define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(LONG)(x)) )
211 #define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(LONG)(x)) )
212 #define DIVPOS(pp,n) ( (pp).p1/(n) )
213 #define MULPOS(pp,n) (pp).p1 *= (n)
214 #endif
215 #else
216 
217 #define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(LONG)(x))
218 #define SETBASELENGTH(ss,x) (ss).p1 = (LONG)(x)
219 #define SETBASEPOSITION(pp,x) (pp).p1 = (LONG)(x)
220 #define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(LONG)(x)) )
221 #define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(LONG)(x)) )
222 #define DIVPOS(pp,n) ( (pp).p1/(LONG)(n) )
223 #define MULPOS(pp,n) (pp).p1 *= (LONG)(n)
224 
225 #endif
226 #define DIFPOS(ss,pp1,pp2) (ss).p1 = ((pp1).p1-(pp2).p1)
227 #define DIFBASE(pp1,pp2) ((pp1).p1-(pp2).p1)
228 #define ADD2POS(pp1,pp2) (pp1).p1 += (pp2).p1
229 #define PUTZERO(pp) (pp).p1 = 0
230 #define BASEPOSITION(pp) ((pp).p1)
231 #define SETSTARTPOS(pp) (pp).p1 = -2
232 #define NOTSTARTPOS(pp) ( (pp).p1 > -2 )
233 #define ISMINPOS(pp) ( (pp).p1 == -1 )
234 #define ISEQUALPOS(pp1,pp2) ( (pp1).p1 == (pp2).p1 )
235 #define ISNOTEQUALPOS(pp1,pp2) ( (pp1).p1 != (pp2).p1 )
236 #define ISLESSPOS(pp1,pp2) ( (pp1).p1 < (pp2).p1 )
237 #define ISGEPOS(pp1,pp2) ( (pp1).p1 >= (pp2).p1 )
238 #define ISNOTZEROPOS(pp) ( (pp).p1 != 0 )
239 #define ISZEROPOS(pp) ( (pp).p1 == 0 )
240 #define ISPOSPOS(pp) ( (pp).p1 > 0 )
241 #define ISNEGPOS(pp) ( (pp).p1 < 0 )
242 extern VOID TELLFILE(int,POSITION *);
243 
244 #define TOLONG(x) ((LONG)(x))
245 
246 #define Add2Com(x) { WORD cod[2]; cod[0] = x; cod[1] = 2; AddNtoL(2,cod); }
247 #define Add3Com(x1,x2) { WORD cod[3]; cod[0] = x1; cod[1] = 3; cod[2] = x2; AddNtoL(3,cod); }
248 #define Add4Com(x1,x2,x3) { WORD cod[4]; cod[0] = x1; cod[1] = 4; \
249    cod[2] = x2; cod[3] = x3; AddNtoL(4,cod); }
250 #define Add5Com(x1,x2,x3,x4) { WORD cod[5]; cod[0] = x1; cod[1] = 5; \
251    cod[2] = x2; cod[3] = x3; cod[4] = x4; AddNtoL(5,cod); }
252 
253 /*
254 	The temporary variable ppp is to avoid a compiler warning about strict aliassing
255 */
256 #define WantAddPointers(x) while((AT.pWorkPointer+(x))>AR.pWorkSize){WORD ***ppp=&AT.pWorkSpace;\
257 	ExpandBuffer((void **)ppp,&AR.pWorkSize,(int)(sizeof(WORD *)));}
258 #define WantAddLongs(x) while((AT.lWorkPointer+(x))>AR.lWorkSize){LONG **ppp=&AT.lWorkSpace;\
259 	ExpandBuffer((void **)ppp,&AR.lWorkSize,sizeof(LONG));}
260 #define WantAddPositions(x) while((AT.posWorkPointer+(x))>AR.posWorkSize){POSITION **ppp=&AT.posWorkSpace;\
261 	ExpandBuffer((void **)ppp,&AR.posWorkSize,sizeof(POSITION));}
262 
263 /* inline in form3.h (or config.h). */
264 #define FORM_INLINE inline
265 
266 /*
267 	Macro's for memory management. This can be done by routines, but that
268 	would be slower. Inline routines could do this, but we don't want to
269 	leave this to the friendliness of the compiler(s).
270 	The routines can be found in the file tools.c
271 */
272 #define MEMORYMACROS
273 
274 #ifdef MEMORYMACROS
275 
276 #define TermMalloc(x) ( (AT.TermMemTop <= 0 ) ? TermMallocAddMemory(BHEAD0), AT.TermMemHeap[--AT.TermMemTop]: AT.TermMemHeap[--AT.TermMemTop] )
277 #define NumberMalloc(x) ( (AT.NumberMemTop <= 0 ) ? NumberMallocAddMemory(BHEAD0), AT.NumberMemHeap[--AT.NumberMemTop]: AT.NumberMemHeap[--AT.NumberMemTop] )
278 #define CacheNumberMalloc(x) ( (AT.CacheNumberMemTop <= 0 ) ? CacheNumberMallocAddMemory(BHEAD0), AT.CacheNumberMemHeap[--AT.CacheNumberMemTop]: AT.CacheNumberMemHeap[--AT.CacheNumberMemTop] )
279 #define TermFree(TermMem,x) AT.TermMemHeap[AT.TermMemTop++] = (WORD *)(TermMem)
280 #define NumberFree(NumberMem,x) AT.NumberMemHeap[AT.NumberMemTop++] = (UWORD *)(NumberMem)
281 #define CacheNumberFree(NumberMem,x) AT.CacheNumberMemHeap[AT.CacheNumberMemTop++] = (UWORD *)(NumberMem)
282 
283 #else
284 
285 #define TermMalloc(x) TermMalloc2(BHEAD (char *)(x))
286 #define NumberMalloc(x) NumberMalloc2(BHEAD (char *)(x))
287 #define CacheNumberMalloc(x) CacheNumberMalloc2(BHEAD (char *)(x))
288 #define TermFree(x,y) TermFree2(BHEAD (WORD *)(x),(char *)(y))
289 #define NumberFree(x,y) NumberFree2(BHEAD (UWORD *)(x),(char *)(y))
290 #define CacheNumberFree(x,y) CacheNumberFree2(BHEAD (UWORD *)(x),(char *)(y))
291 
292 #endif
293 
294 /*
295  * Macros for checking nesting levels in the compiler, used as follows:
296  *
297  *   AC.IfSumCheck[AC.IfLevel] = NestingChecksum();
298  *   AC.IfLevel++;
299  *
300  *   AC.IfLevel--;
301  *   if ( AC.IfSumCheck[AC.IfLevel] != NestingChecksum() ) {
302  *     MesNesting();
303  *   }
304  *
305  * Note that NestingChecksum() also contains AC.IfLevel and so in this case
306  * using increment/decrement operators on it in the left-hand side may be
307  * confusing.
308  */
309 #define NestingChecksum() (AC.IfLevel + AC.RepLevel + AC.arglevel + AC.insidelevel + AC.termlevel + AC.inexprlevel + AC.dolooplevel +AC.SwitchLevel)
310 #define MesNesting() MesPrint("&Illegal nesting of if, repeat, argument, inside, term, inexpression and do")
311 
312 #define MarkPolyRatFunDirty(T) {if(*T&&AR.PolyFunType==2){WORD *TP,*TT;TT=T+*T;TT-=ABS(TT[-1]);\
313 TP=T+1;while(TP<TT){if(*TP==AR.PolyFun){TP[2]|=(DIRTYFLAG|MUSTCLEANPRF);}TP+=TP[1];}}}
314 
315 /*
316 	Macros for nesting input levels for #$name = ...; assign instructions.
317 	Note that the level should never go below zero.
318 */
319 #define PUSHPREASSIGNLEVEL AP.PreAssignLevel++; { GETIDENTITY \
320     if ( AP.PreAssignLevel >= AP.MaxPreAssignLevel ) { int i; \
321 		LONG *ap = (LONG *)Malloc1(2*AP.MaxPreAssignLevel*sizeof(LONG *),"PreAssignStack"); \
322 		for ( i = 0; i < AP.MaxPreAssignLevel; i++ ) ap[i] = AP.PreAssignStack[i]; \
323 		M_free(AP.PreAssignStack,"PreAssignStack"); \
324 		AP.MaxPreAssignLevel *= 2; AP.PreAssignStack = ap; \
325 	} \
326 	*AT.WorkPointer++ = AP.PreContinuation; AP.PreContinuation = 0; \
327 	AP.PreAssignStack[AP.PreAssignLevel] = AC.iPointer - AC.iBuffer; }
328 
329 #define POPPREASSIGNLEVEL if ( AP.PreAssignLevel > 0 ) { GETIDENTITY \
330 	AC.iPointer = AC.iBuffer + AP.PreAssignStack[AP.PreAssignLevel--]; \
331 	AP.PreContinuation = *--AT.WorkPointer; \
332 	*AC.iPointer = 0; }
333 
334 /*
335 	MesPrint("P-level popped to %d with %d",AP.PreAssignLevel,(WORD)(AC.iPointer - AC.iBuffer));
336 
337   	#] Macro's :
338   	#[ Inline functions :
339 */
340 
341 /*
342  * The following three functions give the unsigned absolute value of a signed
343  * integer even for the most negative integer. This is beyond the scope of
344  * the standard abs() function and its family, whose return-values are signed.
345  * In short, we should not use the unary minus operator with signed numbers
346  * unless we are sure that there are no integer overflows. Instead, we rely on
347  * two well-defined operations: (i) signed-to-unsigned conversion and
348  * (ii) unary minus of unsigned operands.
349  *
350  * See also:
351  *   https://stackoverflow.com/a/4536188   (Unary minus and signed-to-unsigned conversion)
352  *   https://stackoverflow.com/q/8026694   (C: unary minus operator behavior with unsigned operands)
353  *   https://stackoverflow.com/q/1610947   (Why does stdlib.h's abs() family of functions return a signed value?)
354  *   https://blog.regehr.org/archives/226  (A Guide to Undefined Behavior in C and C++, Part 2)
355  */
IntAbs(int x)356 static inline unsigned int IntAbs(int x)
357 {
358 	if ( x >= 0 ) return x;
359 	return(-((unsigned int)x));
360 }
361 
WordAbs(WORD x)362 static inline UWORD WordAbs(WORD x)
363 {
364 	if ( x >= 0 ) return x;
365 	return(-((UWORD)x));
366 }
367 
LongAbs(LONG x)368 static inline ULONG LongAbs(LONG x)
369 {
370 	if ( x >= 0 ) return x;
371 	return(-((ULONG)x));
372 }
373 
374 /*
375  * The following functions provide portable unsigned-to-signed conversions
376  * (to avoid the implementation-defined behaviour), which is expected to be
377  * optimized to a no-op.
378  *
379  * See also:
380  *   https://stackoverflow.com/a/13208789  (Efficient unsigned-to-signed cast avoiding implementation-defined behavior)
381  */
UnsignedToInt(unsigned int x)382 static inline int UnsignedToInt(unsigned int x)
383 {
384 	extern void Terminate(int);
385 	if ( x <= INT_MAX ) return(x);
386 	if ( x >= (unsigned int)INT_MIN ) return((int)(x - INT_MIN) + INT_MIN);
387 	Terminate(1);
388 	return(0);
389 }
390 
UWordToWord(UWORD x)391 static inline WORD UWordToWord(UWORD x)
392 {
393 	extern void Terminate(int);
394 	if ( x <= WORD_MAX_VALUE ) return(x);
395 	if ( x >= (UWORD)WORD_MIN_VALUE ) return((WORD)(x - WORD_MIN_VALUE) + WORD_MIN_VALUE);
396 	Terminate(1);
397 	return(0);
398 }
399 
ULongToLong(ULONG x)400 static inline LONG ULongToLong(ULONG x)
401 {
402 	extern void Terminate(int);
403 	if ( x <= LONG_MAX_VALUE ) return(x);
404 	if ( x >= (ULONG)LONG_MIN_VALUE ) return((LONG)(x - LONG_MIN_VALUE) + LONG_MIN_VALUE);
405 	Terminate(1);
406 	return(0);
407 }
408 
409 /*
410   	#] Inline functions :
411   	#[ Thread objects :
412 */
413 
414 /**
415  * NOTE: We have replaced LOCK(ErrorMessageLock) and UNLOCK(ErrorMessageLock)
416  * by MLOCK(ErrorMessageLock) and MUNLOCK(ErrorMessageLock). They are used
417  * for the synchronised output in ParFORM.
418  * (TU 28 May 2011)
419  */
420 #ifdef WITHPTHREADS
421 
422 #define EXTERNLOCK(x) extern pthread_mutex_t x;
423 #define INILOCK(x)    pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER;
424 #define EXTERNRWLOCK(x) extern pthread_rwlock_t x;
425 #define INIRWLOCK(x)    pthread_rwlock_t x = PTHREAD_RWLOCK_INITIALIZER;
426 #ifdef DEBUGGINGLOCKS
427 #include <asm/errno.h>
428 #define LOCK(x)       while ( pthread_mutex_trylock(&(x)) == EBUSY ) {}
429 #define RWLOCKR(x)      while ( pthread_rwlock_tryrdlock(&(x)) == EBUSY ) {}
430 #define RWLOCKW(x)      while ( pthread_rwlock_trywrlock(&(x)) == EBUSY ) {}
431 #else
432 #define LOCK(x)       pthread_mutex_lock(&(x))
433 #define RWLOCKR(x)      pthread_rwlock_rdlock(&(x))
434 #define RWLOCKW(x)      pthread_rwlock_wrlock(&(x))
435 #endif
436 #define UNLOCK(x)     pthread_mutex_unlock(&(x))
437 #define UNRWLOCK(x)     pthread_rwlock_unlock(&(x))
438 #define MLOCK(x)      LOCK(x)
439 #define MUNLOCK(x)    UNLOCK(x)
440 
441 #define GETBIDENTITY
442 #define GETIDENTITY   int identity = WhoAmI(); ALLPRIVATES *B = AB[identity];
443 #else
444 
445 #define EXTERNLOCK(x)
446 #define INILOCK(x)
447 #define LOCK(x)
448 #define UNLOCK(x)
449 #define EXTERNRWLOCK(x)
450 #define INIRWLOCK(x)
451 #define RWLOCKR(x)
452 #define RWLOCKW(x)
453 #define UNRWLOCK(x)
454 #ifdef WITHMPI
455 #define MLOCK(x)      do { if ( PF.me != MASTER ) PF_MLock(); } while (0)
456 #define MUNLOCK(x)    do { if ( PF.me != MASTER ) PF_MUnlock(); } while (0)
457 #else
458 #define MLOCK(x)
459 #define MUNLOCK(x)
460 #endif
461 #define GETIDENTITY
462 #define GETBIDENTITY
463 
464 #endif
465 
466 /*
467   	#] Thread objects :
468   	#[ Declarations :
469 */
470 
471 #ifdef TERMMALLOCDEBUG
472 extern WORD **DebugHeap1, **DebugHeap2;
473 #endif
474 
475 /**
476  *	All functions (well, nearly all) are declared here.
477  */
478 
479 extern VOID   StartVariables();
480 extern VOID   setSignalHandlers(VOID);
481 extern UBYTE *CodeToLine(WORD,UBYTE *);
482 extern UBYTE *AddArrayIndex(WORD ,UBYTE *);
483 extern INDEXENTRY *FindInIndex(WORD,FILEDATA *,WORD,WORD);
484 extern INDEXENTRY *NextFileIndex(POSITION *);
485 extern WORD  *PasteTerm(PHEAD WORD,WORD *,WORD *,WORD,WORD);
486 extern UBYTE *StrCopy(UBYTE *,UBYTE *);
487 extern UBYTE *WrtPower(UBYTE *,WORD);
488 extern WORD   AccumGCD(PHEAD UWORD *,WORD *,UWORD *,WORD);
489 extern VOID   AddArgs(PHEAD WORD *,WORD *,WORD *);
490 extern WORD   AddCoef(PHEAD WORD **,WORD **);
491 extern WORD   AddLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
492 extern WORD   AddPLon(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
493 extern WORD   AddPoly(PHEAD WORD **,WORD **);
494 extern WORD   AddRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
495 extern VOID   AddToLine(UBYTE *);
496 extern WORD   AddWild(PHEAD WORD,WORD,WORD);
497 extern WORD   BigLong(UWORD *,WORD,UWORD *,WORD);
498 extern WORD   BinomGen(PHEAD WORD *,WORD,WORD **,WORD,WORD,WORD,WORD,WORD,UWORD *,WORD);
499 extern WORD   CheckWild(PHEAD WORD,WORD,WORD,WORD *);
500 extern WORD   Chisholm(PHEAD WORD *,WORD);
501 extern WORD   CleanExpr(WORD);
502 extern VOID   CleanUp(WORD);
503 extern VOID   ClearWild(PHEAD0);
504 extern WORD   CompareFunctions(WORD *,WORD *);
505 extern WORD   Commute(WORD *,WORD *);
506 extern WORD   DetCommu(WORD *);
507 extern WORD   DoesCommu(WORD *);
508 extern int    CompArg(WORD *,WORD *);
509 extern WORD   CompCoef(WORD *, WORD *);
510 extern WORD   CompGroup(PHEAD WORD,WORD **,WORD *,WORD *,WORD);
511 extern WORD   Compare1(WORD *,WORD *,WORD);
512 extern WORD   CountDo(WORD *,WORD *);
513 extern WORD   CountFun(WORD *,WORD *);
514 extern WORD   DimensionSubterm(WORD *);
515 extern WORD   DimensionTerm(WORD *);
516 extern WORD   DimensionExpression(PHEAD WORD *);
517 extern WORD   Deferred(PHEAD WORD *,WORD);
518 extern WORD   DeleteStore(WORD);
519 extern WORD   DetCurDum(PHEAD WORD *);
520 extern VOID   DetVars(WORD *,WORD);
521 extern WORD   Distribute(DISTRIBUTE *,WORD);
522 extern WORD   DivLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *,UWORD *,WORD *);
523 extern WORD   DivRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
524 extern WORD   Divvy(PHEAD UWORD *,WORD *,UWORD *,WORD);
525 extern WORD   DoDelta(WORD *);
526 extern WORD   DoDelta3(PHEAD WORD *,WORD);
527 extern WORD   TestPartitions(WORD *, PARTI *);
528 extern WORD   DoPartitions(PHEAD WORD *,WORD);
529 extern int    CoCanonicalize(UBYTE *);
530 extern int    DoCanonicalize(PHEAD WORD *, WORD *);
531 extern WORD   GenTopologies(PHEAD WORD *,WORD);
532 extern WORD   GenDiagrams(PHEAD WORD *,WORD);
533 extern int    DoTopologyCanonicalize(PHEAD WORD *,WORD,WORD,WORD *);
534 extern int    DoShattering(PHEAD WORD *,WORD *,WORD *,WORD);
535 extern WORD   GenerateTopologies(PHEAD WORD,WORD,WORD,WORD);
536 extern WORD   DoTableExpansion(WORD *,WORD);
537 extern WORD   DoDistrib(PHEAD WORD *,WORD);
538 extern WORD   DoShuffle(WORD *,WORD,WORD,WORD);
539 extern WORD   DoPermutations(PHEAD WORD *,WORD);
540 extern int    Shuffle(WORD *, WORD *, WORD *);
541 extern int    FinishShuffle(WORD *);
542 extern WORD   DoStuffle(WORD *,WORD,WORD,WORD);
543 extern int    Stuffle(WORD *, WORD *, WORD *);
544 extern int    FinishStuffle(WORD *);
545 extern WORD  *StuffRootAdd(WORD *, WORD *, WORD *);
546 extern WORD   TestUse(WORD *,WORD);
547 extern DBASE *FindTB(UBYTE *);
548 extern int    CheckTableDeclarations(DBASE *);
549 extern WORD   Apply(WORD *,WORD);
550 extern int    ApplyExec(WORD *,int,WORD);
551 extern WORD   ApplyReset(WORD);
552 extern WORD   TableReset(VOID);
553 extern VOID   ReWorkT(WORD *,WORD *,WORD);
554 extern WORD   GetIfDollarNum(WORD *, WORD *);
555 extern int    FindVar(WORD *,WORD *);
556 extern WORD   DoIfStatement(PHEAD WORD *,WORD *);
557 extern WORD   DoOnePow(PHEAD WORD *,WORD,WORD,WORD *,WORD *,WORD,WORD *);
558 extern void   DoRevert(WORD *,WORD *);
559 extern WORD   DoSumF1(PHEAD WORD *,WORD *,WORD,WORD);
560 extern WORD   DoSumF2(PHEAD WORD *,WORD *,WORD,WORD);
561 extern WORD   DoTheta(PHEAD WORD *);
562 extern LONG   EndSort(PHEAD WORD *,int);
563 extern WORD   EntVar(WORD,UBYTE *,WORD,WORD,WORD,WORD);
564 extern WORD   EpfCon(PHEAD WORD *,WORD *,WORD,WORD);
565 extern WORD   EpfFind(PHEAD WORD *,WORD *);
566 extern WORD   EpfGen(WORD,WORD *,WORD *,WORD *,WORD);
567 extern WORD   EqualArg(WORD *,WORD,WORD);
568 extern WORD   Evaluate(UBYTE **);
569 extern int    Factorial(PHEAD WORD,UWORD *,WORD *);
570 extern int    Bernoulli(WORD,UWORD *,WORD *);
571 extern int    FactorIn(PHEAD WORD *,WORD);
572 extern int    FactorInExpr(PHEAD WORD *,WORD);
573 extern WORD   FindAll(PHEAD WORD *,WORD *,WORD,WORD *);
574 extern WORD   FindMulti(PHEAD WORD *,WORD *);
575 extern WORD   FindOnce(PHEAD WORD *,WORD *);
576 extern WORD   FindOnly(PHEAD WORD *,WORD *);
577 extern WORD   FindRest(PHEAD WORD *,WORD *);
578 extern WORD   FindSpecial(WORD *);
579 extern WORD   FindrNumber(WORD,VARRENUM *);
580 extern VOID   FiniLine(VOID);
581 extern WORD   FiniTerm(PHEAD WORD *,WORD *,WORD *,WORD,WORD);
582 extern WORD   FlushOut(POSITION *,FILEHANDLE *,int);
583 extern VOID   FunLevel(PHEAD WORD *);
584 extern VOID   AdjustRenumScratch(PHEAD0);
585 extern VOID   GarbHand(VOID);
586 extern WORD   GcdLong(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
587 extern WORD   LcmLong(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
588 extern VOID   GCD(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
589 extern ULONG  GCD2(ULONG,ULONG);
590 extern WORD   Generator(PHEAD WORD *,WORD);
591 extern WORD   GetBinom(UWORD *,WORD *,WORD,WORD);
592 extern WORD   GetFromStore(WORD *,POSITION *,RENUMBER,WORD *,WORD);
593 extern WORD   GetLong(UBYTE *,UWORD *,WORD *);
594 extern WORD   GetMoreTerms(WORD *);
595 extern WORD   GetMoreFromMem(WORD *,WORD **);
596 extern WORD   GetOneTerm(PHEAD WORD *,FILEHANDLE *,POSITION *,int);
597 extern RENUMBER GetTable(WORD,POSITION *,WORD);
598 extern WORD   GetTerm(PHEAD WORD *);
599 extern WORD   Glue(PHEAD WORD *,WORD *,WORD *,WORD);
600 extern WORD   InFunction(PHEAD WORD *,WORD *);
601 extern VOID   IniLine(WORD);
602 extern WORD   IniVars(VOID);
603 extern VOID   Initialize(VOID);
604 extern WORD   InsertTerm(PHEAD WORD *,WORD,WORD,WORD *,WORD *,WORD);
605 extern VOID   LongToLine(UWORD *,WORD);
606 extern WORD   MakeDirty(WORD *,WORD *,WORD);
607 extern VOID   MarkDirty(WORD *,WORD);
608 extern VOID   PolyFunDirty(PHEAD WORD *);
609 extern VOID   PolyFunClean(PHEAD WORD *);
610 extern WORD   MakeModTable(VOID);
611 extern WORD   MatchE(PHEAD WORD *,WORD *,WORD *,WORD);
612 extern int    MatchCy(PHEAD WORD *,WORD *,WORD *,WORD);
613 extern int    FunMatchCy(PHEAD WORD *,WORD *,WORD *,WORD);
614 extern int    FunMatchSy(PHEAD WORD *,WORD *,WORD *,WORD);
615 extern int    MatchArgument(PHEAD WORD *,WORD *);
616 extern WORD   MatchFunction(PHEAD WORD *,WORD *,WORD *);
617 extern WORD   MergePatches(WORD);
618 extern WORD   MesCerr(char *, UBYTE *);
619 extern WORD   MesComp(char *, UBYTE *, UBYTE *);
620 extern WORD   Modulus(WORD *);
621 extern VOID   MoveDummies(PHEAD WORD *,WORD);
622 extern WORD   MulLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
623 extern WORD   MulRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
624 extern WORD   Mully(PHEAD UWORD *,WORD *,UWORD *,WORD);
625 extern WORD   MultDo(PHEAD WORD *,WORD *);
626 extern WORD   NewSort(PHEAD0);
627 extern WORD   ExtraSymbol(WORD,WORD,WORD,WORD *,WORD *);
628 extern WORD   Normalize(PHEAD WORD *);
629 extern WORD   BracketNormalize(PHEAD WORD *);
630 extern VOID   DropCoefficient(PHEAD WORD *);
631 extern VOID   DropSymbols(PHEAD WORD *);
632 extern int    PutInside(PHEAD WORD *, WORD *);
633 extern WORD   OpenTemp(VOID);
634 extern VOID   Pack(UWORD *,WORD *,UWORD *,WORD );
635 extern LONG   PasteFile(PHEAD WORD,WORD *,POSITION *,WORD **,RENUMBER,WORD *,WORD);
636 extern WORD   Permute(PERM *,WORD);
637 extern WORD   PermuteP(PERMP *,WORD);
638 extern WORD   PolyFunMul(PHEAD WORD *);
639 extern WORD   PopVariables(VOID);
640 extern WORD   PrepPoly(PHEAD WORD *,WORD);
641 extern WORD   Processor(VOID);
642 extern WORD   Product(UWORD *,WORD *,WORD);
643 extern VOID   PrtLong(UWORD *,WORD,UBYTE *);
644 extern VOID   PrtTerms(VOID);
645 extern VOID   PrintRunningTime(VOID);
646 extern LONG   GetRunningTime(VOID);
647 extern WORD   PutBracket(PHEAD WORD *);
648 extern LONG   PutIn(FILEHANDLE *,POSITION *,WORD *,WORD **,int);
649 extern WORD   PutInStore(INDEXENTRY *,WORD);
650 extern WORD   PutOut(PHEAD WORD *,POSITION *,FILEHANDLE *,WORD);
651 extern UWORD  Quotient(UWORD *,WORD *,WORD);
652 extern WORD   RaisPow(PHEAD UWORD *,WORD *,UWORD);
653 extern VOID   RaisPowCached (PHEAD WORD, WORD, UWORD **, WORD *);
654 extern WORD   RaisPowMod (WORD, WORD, WORD);
655 extern int    NormalModulus(UWORD *,WORD *);
656 extern int    MakeInverses(VOID);
657 extern int    GetModInverses(WORD,WORD,WORD *,WORD *);
658 extern int    GetLongModInverses(PHEAD UWORD *, WORD, UWORD *, WORD, UWORD *, WORD *, UWORD *, WORD *);
659 extern VOID   RatToLine(UWORD *,WORD);
660 extern WORD   RatioFind(PHEAD WORD *,WORD *);
661 extern WORD   RatioGen(PHEAD WORD *,WORD *,WORD,WORD);
662 extern WORD   ReNumber(PHEAD WORD *);
663 extern WORD   ReadSnum(UBYTE **);
664 extern WORD   Remain10(UWORD *,WORD *);
665 extern WORD   Remain4(UWORD *,WORD *);
666 extern WORD   ResetScratch(VOID);
667 extern WORD   ResolveSet(PHEAD WORD *,WORD *,WORD *);
668 extern WORD   RevertScratch(VOID);
669 extern WORD   ScanFunctions(PHEAD WORD *,WORD *,WORD);
670 extern VOID   SeekScratch(FILEHANDLE *,POSITION *);
671 extern VOID   SetEndScratch(FILEHANDLE *,POSITION *);
672 extern VOID   SetEndHScratch(FILEHANDLE *,POSITION *);
673 extern WORD   SetFileIndex(VOID);
674 extern WORD   Sflush(FILEHANDLE *);
675 extern WORD   Simplify(PHEAD UWORD *,WORD *,UWORD *,WORD *);
676 extern WORD   SortWild(WORD *,WORD);
677 extern FILE  *LocateBase(char **,char **);
678 extern LONG   SplitMerge(PHEAD WORD **,LONG);
679 extern WORD   StoreTerm(PHEAD WORD *);
680 extern VOID   SubPLon(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
681 extern VOID   Substitute(PHEAD WORD *,WORD *,WORD);
682 extern WORD   SymFind(PHEAD WORD *,WORD *);
683 extern WORD   SymGen(PHEAD WORD *,WORD *,WORD,WORD);
684 extern WORD   Symmetrize(PHEAD WORD *,WORD *,WORD,WORD,WORD);
685 extern int    FullSymmetrize(PHEAD WORD *,int);
686 extern WORD   TakeModulus(UWORD *,WORD *,UWORD *,WORD,WORD);
687 extern WORD   TakeNormalModulus(UWORD *,WORD *,UWORD *,WORD,WORD);
688 extern VOID   TalToLine(UWORD);
689 extern WORD   TenVec(PHEAD WORD *,WORD *,WORD,WORD);
690 extern WORD   TenVecFind(PHEAD WORD *,WORD *);
691 extern WORD   TermRenumber(WORD *,RENUMBER,WORD);
692 extern VOID   TestDrop(VOID);
693 extern VOID   PutInVflags(WORD);
694 extern WORD   TestMatch(PHEAD WORD *,WORD *);
695 extern WORD   TestSub(PHEAD WORD *,WORD);
696 extern LONG   TimeCPU(WORD);
697 extern LONG   TimeChildren(WORD);
698 extern LONG   TimeWallClock(WORD);
699 extern LONG   Timer(int);
700 extern int    GetTimerInfo(LONG **,LONG **);
701 extern void   WriteTimerInfo(LONG *,LONG *);
702 extern LONG   GetWorkerTimes(VOID);
703 extern WORD   ToStorage(EXPRESSIONS,POSITION *);
704 extern VOID   TokenToLine(UBYTE *);
705 extern WORD   Trace4(PHEAD WORD *,WORD *,WORD,WORD);
706 extern WORD   Trace4Gen(PHEAD TRACES *,WORD);
707 extern WORD   Trace4no(WORD,WORD *,TRACES *);
708 extern WORD   TraceFind(PHEAD WORD *,WORD *);
709 extern WORD   TraceN(PHEAD WORD *,WORD *,WORD,WORD);
710 extern WORD   TraceNgen(PHEAD TRACES *,WORD);
711 extern WORD   TraceNno(WORD,WORD *,TRACES *);
712 extern WORD   Traces(PHEAD WORD *,WORD *,WORD,WORD);
713 extern WORD   Trick(WORD *,TRACES *);
714 extern WORD   TryDo(PHEAD WORD *,WORD *,WORD);
715 extern VOID   UnPack(UWORD *,WORD,WORD *,WORD *);
716 extern WORD   VarStore(UBYTE *,WORD,WORD,WORD);
717 extern WORD   WildFill(PHEAD WORD *,WORD *,WORD *);
718 extern WORD   WriteAll(VOID);
719 extern WORD   WriteOne(UBYTE *,int,int,WORD);
720 extern VOID   WriteArgument(WORD *);
721 extern WORD   WriteExpression(WORD *,LONG);
722 extern WORD   WriteInnerTerm(WORD *,WORD);
723 extern VOID   WriteLists(VOID);
724 extern VOID   WriteSetup(VOID);
725 extern VOID   WriteStats(POSITION *,WORD);
726 extern WORD   WriteSubTerm(WORD *,WORD);
727 extern WORD   WriteTerm(WORD *,WORD *,WORD,WORD,WORD);
728 extern WORD   execarg(PHEAD WORD *,WORD);
729 extern WORD   execterm(PHEAD WORD *,WORD);
730 extern VOID   SpecialCleanup(PHEAD0);
731 extern void   SetMods();
732 extern void   UnSetMods();
733 
734 /*---------------------------------------------------------------------*/
735 
736 extern WORD   DoExecute(WORD,WORD);
737 extern VOID   SetScratch(FILEHANDLE *,POSITION *);
738 extern VOID   Warning(char *);
739 extern VOID   HighWarning(char *);
740 extern int    SpareTable(TABLES);
741 
742 extern UBYTE *strDup1(UBYTE *,char *);
743 extern VOID  *Malloc(LONG);
744 extern VOID  *Malloc1(LONG,const char *);
745 extern int    DoTail(int,UBYTE **);
746 extern int    OpenInput(VOID);
747 extern int    PutPreVar(UBYTE *,UBYTE *,UBYTE *,int);
748 extern VOID   Error0(char *);
749 extern VOID   Error1(char *,UBYTE *);
750 extern VOID   Error2(char *,char *,UBYTE *);
751 extern UBYTE  ReadFromStream(STREAM *);
752 extern UBYTE  GetFromStream(STREAM *);
753 extern UBYTE  LookInStream(STREAM *);
754 extern STREAM *OpenStream(UBYTE *,int,int,int);
755 extern int    LocateFile(UBYTE **,int);
756 extern STREAM *CloseStream(STREAM *);
757 extern VOID   PositionStream(STREAM *,LONG);
758 extern int    ReverseStatements(STREAM *);
759 extern int    ProcessOption(UBYTE *,UBYTE *,int);
760 extern int    DoSetups(VOID);
761 extern VOID   Terminate(int);
762 extern NAMENODE *GetNode(NAMETREE *,UBYTE *);
763 extern int    AddName(NAMETREE *,UBYTE *,WORD,WORD,int *);
764 extern int    GetName(NAMETREE *,UBYTE *,WORD *,int);
765 extern UBYTE  *GetFunction(UBYTE *,WORD *);
766 extern UBYTE  *GetNumber(UBYTE *,WORD *);
767 extern int    GetLastExprName(UBYTE *,WORD *);
768 extern int    GetAutoName(UBYTE *,WORD *);
769 extern int    GetVar(UBYTE *,WORD *,WORD *,int,int);
770 extern int    MakeDubious(NAMETREE *,UBYTE *,WORD *);
771 extern int    GetOName(NAMETREE *,UBYTE *,WORD *,int);
772 extern VOID   DumpTree(NAMETREE *);
773 extern VOID   DumpNode(NAMETREE *,WORD,WORD);
774 extern VOID   LinkTree(NAMETREE *,WORD,WORD);
775 extern VOID   CopyTree(NAMETREE *,NAMETREE *,WORD,WORD);
776 extern int    CompactifyTree(NAMETREE *,WORD);
777 extern NAMETREE *MakeNameTree(VOID);
778 extern VOID   FreeNameTree(NAMETREE *);
779 extern int    AddExpression(UBYTE *,int,int);
780 extern int    AddSymbol(UBYTE *,int,int,int,int);
781 extern int    AddDollar(UBYTE *,WORD,WORD *,LONG);
782 extern int    ReplaceDollar(WORD,WORD,WORD *,LONG);
783 extern int    DollarRaiseLow(UBYTE *,LONG);
784 extern int    AddVector(UBYTE *,int,int);
785 extern int    AddDubious(UBYTE *);
786 extern int    AddIndex(UBYTE *,int,int);
787 extern UBYTE *DoDimension(UBYTE *,int *,int *);
788 extern int    AddFunction(UBYTE *,int,int,int,int,int,int,int);
789 extern int    CoCommuteInSet(UBYTE *);
790 extern int    CoFunction(UBYTE *,int,int);
791 extern int    TestName(UBYTE *);
792 extern int    AddSet(UBYTE *,WORD);
793 extern int    DoElements(UBYTE *,SETS,UBYTE *);
794 extern int    DoTempSet(UBYTE *,UBYTE *);
795 extern int    NameConflict(int,UBYTE *);
796 extern int    OpenFile(char *);
797 extern int    OpenAddFile(char *);
798 extern int    ReOpenFile(char *);
799 extern int    CreateFile(char *);
800 extern int    CreateLogFile(char *);
801 extern VOID   CloseFile(int);
802 extern int    CopyFile(char *, char *);
803 extern int    CreateHandle(VOID);
804 extern LONG   ReadFile(int,UBYTE *,LONG);
805 extern LONG   ReadPosFile(PHEAD FILEHANDLE *,UBYTE *,LONG,POSITION *);
806 extern LONG   WriteFileToFile(int,UBYTE *,LONG);
807 extern VOID   SeekFile(int,POSITION *,int);
808 extern LONG   TellFile(int);
809 extern void   FlushFile(int);
810 extern int    GetPosFile(int,fpos_t *);
811 extern int    SetPosFile(int,fpos_t *);
812 extern VOID   SynchFile(int);
813 extern VOID   TruncateFile(int);
814 extern int    GetChannel(char *,int);
815 extern int    GetAppendChannel(char *);
816 extern int    CloseChannel(char *);
817 extern VOID   inictable(VOID);
818 extern KEYWORD *findcommand(UBYTE *);
819 extern int    inicbufs(VOID);
820 extern VOID   StartFiles(VOID);
821 extern UBYTE *MakeDate(VOID);
822 extern VOID   PreProcessor(VOID);
823 extern VOID  *FromList(LIST *);
824 extern VOID  *From0List(LIST *);
825 extern VOID  *FromVarList(LIST *);
826 extern int    DoubleList(VOID ***,int *,int,char *);
827 extern int    DoubleLList(VOID ***,LONG *,int,char *);
828 extern void   DoubleBuffer(void **,void **,int,char *);
829 extern void   ExpandBuffer(void **,LONG *,int);
830 extern LONG   iexp(LONG,int);
831 extern int    IsLikeVector(WORD *);
832 extern int    AreArgsEqual(WORD *,WORD *);
833 extern int    CompareArgs(WORD *,WORD *);
834 extern UBYTE *SkipField(UBYTE *,int);
835 extern int    StrCmp(UBYTE *,UBYTE *);
836 extern int    StrICmp(UBYTE *,UBYTE *);
837 extern int    StrHICmp(UBYTE *,UBYTE *);
838 extern int    StrICont(UBYTE *,UBYTE *);
839 extern int    CmpArray(WORD *,WORD *,WORD);
840 extern int    ConWord(UBYTE *,UBYTE *);
841 extern int    StrLen(UBYTE *);
842 extern UBYTE *GetPreVar(UBYTE *,int);
843 extern void   ToGeneral(WORD *,WORD *,WORD);
844 extern WORD   ToPolyFunGeneral(PHEAD WORD *);
845 extern int    ToFast(WORD *,WORD *);
846 extern SETUPPARAMETERS *GetSetupPar(UBYTE *);
847 extern int    RecalcSetups(VOID);
848 extern int    AllocSetups(VOID);
849 extern SORTING *AllocSort(LONG,LONG,LONG,LONG,int,int,LONG);
850 extern VOID   AllocSortFileName(SORTING *);
851 extern UBYTE *LoadInputFile(UBYTE *,int);
852 extern UBYTE  GetInput(VOID);
853 extern VOID   ClearPushback(VOID);
854 extern UBYTE  GetChar(int);
855 extern VOID   CharOut(UBYTE);
856 extern VOID   UnsetAllowDelay(VOID);
857 extern VOID   PopPreVars(int);
858 extern VOID   IniModule(int);
859 extern VOID   IniSpecialModule(int);
860 extern int    ModuleInstruction(int *,int *);
861 extern int    PreProInstruction(VOID);
862 extern int    LoadInstruction(int);
863 extern int    LoadStatement(int);
864 extern KEYWORD *FindKeyWord(UBYTE *,KEYWORD *,int);
865 extern KEYWORD *FindInKeyWord(UBYTE *,KEYWORD *,int);
866 extern int    DoDefine(UBYTE *);
867 extern int    DoRedefine(UBYTE *);
868 extern int    TheDefine(UBYTE *,int);
869 extern int    TheUndefine(UBYTE *);
870 extern int    ClearMacro(UBYTE *);
871 extern int    DoUndefine(UBYTE *);
872 extern int    DoInclude(UBYTE *);
873 extern int    DoReverseInclude(UBYTE *);
874 extern int    Include(UBYTE *,int);
875 /*[14apr2004 mt]:*/
876 extern int    DoExternal(UBYTE *);
877 extern int    DoToExternal(UBYTE *);
878 extern int    DoFromExternal(UBYTE *);
879 extern int    DoPrompt(UBYTE *);
880 extern int    DoSetExternal(UBYTE *);
881 /*[10may2006 mt]:*/
882 extern int    DoSetExternalAttr(UBYTE *);
883 /*:[10may2006 mt]*/
884 extern int    DoRmExternal(UBYTE *);
885 /*:[14apr2004 mt]*/
886 extern int    DoFactDollar(UBYTE *);
887 extern WORD   GetDollarNumber(UBYTE **,DOLLARS);
888 extern int    DoSetRandom(UBYTE *);
889 extern int    DoOptimize(UBYTE *);
890 extern int    DoClearOptimize(UBYTE *);
891 extern int    DoSkipExtraSymbols(UBYTE *);
892 extern int    DoTimeOutAfter(UBYTE *);
893 extern int    DoMessage(UBYTE *);
894 extern int    DoPreOut(UBYTE *);
895 extern int    DoPreAppend(UBYTE *);
896 extern int    DoPreCreate(UBYTE *);
897 extern int    DoPreAssign(UBYTE *);
898 extern int    DoPreBreak(UBYTE *);
899 extern int    DoPreDefault(UBYTE *);
900 extern int    DoPreSwitch(UBYTE *);
901 extern int    DoPreEndSwitch(UBYTE *);
902 extern int    DoPreCase(UBYTE *);
903 extern int    DoPreShow(UBYTE *);
904 extern int    DoPreExchange(UBYTE *);
905 extern int    DoSystem(UBYTE *);
906 extern int    DoPipe(UBYTE *);
907 extern VOID   StartPrepro(VOID);
908 extern int    DoIfdef(UBYTE *,int);
909 extern int    DoIfydef(UBYTE *);
910 extern int    DoIfndef(UBYTE *);
911 extern int    DoElse(UBYTE *);
912 extern int    DoElseif(UBYTE *);
913 extern int    DoEndif(UBYTE *);
914 extern int    DoTerminate(UBYTE *);
915 extern int    DoIf(UBYTE *);
916 extern int    DoCall(UBYTE *);
917 extern int    DoDebug(UBYTE *);
918 extern int    DoDo(UBYTE *);
919 extern int    DoBreakDo(UBYTE *);
920 extern int    DoEnddo(UBYTE *);
921 extern int    DoEndprocedure(UBYTE *);
922 extern int    DoInside(UBYTE *);
923 extern int    DoEndInside(UBYTE *);
924 extern int    DoProcedure(UBYTE *);
925 extern int    DoPrePrintTimes(UBYTE *);
926 extern int    DoPreWrite(UBYTE *);
927 extern int    DoPreClose(UBYTE *);
928 extern int    DoPreRemove(UBYTE *);
929 extern int    DoCommentChar(UBYTE *);
930 extern int    DoPrcExtension(UBYTE *);
931 extern int    DoPreReset(UBYTE *);
932 extern VOID   WriteString(int,UBYTE *,int);
933 extern VOID   WriteUnfinString(int,UBYTE *,int);
934 extern UBYTE *AddToString(UBYTE *,UBYTE *,int);
935 extern UBYTE *PreCalc(VOID);
936 extern UBYTE *PreEval(UBYTE *,LONG *);
937 extern VOID   NumToStr(UBYTE *,LONG);
938 extern int    PreCmp(int,int,UBYTE *,int,int,UBYTE *,int);
939 extern int    PreEq(int,int,UBYTE *,int,int,UBYTE *,int);
940 extern UBYTE *pParseObject(UBYTE *,int *,LONG *);
941 extern UBYTE *PreIfEval(UBYTE *,int *);
942 extern int    EvalPreIf(UBYTE *);
943 extern int    PreLoad(PRELOAD *,UBYTE *,UBYTE *,int,char *);
944 extern int    PreSkip(UBYTE *,UBYTE *,int);
945 extern UBYTE *EndOfToken(UBYTE *);
946 extern VOID   SetSpecialMode(int,int);
947 extern VOID   MakeGlobal(VOID);
948 extern int    ExecModule(int);
949 extern int    ExecStore(VOID);
950 extern VOID   FullCleanUp(VOID);
951 extern int    DoExecStatement(VOID);
952 extern int    DoPipeStatement(VOID);
953 extern int    DoPolyfun(UBYTE *);
954 extern int    DoPolyratfun(UBYTE *);
955 extern int    CompileStatement(UBYTE *);
956 extern UBYTE *ToToken(UBYTE *);
957 extern int    GetDollar(UBYTE *);
958 extern int    MesWork(VOID);
959 extern int    MesPrint(const char *,...);
960 extern int    MesCall(char *);
961 extern UBYTE *NumCopy(WORD,UBYTE *);
962 extern char  *LongCopy(LONG,char *);
963 extern char  *LongLongCopy(off_t *,char *);
964 extern VOID   ReserveTempFiles(int);
965 extern VOID   PrintTerm(WORD *,char *);
966 extern VOID   PrintTermC(WORD *,char *);
967 extern VOID   PrintSubTerm(WORD *,char *);
968 extern VOID   PrintWords(WORD *,LONG);
969 extern void   PrintSeq(WORD *,char *);
970 extern int    ExpandTripleDots(int);
971 extern LONG   ComPress(WORD **,LONG *);
972 extern VOID   StageSort(FILEHANDLE *);
973 
974 #define M_alloc(x)      malloc((size_t)(x))
975 
976 extern void   M_free(VOID *,const char *);
977 extern void   ClearWildcardNames(VOID);
978 extern int    AddWildcardName(UBYTE *);
979 extern int    GetWildcardName(UBYTE *);
980 extern void   Globalize(int);
981 extern void   ResetVariables(int);
982 extern void   AddToPreTypes(int);
983 extern void   MessPreNesting(int);
984 extern LONG   GetStreamPosition(STREAM *);
985 extern WORD  *DoubleCbuffer(int,WORD *,int);
986 extern WORD  *AddLHS(int);
987 extern WORD  *AddRHS(int,int);
988 extern int    AddNtoL(int,WORD *);
989 extern int    AddNtoC(int,int,WORD *,int);
990 extern VOID   DoubleIfBuffers(VOID);
991 extern STREAM *CreateStream(UBYTE *);
992 
993 extern int    setonoff(UBYTE *,int *,int,int);
994 extern int    DoPrint(UBYTE *,int);
995 extern int    SetExpr(UBYTE *,int,int);
996 extern void   AddToCom(int,WORD *);
997 extern int    Add2ComStrings(int,WORD *,UBYTE *,UBYTE *);
998 extern int    DoSymmetrize(UBYTE *,int);
999 extern int    DoArgument(UBYTE *,int);
1000 extern int    ArgFactorize(PHEAD WORD *,WORD *);
1001 extern WORD  *TakeArgContent(PHEAD WORD *, WORD *);
1002 extern WORD  *MakeInteger(PHEAD WORD *,WORD *,WORD *);
1003 extern WORD  *MakeMod(PHEAD WORD *,WORD *,WORD *);
1004 extern WORD   FindArg(PHEAD WORD *);
1005 extern WORD   InsertArg(PHEAD WORD *,WORD *,int);
1006 extern int    CleanupArgCache(PHEAD WORD);
1007 extern int    ArgSymbolMerge(WORD *, WORD *);
1008 extern int    ArgDotproductMerge(WORD *, WORD *);
1009 extern void   SortWeights(LONG *,LONG *,WORD);
1010 extern int    DoBrackets(UBYTE *,int);
1011 extern int    DoPutInside(UBYTE *,int);
1012 extern WORD  *CountComp(UBYTE *,WORD *);
1013 extern int    CoAntiBracket(UBYTE *);
1014 extern int    CoAntiSymmetrize(UBYTE *);
1015 extern int    DoArgPlode(UBYTE *,int);
1016 extern int    CoArgExplode(UBYTE *);
1017 extern int    CoArgImplode(UBYTE *);
1018 extern int    CoArgument(UBYTE *);
1019 extern int    CoInside(UBYTE *);
1020 extern int    ExecInside(UBYTE *);
1021 extern int    CoInExpression(UBYTE *);
1022 extern int    CoInParallel(UBYTE *);
1023 extern int    CoNotInParallel(UBYTE *);
1024 extern int    DoInParallel(UBYTE *,int);
1025 extern int    CoEndInExpression(UBYTE *);
1026 extern int    CoBracket(UBYTE *);
1027 extern int    CoPutInside(UBYTE *);
1028 extern int    CoAntiPutInside(UBYTE *);
1029 extern int    CoMultiBracket(UBYTE *);
1030 extern int    CoCFunction(UBYTE *);
1031 extern int    CoCTensor(UBYTE *);
1032 extern int    CoCollect(UBYTE *);
1033 extern int    CoCompress(UBYTE *);
1034 extern int    CoContract(UBYTE *);
1035 extern int    CoCycleSymmetrize(UBYTE *);
1036 extern int    CoDelete(UBYTE *);
1037 extern int    CoTableBase(UBYTE *);
1038 extern int    CoApply(UBYTE *);
1039 extern int    CoDenominators(UBYTE *);
1040 extern int    CoDimension(UBYTE *);
1041 extern int    CoDiscard(UBYTE *);
1042 extern int    CoDisorder(UBYTE *);
1043 extern int    CoDrop(UBYTE *);
1044 extern int    CoDropCoefficient(UBYTE *);
1045 extern int    CoDropSymbols(UBYTE *);
1046 extern int    CoElse(UBYTE *);
1047 extern int    CoElseIf(UBYTE *);
1048 extern int    CoEndArgument(UBYTE *);
1049 extern int    CoEndInside(UBYTE *);
1050 extern int    CoEndIf(UBYTE *);
1051 extern int    CoEndRepeat(UBYTE *);
1052 extern int    CoEndTerm(UBYTE *);
1053 extern int    CoEndWhile(UBYTE *);
1054 extern int    CoExit(UBYTE *);
1055 extern int    CoFactArg(UBYTE *);
1056 extern int    CoFactDollar(UBYTE *);
1057 extern int    CoFactorize(UBYTE *);
1058 extern int    CoNFactorize(UBYTE *);
1059 extern int    CoUnFactorize(UBYTE *);
1060 extern int    CoNUnFactorize(UBYTE *);
1061 extern int    DoFactorize(UBYTE *,int);
1062 extern int    CoFill(UBYTE *);
1063 extern int    CoFillExpression(UBYTE *);
1064 extern int    CoFixIndex(UBYTE *);
1065 extern int    CoFormat(UBYTE *);
1066 extern int    CoGlobal(UBYTE *);
1067 extern int    CoGlobalFactorized(UBYTE *);
1068 extern int    CoGoTo(UBYTE *);
1069 extern int    CoId(UBYTE *);
1070 extern int    CoIdNew(UBYTE *);
1071 extern int    CoIdOld(UBYTE *);
1072 extern int    CoIf(UBYTE *);
1073 extern int    CoIfMatch(UBYTE *);
1074 extern int    CoIfNoMatch(UBYTE *);
1075 extern int    CoIndex(UBYTE *);
1076 extern int    CoInsideFirst(UBYTE *);
1077 extern int    CoKeep(UBYTE *);
1078 extern int    CoLabel(UBYTE *);
1079 extern int    CoLoad(UBYTE *);
1080 extern int    CoLocal(UBYTE *);
1081 extern int    CoLocalFactorized(UBYTE *);
1082 extern int    CoMany(UBYTE *);
1083 extern int    CoMerge(UBYTE *);
1084 extern int    CoStuffle(UBYTE *);
1085 extern int    CoMetric(UBYTE *);
1086 extern int    CoModOption(UBYTE *);
1087 extern int    CoModuleOption(UBYTE *);
1088 extern int    CoModulus(UBYTE *);
1089 extern int    CoMulti(UBYTE *);
1090 extern int    CoMultiply(UBYTE *);
1091 extern int    CoNFunction(UBYTE *);
1092 extern int    CoNPrint(UBYTE *);
1093 extern int    CoNTensor(UBYTE *);
1094 extern int    CoNWrite(UBYTE *);
1095 extern int    CoNoDrop(UBYTE *);
1096 extern int    CoNoSkip(UBYTE *);
1097 extern int    CoNormalize(UBYTE *);
1098 extern int    CoMakeInteger(UBYTE *);
1099 extern int    CoFlags(UBYTE *,int);
1100 extern int    CoOff(UBYTE *);
1101 extern int    CoOn(UBYTE *);
1102 extern int    CoOnce(UBYTE *);
1103 extern int    CoOnly(UBYTE *);
1104 extern int    CoOptimizeOption(UBYTE *);
1105 extern int    CoOptimize(UBYTE *);
1106 extern int    CoPolyFun(UBYTE *);
1107 extern int    CoPolyRatFun(UBYTE *);
1108 extern int    CoPrint(UBYTE *);
1109 extern int    CoPrintB(UBYTE *);
1110 extern int    CoProperCount(UBYTE *);
1111 extern int    CoUnitTrace(UBYTE *);
1112 extern int    CoRCycleSymmetrize(UBYTE *);
1113 extern int    CoRatio(UBYTE *);
1114 extern int    CoRedefine(UBYTE *);
1115 extern int    CoRenumber(UBYTE *);
1116 extern int    CoRepeat(UBYTE *);
1117 extern int    CoSave(UBYTE *);
1118 extern int    CoSelect(UBYTE *);
1119 extern int    CoSet(UBYTE *);
1120 extern int    CoSetExitFlag(UBYTE *);
1121 extern int    CoSkip(UBYTE *);
1122 extern int    CoProcessBucket(UBYTE *);
1123 extern int    CoPushHide(UBYTE *);
1124 extern int    CoPopHide(UBYTE *);
1125 extern int    CoHide(UBYTE *);
1126 extern int    CoIntoHide(UBYTE *);
1127 extern int    CoNoHide(UBYTE *);
1128 extern int    CoUnHide(UBYTE *);
1129 extern int    CoNoUnHide(UBYTE *);
1130 extern int    CoSort(UBYTE *);
1131 extern int    CoSplitArg(UBYTE *);
1132 extern int    CoSplitFirstArg(UBYTE *);
1133 extern int    CoSplitLastArg(UBYTE *);
1134 extern int    CoSum(UBYTE *);
1135 extern int    CoSymbol(UBYTE *);
1136 extern int    CoSymmetrize(UBYTE *);
1137 extern int    DoTable(UBYTE *,int);
1138 extern int    CoTable(UBYTE *);
1139 extern int    CoTerm(UBYTE *);
1140 extern int    CoNTable(UBYTE *);
1141 extern int    CoCTable(UBYTE *);
1142 extern void   EmptyTable(TABLES);
1143 extern int    CoToTensor(UBYTE *);
1144 extern int    CoToVector(UBYTE *);
1145 extern int    CoTrace4(UBYTE *);
1146 extern int    CoTraceN(UBYTE *);
1147 extern int    CoChisholm(UBYTE *);
1148 extern int    CoTransform(UBYTE *);
1149 extern int    CoClearTable(UBYTE *);
1150 extern int    DoChain(UBYTE *,int);
1151 extern int    CoChainin(UBYTE *);
1152 extern int    CoChainout(UBYTE *);
1153 extern int    CoTryReplace(UBYTE *);
1154 extern int    CoVector(UBYTE *);
1155 extern int    CoWhile(UBYTE *);
1156 extern int    CoWrite(UBYTE *);
1157 extern int    CoAuto(UBYTE *);
1158 extern int    CoSwitch(UBYTE *);
1159 extern int    CoCase(UBYTE *);
1160 extern int    CoBreak(UBYTE *);
1161 extern int    CoDefault(UBYTE *);
1162 extern int    CoEndSwitch(UBYTE *);
1163 extern int    CoTBaddto(UBYTE *);
1164 extern int    CoTBaudit(UBYTE *);
1165 extern int    CoTBcleanup(UBYTE *);
1166 extern int    CoTBcreate(UBYTE *);
1167 extern int    CoTBenter(UBYTE *);
1168 extern int    CoTBhelp(UBYTE *);
1169 extern int    CoTBload(UBYTE *);
1170 extern int    CoTBoff(UBYTE *);
1171 extern int    CoTBon(UBYTE *);
1172 extern int    CoTBopen(UBYTE *);
1173 extern int    CoTBreplace(UBYTE *);
1174 extern int    CoTBuse(UBYTE *);
1175 extern int    CoTestUse(UBYTE *);
1176 extern int    CoThreadBucket(UBYTE *);
1177 extern int    AddComString(int,WORD *,UBYTE *,int);
1178 extern int    CompileAlgebra(UBYTE *,int,WORD *);
1179 extern int    IsIdStatement(UBYTE *);
1180 extern UBYTE *IsRHS(UBYTE *,UBYTE);
1181 extern int    ParenthesesTest(UBYTE *);
1182 extern int    tokenize(UBYTE *,WORD);
1183 extern void   WriteTokens(SBYTE *);
1184 extern int    simp1token(SBYTE *);
1185 extern int    simpwtoken(SBYTE *);
1186 extern int    simp2token(SBYTE *);
1187 extern int    simp3atoken(SBYTE *,int);
1188 extern int    simp3btoken(SBYTE *,int);
1189 extern int    simp4token(SBYTE *);
1190 extern int    simp5token(SBYTE *,int);
1191 extern int    simp6token(SBYTE *,int);
1192 extern UBYTE *SkipAName(UBYTE *);
1193 extern int    TestTables(VOID);
1194 extern int    GetLabel(UBYTE *);
1195 extern int    CoIdExpression(UBYTE *,int);
1196 extern int    CoAssign(UBYTE *);
1197 extern int    DoExpr(UBYTE *,int,int);
1198 extern int    CompileSubExpressions(SBYTE *);
1199 extern int    CodeGenerator(SBYTE *);
1200 extern int    CompleteTerm(WORD *,UWORD *,UWORD *,WORD,WORD,int);
1201 extern int    CodeFactors(SBYTE *s);
1202 extern WORD   GenerateFactors(WORD,WORD);
1203 extern int    InsTree(int,int);
1204 extern int    FindTree(int,WORD *);
1205 extern void   RedoTree(CBUF *,int);
1206 extern void   ClearTree(int);
1207 extern int    CatchDollar(int);
1208 extern int    AssignDollar(PHEAD WORD *,WORD);
1209 extern UBYTE *WriteDollarToBuffer(WORD,WORD);
1210 extern UBYTE *WriteDollarFactorToBuffer(WORD,WORD,WORD);
1211 extern void   AddToDollarBuffer(UBYTE *);
1212 extern int    PutTermInDollar(WORD *,WORD);
1213 extern void   TermAssign(WORD *);
1214 extern void   WildDollars(PHEAD WORD *);
1215 extern LONG   numcommute(WORD *,LONG *);
1216 extern int    FullRenumber(PHEAD WORD *,WORD);
1217 extern int    Lus(WORD *,WORD,WORD,WORD,WORD,WORD);
1218 extern int    FindLus(int,int,int);
1219 extern int    CoReplaceLoop(UBYTE *);
1220 extern int    CoFindLoop(UBYTE *);
1221 extern int    DoFindLoop(UBYTE *,int);
1222 extern int    CoFunPowers(UBYTE *);
1223 extern int    SortTheList(int *,int);
1224 extern int    MatchIsPossible(WORD *,WORD *);
1225 extern int    StudyPattern(WORD *);
1226 extern WORD   DolToTensor(PHEAD WORD);
1227 extern WORD   DolToFunction(PHEAD WORD);
1228 extern WORD   DolToVector(PHEAD WORD);
1229 extern WORD   DolToNumber(PHEAD WORD);
1230 extern WORD   DolToSymbol(PHEAD WORD);
1231 extern WORD   DolToIndex(PHEAD WORD);
1232 extern LONG   DolToLong(PHEAD WORD);
1233 extern int    DollarFactorize(PHEAD WORD);
1234 extern int    CoPrintTable(UBYTE *);
1235 extern int    CoDeallocateTable(UBYTE *);
1236 extern void   CleanDollarFactors(DOLLARS);
1237 extern WORD   *TakeDollarContent(PHEAD WORD *,WORD **);
1238 extern WORD   *MakeDollarInteger(PHEAD WORD *,WORD **);
1239 extern WORD   *MakeDollarMod(PHEAD WORD *,WORD **);
1240 extern int    GetDolNum(PHEAD WORD *, WORD *);
1241 extern void   AddPotModdollar(WORD);
1242 
1243 extern int    Optimize(WORD, int);
1244 extern int    ClearOptimize(VOID);
1245 extern int    LoadOpti(WORD);
1246 extern int    PutObject(WORD *,int);
1247 extern void   CleanOptiBuffer(VOID);
1248 extern int    PrintOptima(WORD);
1249 extern int    FindScratchName(VOID);
1250 extern WORD   MaxPowerOpti(LONG);
1251 extern WORD   HuntNumFactor(LONG,WORD *,int);
1252 extern WORD   HuntFactor(LONG,WORD *,int);
1253 extern void   HuntPairs(LONG,WORD);
1254 extern void   HuntBrackets(LONG);
1255 extern int    AddToOpti(WORD *,int);
1256 extern LONG   TestNewSca(LONG,WORD *,WORD *);
1257 extern void   NormOpti(WORD *);
1258 extern void   SortOpti(LONG);
1259 extern void   SplitOpti(WORD **,LONG);
1260 extern void   CombiOpti(VOID);
1261 extern int    TakeLongRoot(UWORD *,WORD *,WORD);
1262 extern int    TakeRatRoot(UWORD *,WORD *,WORD);
1263 extern int    MakeRational(WORD ,WORD , WORD *, WORD *);
1264 extern int    MakeLongRational(PHEAD UWORD *,WORD ,UWORD *,WORD ,UWORD *,WORD *);
1265 extern void   HuntPowers(LONG,WORD);
1266 extern void   HuntNumBrackets(LONG);
1267 extern void   ClearTableTree(TABLES);
1268 extern int    InsTableTree(TABLES,WORD *);
1269 extern void   RedoTableTree(TABLES,int);
1270 extern int    FindTableTree(TABLES,WORD *,int);
1271 extern void   finishcbuf(WORD);
1272 extern void   clearcbuf(WORD);
1273 extern void   CleanUpSort(int);
1274 extern FILEHANDLE *AllocFileHandle(WORD,char *);
1275 extern VOID   DeAllocFileHandle(FILEHANDLE *);
1276 extern VOID   LowerSortLevel(VOID);
1277 extern WORD  *PolyRatFunSpecial(PHEAD WORD *, WORD *);
1278 extern VOID   SimpleSplitMergeRec(WORD *,WORD,WORD *);
1279 extern VOID   SimpleSplitMerge(WORD *,WORD);
1280 extern WORD   BinarySearch(WORD *,WORD,WORD);
1281 extern int    InsideDollar(PHEAD WORD *,WORD);
1282 extern DOLLARS DolToTerms(PHEAD WORD);
1283 extern WORD   EvalDoLoopArg(PHEAD WORD *,WORD);
1284 extern int    SetExprCases(int,int,int);
1285 extern int    TestSelect(WORD *,WORD *);
1286 extern VOID   SubsInAll(PHEAD0);
1287 extern VOID   TransferBuffer(int,int,int);
1288 extern int    TakeIDfunction(PHEAD WORD *);
1289 extern int    MakeSetupAllocs(VOID);
1290 extern int    TryFileSetups(VOID);
1291 extern void   ExchangeExpressions(int,int);
1292 extern void   ExchangeDollars(int,int);
1293 extern int    GetFirstBracket(WORD *,int);
1294 extern int    GetFirstTerm(WORD *,int);
1295 extern int    GetContent(WORD *,int);
1296 extern int    CleanupTerm(WORD *);
1297 extern WORD   ContentMerge(PHEAD WORD *,WORD *);
1298 extern UBYTE *PreIfDollarEval(UBYTE *,int *);
1299 extern LONG   TermsInDollar(WORD);
1300 extern LONG   SizeOfDollar(WORD);
1301 extern LONG   TermsInExpression(WORD);
1302 extern LONG   SizeOfExpression(WORD);
1303 extern WORD   *TranslateExpression(UBYTE *);
1304 extern int    IsSetMember(WORD *,WORD);
1305 extern int    IsMultipleOf(WORD *,WORD *);
1306 extern int    TwoExprCompare(WORD *,WORD *,int);
1307 extern void   UpdatePositions(VOID);
1308 extern void   M_check(VOID);
1309 extern void   M_print(VOID);
1310 extern void   M_check1(VOID);
1311 extern void   PrintTime(UBYTE *);
1312 
1313 extern POSITION *FindBracket(WORD,WORD *);
1314 extern VOID   PutBracketInIndex(PHEAD WORD *,POSITION *);
1315 extern void   ClearBracketIndex(WORD);
1316 extern VOID   OpenBracketIndex(WORD);
1317 extern int    DoNoParallel(UBYTE *);
1318 extern int    DoParallel(UBYTE *);
1319 extern int    DoModSum(UBYTE *);
1320 extern int    DoModMax(UBYTE *);
1321 extern int    DoModMin(UBYTE *);
1322 extern int    DoModLocal(UBYTE *);
1323 extern UBYTE *DoModDollar(UBYTE *,int);
1324 extern int    DoProcessBucket(UBYTE *);
1325 extern int    DoinParallel(UBYTE *);
1326 extern int    DonotinParallel(UBYTE *);
1327 
1328 extern int    FlipTable(FUNCTIONS,int);
1329 extern int    ChainIn(PHEAD WORD *,WORD);
1330 extern int    ChainOut(PHEAD WORD *,WORD);
1331 extern int    ArgumentImplode(PHEAD WORD *,WORD *);
1332 extern int    ArgumentExplode(PHEAD WORD *,WORD *);
1333 extern int    DenToFunction(WORD *,WORD);
1334 
1335 extern WORD   HowMany(PHEAD WORD *,WORD *);
1336 extern VOID   RemoveDollars(VOID);
1337 extern LONG   CountTerms1(PHEAD0);
1338 extern LONG   TermsInBracket(PHEAD WORD *,WORD);
1339 extern int    Crash(VOID);
1340 
1341 extern char  *str_dup(char *);
1342 extern void   convertblock(INDEXBLOCK *,INDEXBLOCK *,int);
1343 extern void   convertnamesblock(NAMESBLOCK *,NAMESBLOCK *,int);
1344 extern void   convertiniinfo(INIINFO *,INIINFO *,int);
1345 extern int    ReadIndex(DBASE *);
1346 extern int    WriteIndexBlock(DBASE *,MLONG);
1347 extern int    WriteNamesBlock(DBASE *,MLONG);
1348 extern int    WriteIndex(DBASE *);
1349 extern int    WriteIniInfo(DBASE *);
1350 extern int    ReadIniInfo(DBASE *);
1351 extern int    AddToIndex(DBASE *,MLONG);
1352 extern DBASE *GetDbase(char *);
1353 extern DBASE *OpenDbase(char *);
1354 extern char  *ReadObject(DBASE *,MLONG,char *);
1355 extern char  *ReadijObject(DBASE *,MLONG,MLONG,char *);
1356 extern int    ExistsObject(DBASE *,MLONG,char *);
1357 extern int    DeleteObject(DBASE *,MLONG,char *);
1358 extern int    WriteObject(DBASE *,MLONG,char *,char *,MLONG);
1359 extern MLONG  AddObject(DBASE *,MLONG,char *,char *);
1360 extern int    Cleanup(DBASE *);
1361 extern DBASE *NewDbase(char *,MLONG);
1362 extern void   FreeTableBase(DBASE *);
1363 extern int    ComposeTableNames(DBASE *);
1364 extern int    PutTableNames(DBASE *);
1365 extern MLONG  AddTableName(DBASE *,char *,TABLES);
1366 extern MLONG  GetTableName(DBASE *,char *);
1367 extern MLONG  FindTableNumber(DBASE *,char *);
1368 extern int    TryEnvironment(VOID);
1369 
1370 #ifdef WITHZLIB
1371 extern int    SetupOutputGZIP(FILEHANDLE *);
1372 extern int    PutOutputGZIP(FILEHANDLE *);
1373 extern int    FlushOutputGZIP(FILEHANDLE *);
1374 extern int    SetupAllInputGZIP(SORTING *);
1375 extern LONG   FillInputGZIP(FILEHANDLE *,POSITION *,UBYTE *,LONG,int);
1376 extern void   ClearSortGZIP(FILEHANDLE *f);
1377 #endif
1378 
1379 #ifdef WITHPTHREADS
1380 extern VOID   BeginIdentities(VOID);
1381 extern int    WhoAmI(VOID);
1382 extern int    StartAllThreads(int);
1383 extern void   StartHandleLock(VOID);
1384 extern VOID   TerminateAllThreads(VOID);
1385 extern int    GetAvailableThread(VOID);
1386 extern int    ConditionalGetAvailableThread(VOID);
1387 extern int    BalanceRunThread(PHEAD int,WORD *,WORD);
1388 extern void   WakeupThread(int,int);
1389 extern int    MasterWait(VOID);
1390 extern int    InParallelProcessor(VOID);
1391 extern int    ThreadsProcessor(EXPRESSIONS,WORD,WORD);
1392 extern int    MasterMerge(VOID);
1393 extern int    PutToMaster(PHEAD WORD *);
1394 extern void   SetWorkerFiles(VOID);
1395 extern int    MakeThreadBuckets(int,int);
1396 extern int    SendOneBucket(int);
1397 extern int    LoadOneThread(int,int,THREADBUCKET *,int);
1398 extern void  *RunSortBot(void *);
1399 extern void   MasterWaitAllSortBots(VOID);
1400 extern int    SortBotMerge(PHEAD0);
1401 extern int    SortBotOut(PHEAD WORD *);
1402 extern void   DefineSortBotTree(VOID);
1403 extern int    SortBotMasterMerge(VOID);
1404 extern int    SortBotWait(int);
1405 extern void   StartIdentity(VOID);
1406 extern void   FinishIdentity(void *);
1407 extern int    SetIdentity(int *);
1408 extern ALLPRIVATES *InitializeOneThread(int);
1409 extern void   FinalizeOneThread(int);
1410 extern void   ClearAllThreads(VOID);
1411 extern void  *RunThread(void *);
1412 extern void   IAmAvailable(int);
1413 extern int    ThreadWait(int);
1414 extern int    ThreadClaimedBlock(int);
1415 extern int    GetThread(int);
1416 extern int    UpdateOneThread(int);
1417 extern void   MasterWaitAll(VOID);
1418 extern void   MasterWaitAllBlocks(VOID);
1419 extern int    MasterWaitThread(int);
1420 extern void   WakeupMasterFromThread(int,int);
1421 extern int    LoadReadjusted(VOID);
1422 extern int    IniSortBlocks(int);
1423 extern int    TreatIndexEntry(PHEAD LONG);
1424 extern WORD   GetTerm2(PHEAD WORD *);
1425 extern void	SetHideFiles(VOID);
1426 
1427 #endif
1428 
1429 extern int    CopyExpression(FILEHANDLE *,FILEHANDLE *);
1430 
1431 extern int    set_in(UBYTE, set_of_char);
1432 extern one_byte set_set(UBYTE, set_of_char);
1433 extern one_byte set_del(UBYTE, set_of_char);
1434 extern one_byte set_sub (set_of_char, set_of_char, set_of_char);
1435 extern int    DoPreAddSeparator(UBYTE *);
1436 extern int    DoPreRmSeparator(UBYTE *);
1437 
1438 /*See the file extcmd.c*/
1439 extern int    openExternalChannel(UBYTE *,int,UBYTE *,UBYTE *);
1440 extern int    initPresetExternalChannels(UBYTE *, int);
1441 extern int    closeExternalChannel(int);
1442 extern int    selectExternalChannel(int);
1443 extern int    getCurrentExternalChannel(VOID);
1444 extern VOID   closeAllExternalChannels(VOID);
1445 
1446 typedef int (*WRITEBUFTOEXTCHANNEL)(char *,size_t);
1447 typedef int (*GETCFROMEXTCHANNEL)(VOID);
1448 typedef int (*SETTERMINATORFOREXTERNALCHANNEL)(char *);
1449 typedef int (*SETKILLMODEFOREXTERNALCHANNEL)(int,int);
1450 typedef LONG (*WRITEFILE)(int,UBYTE *,LONG);
1451 typedef WORD (*GETTERM)(PHEAD WORD *);
1452 
1453 #define CompareTerms ((COMPARE)AR.CompareRoutine)
1454 #define FiniShuffle AN.SHvar.finishuf
1455 #define DoShtuffle ((DO_UFFLE)AN.SHvar.do_uffle)
1456 
1457 extern UBYTE *defineChannel(UBYTE*, HANDLERS*);
1458 extern int    writeToChannel(int,UBYTE *,HANDLERS*);
1459 #ifdef WITHEXTERNALCHANNEL
1460 extern LONG   WriteToExternalChannel(int,UBYTE *,LONG);
1461 #endif
1462 extern int    writeBufToExtChannelOk(char *,size_t);
1463 extern int    getcFromExtChannelOk(VOID);
1464 extern int    setKillModeForExternalChannelOk(int,int);
1465 extern int    setTerminatorForExternalChannelOk(char *);
1466 extern int    getcFromExtChannelFailure(VOID);
1467 extern int    setKillModeForExternalChannelFailure(int,int);
1468 extern int    setTerminatorForExternalChannelFailure(char *);
1469 extern int    writeBufToExtChannelFailure(char *,size_t);
1470 
1471 extern int    ReleaseTB(VOID);
1472 
1473 extern int    SymbolNormalize(WORD *);
1474 extern int    TestFunFlag(PHEAD WORD *);
1475 extern WORD   CompareSymbols(WORD *,WORD *,WORD);
1476 extern WORD   CompareHSymbols(WORD *,WORD *,WORD);
1477 extern WORD   NextPrime(PHEAD WORD);
1478 extern UWORD  wranf(PHEAD0);
1479 extern UWORD  iranf(PHEAD UWORD);
1480 extern void   iniwranf(PHEAD0);
1481 extern UBYTE *PreRandom(UBYTE *);
1482 
1483 extern WORD *PolyNormPoly (PHEAD WORD);
1484 extern WORD  *EvaluateGcd(PHEAD WORD *);
1485 extern int TreatPolyRatFun(PHEAD WORD *);
1486 
1487 extern WORD   ReadSaveHeader(VOID);
1488 extern WORD   ReadSaveIndex(FILEINDEX *);
1489 extern WORD   ReadSaveExpression(UBYTE *,UBYTE *,LONG *,LONG *);
1490 extern UBYTE *ReadSaveTerm32(UBYTE *,UBYTE *,UBYTE **,UBYTE *,UBYTE *,int);
1491 extern WORD   ReadSaveVariables(UBYTE *,UBYTE *,LONG *,LONG *,INDEXENTRY *,LONG *);
1492 extern WORD   WriteStoreHeader(WORD);
1493 
1494 extern void   InitRecovery(VOID);
1495 extern int    CheckRecoveryFile(VOID);
1496 extern void   DeleteRecoveryFile(VOID);
1497 extern char  *RecoveryFilename(VOID);
1498 extern int    DoRecovery(int *);
1499 extern void   DoCheckpoint(int);
1500 
1501 extern VOID NumberMallocAddMemory(PHEAD0);
1502 extern VOID CacheNumberMallocAddMemory(PHEAD0);
1503 extern VOID TermMallocAddMemory(PHEAD0);
1504 #ifndef MEMORYMACROS
1505 extern WORD *TermMalloc2(PHEAD char *text);
1506 extern VOID TermFree2(PHEAD WORD *term,char *text);
1507 extern UWORD *NumberMalloc2(PHEAD char *text);
1508 extern UWORD *CacheNumberMalloc2(PHEAD char *text);
1509 extern VOID NumberFree2(PHEAD UWORD *NumberMem,char *text);
1510 extern VOID CacheNumberFree2(PHEAD UWORD *NumberMem,char *text);
1511 #endif
1512 
1513 extern void ExprStatus(EXPRESSIONS);
1514 extern VOID iniTools(VOID);
1515 extern int TestTerm(WORD *);
1516 
1517 extern WORD RunTransform(PHEAD WORD *term, WORD *params);
1518 extern WORD RunEncode(PHEAD WORD *fun, WORD *args, WORD *info);
1519 extern WORD RunDecode(PHEAD WORD *fun, WORD *args, WORD *info);
1520 extern WORD RunReplace(PHEAD WORD *fun, WORD *args, WORD *info);
1521 extern WORD RunImplode(WORD *fun, WORD *args);
1522 extern WORD RunExplode(PHEAD WORD *fun, WORD *args);
1523 extern int TestArgNum(int n, int totarg, WORD *args);
1524 extern WORD PutArgInScratch(WORD *arg,UWORD *scrat);
1525 extern UBYTE *ReadRange(UBYTE *s, WORD *out, int par);
1526 extern int  FindRange(PHEAD WORD *,WORD *,WORD *,WORD);
1527 extern WORD RunPermute(PHEAD WORD *fun, WORD *args, WORD *info);
1528 extern WORD RunReverse(PHEAD WORD *fun, WORD *args);
1529 extern WORD RunCycle(PHEAD WORD *fun, WORD *args, WORD *info);
1530 extern WORD RunAddArg(PHEAD WORD *fun, WORD *args);
1531 extern WORD RunMulArg(PHEAD WORD *fun, WORD *args);
1532 extern WORD RunIsLyndon(PHEAD WORD *fun, WORD *args, int par);
1533 extern WORD RunToLyndon(PHEAD WORD *fun, WORD *args, int par);
1534 extern WORD RunDropArg(PHEAD WORD *fun, WORD *args);
1535 extern WORD RunSelectArg(PHEAD WORD *fun, WORD *args);
1536 extern WORD RunDedup(PHEAD WORD *fun, WORD *args);
1537 
1538 extern int NormPolyTerm(PHEAD WORD *);
1539 extern WORD ComparePoly(WORD *, WORD *, WORD);
1540 extern int ConvertToPoly(PHEAD WORD *, WORD *,WORD *,WORD);
1541 extern int LocalConvertToPoly(PHEAD WORD *, WORD *, WORD,WORD);
1542 extern int ConvertFromPoly(PHEAD WORD *, WORD *, WORD, WORD, WORD, WORD);
1543 extern WORD FindSubterm(WORD *);
1544 extern WORD FindLocalSubterm(PHEAD WORD *, WORD);
1545 extern void PrintSubtermList(int,int);
1546 extern void PrintExtraSymbol(int,WORD *,int);
1547 extern WORD FindSubexpression(WORD *);
1548 
1549 extern void UpdateMaxSize(VOID);
1550 
1551 extern int CoToPolynomial(UBYTE *);
1552 extern int CoFromPolynomial(UBYTE *);
1553 extern int CoArgToExtraSymbol(UBYTE *);
1554 extern int CoExtraSymbols(UBYTE *);
1555 extern UBYTE *GetDoParam(UBYTE *, WORD **, int);
1556 extern WORD *GetIfDollarFactor(UBYTE **, WORD *);
1557 extern int CoDo(UBYTE *);
1558 extern int CoEndDo(UBYTE *);
1559 extern int ExtraSymFun(PHEAD WORD *,WORD);
1560 extern int PruneExtraSymbols(WORD);
1561 extern int IniFbuffer(WORD);
1562 extern void IniFbufs(VOID);
1563 extern int GCDfunction(PHEAD WORD *,WORD);
1564 extern WORD *GCDfunction3(PHEAD WORD *,WORD *);
1565 extern WORD *GCDfunction4(PHEAD WORD *,WORD *);
1566 extern int ReadPolyRatFun(PHEAD WORD *);
1567 extern int FromPolyRatFun(PHEAD WORD *, WORD **, WORD **);
1568 extern void PRFnormalize(PHEAD WORD *);
1569 extern WORD *PRFadd(PHEAD WORD *, WORD *);
1570 extern WORD *PolyDiv(PHEAD WORD *,WORD *,char *);
1571 extern WORD *PolyGCD(PHEAD WORD *,WORD *);
1572 extern WORD *PolyAdd(PHEAD WORD *,WORD *);
1573 extern void GCDclean(PHEAD WORD *, WORD *);
1574 extern int RatFunNormalize(PHEAD WORD *);
1575 extern WORD *TakeSymbolContent(PHEAD WORD *,WORD *);
1576 extern int GCDterms(PHEAD WORD *,WORD *,WORD *);
1577 extern WORD *PutExtraSymbols(PHEAD WORD *,WORD,int *);
1578 extern WORD *TakeExtraSymbols(PHEAD WORD *,WORD);
1579 extern WORD *MultiplyWithTerm(PHEAD WORD *, WORD *,WORD);
1580 extern WORD *TakeContent(PHEAD WORD *, WORD *);
1581 extern int MergeSymbolLists(PHEAD WORD *, WORD *, int);
1582 extern int MergeDotproductLists(PHEAD WORD *, WORD *, int);
1583 extern WORD *CreateExpression(PHEAD WORD);
1584 extern int DIVfunction(PHEAD WORD *,WORD,int);
1585 extern WORD *MULfunc(PHEAD WORD *, WORD *);
1586 extern WORD *ConvertArgument(PHEAD WORD *,int *);
1587 extern int ExpandRat(PHEAD WORD *);
1588 extern int InvPoly(PHEAD WORD *,WORD,WORD);
1589 extern WORD TestDoLoop(PHEAD WORD *,WORD);
1590 extern WORD TestEndDoLoop(PHEAD WORD *,WORD);
1591 
1592 extern WORD  *poly_gcd(PHEAD WORD *, WORD *, WORD);
1593 extern WORD  *poly_div(PHEAD WORD *, WORD *, WORD);
1594 extern WORD  *poly_rem(PHEAD WORD *, WORD *, WORD);
1595 extern WORD  *poly_inverse(PHEAD WORD *, WORD *);
1596 extern WORD  *poly_mul(PHEAD WORD *, WORD *);
1597 extern WORD *poly_ratfun_add(PHEAD WORD *, WORD *);
1598 extern int   poly_ratfun_normalize(PHEAD WORD *);
1599 extern int   poly_factorize_argument(PHEAD WORD *, WORD *);
1600 extern WORD *poly_factorize_dollar(PHEAD WORD *);
1601 extern int   poly_factorize_expression(EXPRESSIONS);
1602 extern int   poly_unfactorize_expression(EXPRESSIONS);
1603 extern void  poly_free_poly_vars(PHEAD const char *);
1604 
1605 extern VOID optimize_print_code (int);
1606 
1607 #ifdef WITHPTHREADS
1608 extern void find_Horner_MCTS_expand_tree();
1609 extern void find_Horner_MCTS_expand_tree_threaded();
1610 extern void optimize_expression_given_Horner();
1611 extern void optimize_expression_given_Horner_threaded();
1612 #endif
1613 
1614 extern int DoPreAdd(UBYTE *s);
1615 extern int DoPreUseDictionary(UBYTE *s);
1616 extern int DoPreCloseDictionary(UBYTE *s);
1617 extern int DoPreOpenDictionary(UBYTE *s);
1618 extern void RemoveDictionary(DICTIONARY *dict);
1619 extern void UnSetDictionary(VOID);
1620 extern int SetDictionaryOptions(UBYTE *options);
1621 extern int SelectDictionary(UBYTE *name,UBYTE *options);
1622 extern int AddToDictionary(DICTIONARY *dict,UBYTE *left,UBYTE *right);
1623 extern int AddDictionary(UBYTE *name);
1624 extern int FindDictionary(UBYTE *name);
1625 extern int IsExponentSign(VOID);
1626 extern int IsMultiplySign(VOID);
1627 extern VOID TransformRational(UWORD *a, WORD na);
1628 extern void WriteDictionary(DICTIONARY *);
1629 extern void ShrinkDictionary(DICTIONARY *);
1630 extern void MultiplyToLine(VOID);
1631 extern UBYTE *FindSymbol(WORD num);
1632 extern UBYTE *FindVector(WORD num);
1633 extern UBYTE *FindIndex(WORD num);
1634 extern UBYTE *FindFunction(WORD num);
1635 extern UBYTE *FindFunWithArgs(WORD *t);
1636 extern UBYTE *FindExtraSymbol(WORD num);
1637 extern LONG DictToBytes(DICTIONARY *dict,UBYTE *buf);
1638 extern DICTIONARY *DictFromBytes(UBYTE *buf);
1639 extern int CoCreateSpectator(UBYTE *inp);
1640 extern int CoToSpectator(UBYTE *inp);
1641 extern int CoRemoveSpectator(UBYTE *inp);
1642 extern int CoEmptySpectator(UBYTE *inp);
1643 extern int CoCopySpectator(UBYTE *inp);
1644 extern int PutInSpectator(WORD *,WORD);
1645 extern void ClearSpectators(WORD);
1646 extern WORD GetFromSpectator(WORD *,WORD);
1647 extern void FlushSpectators(VOID);
1648 
1649 extern WORD *PreGCD(PHEAD WORD *, WORD *,int);
1650 extern WORD *FindCommonVariables(PHEAD int,int);
1651 extern VOID AddToSymbolList(PHEAD WORD);
1652 extern int AddToListPoly(PHEAD0);
1653 extern int InvPoly(PHEAD WORD *,WORD,WORD);
1654 
1655 extern int ReadFromScratch(FILEHANDLE *,POSITION *,UBYTE *,POSITION *);
1656 extern int AddToScratch(FILEHANDLE *,POSITION *,UBYTE *,POSITION *,int);
1657 
1658 extern int DoPreAppendPath(UBYTE *);
1659 extern int DoPrePrependPath(UBYTE *);
1660 
1661 extern int DoSwitch(PHEAD WORD *, WORD *);
1662 extern int DoEndSwitch(PHEAD WORD *, WORD *);
1663 extern SWITCHTABLE *FindCase(WORD, WORD);
1664 extern VOID SwitchSplitMergeRec(SWITCHTABLE *, WORD, SWITCHTABLE *);
1665 extern VOID SwitchSplitMerge(SWITCHTABLE *, WORD);
1666 extern int DoubleSwitchBuffers(VOID);
1667 
1668 
1669 /*
1670   	#] Declarations :
1671 */
1672 #endif
1673