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