-
Notifications
You must be signed in to change notification settings - Fork 1
/
IFATL.c
63 lines (54 loc) · 1.34 KB
/
IFATL.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*===========================================================================
B <- IFATL(A,m,s)
Integer from array to list.
Inputs
m : a positive beta integer.
A : An array of length m containing an integer A'.
s : +1 or -1.
Output
B : The integer s * A' in list representation.
===========================================================================*/
#include "saclib.h"
Word IFATL(A,m,s)
Word *A,m,s;
{
Word k,n;
Word B,Bp;
Step1: /* Skip leading zeros. Determine length of A'*/
for (n = m - 1; n >= 0; n--)
if (A[n] != 0)
goto Step3;
Step2: /* A' = 0. */
B = 0;
goto Return;
Step3: /* A' BETA-digit. */
if (n == 0) {
if (s < 0)
B = -A[0];
else
B = A[0];
goto Return; }
Step4: /* Copy digits to initial segment of AVAIL. */
if (AVAIL == NIL)
GC();
B = AVAIL;
if (s < 0) {
for (k = 0; k <= n; k++) {
if (AVAIL == NIL) {
GC();
SRED(Bp,AVAIL); }
SFIRST(AVAIL,-A[k]);
Bp = AVAIL;
AVAIL = RED(AVAIL); } }
else {
for (k = 0; k <= n; k++) {
if (AVAIL == NIL) {
GC();
SRED(Bp,AVAIL); }
SFIRST(AVAIL,A[k]);
Bp = AVAIL;
AVAIL = RED(AVAIL); } }
SRED(Bp,NIL);
Return: /* Prepare for return. */
return(B);
}