0
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
1 /* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
2 /* License in license.txt. */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
3 /* */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
4 /* Verbs: s: */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
5 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
6 #include "j.h" |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
7 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
8 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
9 /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
10 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
11 #define BLACK 0 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
12 #define RED 1 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
13 #define ROOT (jt->sbroot) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
14 #define FILLFACTOR (jt->sbfillfactor) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
15 #define GAP (jt->sbgap) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
16 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
17 static const SBU sentinel = {0,0,0,BLACK,0,0,0,IMIN,0,0}; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
18 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
19 /* #define TMP */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
20 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
21 #include <time.h> |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
22 static int tmp_lr=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
23 static int tmp_rr=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
24 static int tmp_lt=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
25 static int tmp_while=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
26 static int tmp_node=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
27 static int tmp_reorder=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
28 static int tmp_moves=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
29 static int tmp_imax=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
30 static int tmp_rhit=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
31 static int tmp_lhit=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
32 static clock_t clo; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
33 static D tickk=1.0/CLOCKS_PER_SEC; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
34 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
35 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
36 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
37 /* implementation dependend declarations */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
38 typedef enum { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
39 STATUS_OK, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
40 STATUS_MEM_EXHAUSTED, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
41 STATUS_DUPLICATE_KEY, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
42 STATUS_KEY_NOT_FOUND |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
43 } statusEnum; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
44 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
45 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
46 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
47 #define NODE(a) (tmp_node++,a+jt->sbuv) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
48 #else |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
49 #define NODE(a) (a+jt->sbuv) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
50 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
51 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
52 #define NODEM(a,b) (jt->sbuv[a].b) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
53 #define LEFT(a) NODEM(a,left) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
54 #define RIGHT(a) NODEM(a,right) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
55 #define ORDER(a) NODEM(a,order) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
56 #define INDEX(a) NODEM(a,i) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
57 #define LENGTH(a) NODEM(a,n) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
58 #define HASH(a) NODEM(a,h) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
59 #define COLOR(a) NODEM(a,color) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
60 #define DOWN(a) NODEM(a,down) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
61 #define UP(a) NODEM(a,up) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
62 #define PARENT(a) NODEM(a,parent) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
63 #define GRANDPARENT(a) (PARENT(PARENT(a))) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
64 #define ISLEFTCHILD(x) (x == LEFT(PARENT(x))) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
65 #define ISRIGHTCHILD(x) (x == RIGHT(PARENT(x))) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
66 #define compLT(a,b) Vcompare(jt,a,b) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
67 #define compEQ(a,b) ( a == b ) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
68 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
69 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
70 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
71 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
72 static void showdepth(J jt, I node, int **ptr, I* size, I depth) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
73 { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
74 if(LEFT(node) == 0) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
75 (*ptr) = realloc((*ptr), sizeof(I)*((*size)+1)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
76 (*ptr)[(*size)++]=depth; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
77 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
78 else showdepth(jt, LEFT(node), ptr, size, depth+1); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
79 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
80 if(RIGHT(node) == 0) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
81 (*ptr) = realloc((*ptr), sizeof(I)*((*size)+1)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
82 (*ptr)[(*size)++]=depth; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
83 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
84 else showdepth(jt, RIGHT(node), ptr, size, depth+1); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
85 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
86 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
87 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
88 static __inline int Vcompare(J jt,I a,I b){I m,n;SBU*u,*v;UC*s,*t;U2*p,*q; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
89 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
90 tmp_lt++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
91 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
92 u=a+jt->sbuv; m=u->n; s=(UC*)(jt->sbsv+u->i); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
93 v=b+jt->sbuv; n=v->n; t=(UC*)(jt->sbsv+v->i); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
94 switch((SBC2&u->flag?2:0)+(SBC2&v->flag?1:0)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
95 case 0: { DO(MIN(m,n), if(*s!=*t)R *s<*t; ++s; ++t;);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
96 case 1: { q=(U2*)t; n/=2; DO(MIN(m,n), if(*s!=*q)R *s<*q; ++s; ++q;);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
97 case 2: {p=(U2*)s; m/=2; DO(MIN(m,n), if(*p!=*t)R *p<*t; ++p; ++t;);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
98 case 3: {p=(U2*)s; q=(U2*)t; m/=2; n/=2; DO(MIN(m,n), if(*p!=*q)R *p<*q; ++p; ++q;);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
99 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
100 R m<n; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
101 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
102 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
103 static __inline void rotateLeft(J jt, I x) {I y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
104 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
105 tmp_lr++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
106 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
107 /*************************** |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
108 * rotate node x to left * |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
109 ***************************/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
110 y = RIGHT(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
111 if (RIGHT(x)= LEFT(y)) PARENT(LEFT(y)) = x; /* establish x->right link */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
112 if (y) PARENT(y) = PARENT(x); /* establish y->parent link */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
113 if (PARENT(x) == 0) ROOT = y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
114 else if (ISLEFTCHILD(x)) LEFT (PARENT(x))= y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
115 else RIGHT(PARENT(x))= y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
116 if (LEFT(y) = x) PARENT(x) = y; /* link x and y */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
117 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
118 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
119 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
120 static __inline void rotateRight(J jt, I x) {I y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
121 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
122 tmp_rr++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
123 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
124 /*************************** |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
125 * rotate node x to right * |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
126 ***************************/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
127 y = LEFT(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
128 if (LEFT(x)= RIGHT(y)) PARENT(RIGHT(y))= x; /* establish x->left link */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
129 if (y) PARENT(y) = PARENT(x); /* establish y->parent link */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
130 if (PARENT(x) == 0) ROOT = y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
131 else if (ISRIGHTCHILD(x)) RIGHT(PARENT(x))= y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
132 else LEFT (PARENT(x))= y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
133 if (RIGHT(y)= x) PARENT(x) = y; /* link x and y */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
134 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
135 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
136 static __inline void insertFixup(J jt, I x) {B b;I y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
137 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
138 /************************************* |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
139 * maintain Red-Black tree balance * |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
140 * after inserting node x * |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
141 *************************************/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
142 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
143 /* check Red-Black properties */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
144 /* the repositioning is necessary to propogate the rebalancing */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
145 while (x != ROOT && COLOR(PARENT(x)) == RED) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
146 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
147 tmp_while++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
148 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
149 if (ISLEFTCHILD(PARENT(x))) { /* we have a violation */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
150 y = RIGHT(GRANDPARENT(x)); /* uncle */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
151 b = COLOR(y)==BLACK; /* uncle is BLACK */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
152 if (b && ISRIGHTCHILD(x)) {x=PARENT(x); rotateLeft(jt,x);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
153 COLOR(PARENT(x)) = BLACK; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
154 COLOR(GRANDPARENT(x)) = RED; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
155 if (b) rotateRight(jt, GRANDPARENT(x)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
156 else {COLOR(y)=BLACK; x=GRANDPARENT(x);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
157 }else { /* mirror image of above code */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
158 y = LEFT(GRANDPARENT(x)); /* uncle */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
159 b = COLOR(y)==BLACK; /* uncle is BLACK */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
160 if (b && ISLEFTCHILD(x)) {x=PARENT(x); rotateRight(jt,x);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
161 COLOR(PARENT(x)) = BLACK; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
162 COLOR(GRANDPARENT(x)) = RED; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
163 if (b) rotateLeft(jt, GRANDPARENT(x)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
164 else {COLOR(y)=BLACK; x=GRANDPARENT(x);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
165 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
166 COLOR(ROOT) = BLACK; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
167 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
168 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
169 static statusEnum insert(J jt, I key) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
170 I current,dist,i,keep1,keep2,lorder,parent,rorder,to_the_left,to_the_right;SBU *x; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
171 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
172 static I icount=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
173 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
174 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
175 if (key < 0) R STATUS_KEY_NOT_FOUND; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
176 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
177 /*********************************************** |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
178 * allocate node for data and insert in tree * |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
179 ***********************************************/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
180 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
181 /* find future parent */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
182 current = ROOT; /* jt-> root points to the int value of the root symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
183 parent = to_the_left = to_the_right = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
184 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
185 while (current != 0) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
186 if (compEQ(key, current))return STATUS_DUPLICATE_KEY; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
187 parent = current; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
188 if(compLT(key, current)){to_the_right=current; current= LEFT(current);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
189 else {to_the_left =current; current=RIGHT(current);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
190 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
191 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
192 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
193 icount++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
194 if (icount==10000&&0) {I corder,running; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
195 icount=running=corder=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
196 do { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
197 ORDER(running)=corder; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
198 corder+=FILLFACTOR; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
199 running=UP(running); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
200 } while(running); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
201 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
202 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
203 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
204 /* get the new node */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
205 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
206 lorder = to_the_left ? ORDER(to_the_left) : 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
207 rorder = to_the_right ? ORDER(to_the_right) : lorder + 2 * FILLFACTOR; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
208 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
209 if(rorder-lorder<2) { /* if(rorder-lorder<(2*GAP)) { */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
210 i=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
211 /*parameter GAP is TWICE the difference in order numbers we want after re-ordering*/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
212 while(to_the_right&&to_the_left&&(ORDER(to_the_right)-ORDER(to_the_left))<(GAP*++i)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
213 keep1=to_the_left; to_the_left =DOWN(to_the_left); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
214 keep2=to_the_right; to_the_right=UP (to_the_right); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
215 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
216 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
217 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
218 if(!to_the_left )UP(0) =keep1,i++,tmp_lhit++ ; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
219 if(!to_the_right)DOWN(0)=keep2,i++,tmp_rhit++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
220 tmp_imax=__max(i,tmp_imax); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
221 tmp_moves+=2*i; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
222 tmp_reorder++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
223 #else |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
224 if(!to_the_left )UP(0) =keep1,i++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
225 if(!to_the_right)DOWN(0)=keep2,i++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
226 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
227 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
228 lorder= to_the_left ? ORDER(to_the_left ) : rorder-2*i*FILLFACTOR; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
229 rorder= to_the_right ? ORDER(to_the_right) : lorder+2*i*FILLFACTOR; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
230 dist = (rorder-lorder)/(2*i); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
231 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
232 while(--i) { |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
233 to_the_left =UP (to_the_left); lorder+=dist; ORDER(to_the_left )=lorder; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
234 to_the_right=DOWN(to_the_right); rorder-=dist; ORDER(to_the_right)=rorder; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
235 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
236 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
237 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
238 x = NODE(key); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
239 x->parent= parent; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
240 x->left = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
241 x->right = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
242 x->color = RED; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
243 x->order = (rorder+lorder)/2; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
244 x->up = to_the_right; DOWN(to_the_right)=key; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
245 x->down = to_the_left; UP(to_the_left) =key; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
246 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
247 /* insert node in tree */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
248 if (0==parent) ROOT =key; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
249 else if(compLT(key, parent))LEFT(parent) =key; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
250 else RIGHT(parent)=key; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
251 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
252 insertFixup(jt, key); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
253 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
254 return STATUS_OK; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
255 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
256 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
257 /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
258 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
259 static I jtsbextend(J jt,I n,C*s,UI h,I hi){A x;I c,*hv,j,p;SBU*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
260 c=jt->sbun; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
261 if(c==*AS(jt->sbu)){ /* extend sbu unique symbols */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
262 RZ(x=ext(1,jt->sbu)); jt->sbu=x; jt->sbuv=(SBU*)AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
263 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
264 if(AN(jt->sbs)<n+jt->sbsn){ /* extend sbs strings */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
265 GA(x,LIT,2*(n+jt->sbsn),1,0); MC(CAV(x),jt->sbsv,jt->sbsn); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
266 fa(jt->sbs); ra(x); jt->sbs=x; jt->sbsv=CAV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
267 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
268 if(AN(jt->sbh)<2*c){ /* extend sbh hash table */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
269 p=2*AN(jt->sbh); DO(64, if(p<=ptab[i]){p=ptab[i]; break;}); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
270 RZ(x=apv(p,-1L,0L)); hv=AV(x); v=jt->sbuv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
271 DO(c, j=v++->h%p; while(0<=hv[j])j=(1+j)%p; hv[j]=i;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
272 fa(jt->sbh); ra(x); jt->sbh=x; jt->sbhv= AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
273 hi=h%p; /* new hi wrt new sbh size */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
274 while(0<=hv[hi])hi=(1+hi)%p; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
275 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
276 R hi; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
277 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
278 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
279 static SB jtsbinsert(J jt,B c2,I n,C*s,UI h,I hi){I c,m,p;SBU*u; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
280 c=jt->sbun; /* cardinality */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
281 m=jt->sbsn; /* existing # chars in sbs */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
282 p=c2&&m%2; /* pad for alignment */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
283 RE(hi=sbextend(n+p,s,h,hi)); /* extend global tables as req'd*/ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
284 MC(SBSV(m+p),s,n); /* copy string into sbs */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
285 u=SBUV(c); u->i=m+p; u->n=n; u->h=h; /* index/length/hash */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
286 u->flag=c2?SBC2:0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
287 ASSERTSYS(STATUS_OK==insert(jt,c),"sbinsert"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
288 (jt->sbhv)[hi]=c; /* make sbh point to new symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
289 ++jt->sbun; /* # unique symbols */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
290 jt->sbsn+=n+p; /* # chars in sbs */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
291 R(SB)c; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
292 } /* insert new symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
293 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
294 static SB jtsbprobe(J jt,B c2,I n,C*s){B b;C*t;I hi,hn,ui;SBU*u;UI h; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
295 h=c2?hic2(n,(UC*)s):hic(n,(UC*)s); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
296 hn=AN(jt->sbh); /* size of hast table */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
297 hi=h%hn; /* index into hash table */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
298 while(1){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
299 ui=(jt->sbhv)[hi]; /* index into unique symbols */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
300 if(0>ui)R sbinsert(c2,n,s,h,hi); /* new symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
301 u=SBUV(ui); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
302 if(h==u->h){ /* old symbol, maybe */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
303 t=SBSV(u->i); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
304 switch((c2?2:0)+(u->flag&SBC2?1:0)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
305 case 1: if(n==u->n/2){C2*q=(C2*)t; b=1; DO(n, if(s[i]!=q[i]){b=0; break;}); if(b)R(SB)ui;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
306 case 2: if(n==u->n*2){C2*q=(C2*)s; b=1; DO(n/2, if(t[i]!=q[i]){b=0; break;}); if(b)R(SB)ui;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
307 case 3: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
308 case 0: if(n==u->n&&!memcmp(t,s,n))R(SB)ui; break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
309 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
310 hi=(1+hi)%hn; /* next hash table index */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
311 }} /* insert new symbol or get existing symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
312 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
313 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
314 static A jtsbunstr(J jt,I q,A w){A z;B c2;I i,j,m,wn;SB*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
315 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
316 if(!AN(w))R vec(SBT,0L,0L); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
317 ASSERT(AT(w)&LIT+C2T,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
318 ASSERT(1>=AR(w),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
319 c2=1&&AT(w)&C2T; wn=AN(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
320 if(c2){C2 c,*wv=(C2*)AV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
321 c=wv[q==-1?0:wn-1]; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
322 m=0; DO(wn, if(c==wv[i])++m;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
323 GA(z,SBT,m,1,0); zv=SBAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
324 if(q==-1){for(i=j=1;i<=wn;++i)if(c==wv[i]||i==wn){RE(*zv++=sbprobe(c2,2*(i-j),(C*)(j+wv))); j=i+1;}} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
325 else {for(i=j=0;i< wn;++i)if(c==wv[i] ){RE(*zv++=sbprobe(c2,2*(i-j),(C*)(j+wv))); j=i+1;}} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
326 }else{C c,*wv=CAV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
327 c=wv[q==-1?0:wn-1]; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
328 m=0; DO(wn, if(c==wv[i])++m;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
329 GA(z,SBT,m,1,0); zv=SBAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
330 if(q==-1){for(i=j=1;i<=wn;++i)if(c==wv[i]||i==wn){RE(*zv++=sbprobe(c2,i-j,j+wv)); j=i+1;}} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
331 else {for(i=j=0;i< wn;++i)if(c==wv[i] ){RE(*zv++=sbprobe(c2,i-j,j+wv)); j=i+1;}} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
332 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
333 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
334 } /* monad s: on leading (_1=q) or trailing (_2=q) character separated strings */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
335 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
336 static A jtsbunlit(J jt,C cx,A w){A z;B c2;I i,m,wc,wr,*ws;SB*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
337 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
338 ASSERT(!AN(w)||AT(w)&LIT+C2T,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
339 ASSERT(1<AR(w),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
340 c2=1&&AT(w)&C2T; wr=AR(w); ws=AS(w); wc=ws[wr-1]; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
341 RE(m=wc?AN(w)/wc:prod(wr-1,ws)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
342 GA(z,SBT,m,wr-1,ws); zv=SBAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
343 if(!wc)memset(zv,C0,m*sizeof(SB)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
344 else if(c2){C2 c=(C2)cx,*s,*wv=(C2*)AV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
345 for(i=0;i<m;++i){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
346 s=wc+wv; DO(wc, if(c!=*--s)break;); /* exclude trailing "blanks" */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
347 RE(*zv++=sbprobe(c2,2*((c!=*s)+s-wv),(C*)wv)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
348 wv+=wc; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
349 }}else{C c=cx,*s,*wv=CAV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
350 for(i=0;i<m;++i){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
351 s=wc+wv; DO(wc, if(c!=*--s)break;); /* exclude trailing "blanks" */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
352 RE(*zv++=sbprobe(c2,(c!=*s)+s-wv,wv)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
353 wv+=wc; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
354 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
355 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
356 } /* each row of literal array w less the trailing "blanks" is a symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
357 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
358 static F1(jtsbunbox){A*wv,x,z;B c2;I i,m,n,wd;SB*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
359 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
360 ASSERT(!AN(w)||BOX&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
361 m=AN(w); wv=AAV(w); wd=(I)w*ARELATIVE(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
362 GA(z,SBT,m,AR(w),AS(w)); zv=SBAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
363 for(i=0;i<m;++i){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
364 x=WVR(i); n=AN(x); c2=1&&AT(x)&C2T; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
365 ASSERT(!n||AT(x)&LIT+C2T,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
366 ASSERT(1>=AR(x),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
367 RE(*zv++=sbprobe(c2,c2?n+n:n,CAV(x))); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
368 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
369 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
370 } /* each element of boxed array w is a string */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
371 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
372 static F1(jtsbunind){A z;I j,n,*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
373 RZ(z=cvt(INT,w)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
374 zv=AV(z); n=jt->sbun; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
375 DO(AN(w), j=*zv++; ASSERT(0<=j&&j<n,EVINDEX);); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
376 AT(z)=SBT; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
377 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
378 } /* w is a numeric array of symbol indices */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
379 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
380 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
381 F1(jtsb1){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
382 A abc; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
383 clo=clock(); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
384 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
385 switch(AT(w)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
386 default: ASSERT(0,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
387 case C2T: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
388 case LIT: abc=(1>=AR(w)?sbunstr(-1L,w):sbunlit(' ',w)); break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
389 case BOX: abc=(sbunbox(w)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
390 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
391 clo-=clock(); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
392 R abc; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
393 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
394 #else |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
395 F1(jtsb1){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
396 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
397 switch(AT(w)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
398 default: ASSERT(0,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
399 case C2T: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
400 case LIT: R 1>=AR(w)?sbunstr(-1L,w):sbunlit(' ',w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
401 case BOX: R sbunbox(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
402 }} /* monad s: main control */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
403 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
404 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
405 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
406 F1(jtsborder){A z;I n,*zv;SB*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
407 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
408 n=AN(w); v=SBAV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
409 ASSERT(!n||SBT&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
410 GA(z,INT,n,AR(w),AS(w)); zv=AV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
411 DO(n, *zv++=SBUV(*v++)->order;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
412 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
413 } /* order numbers for symbol array w */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
414 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
415 static F1(jtsbbox){A z,*zv;C*s;I n;SB*v;SBU*u; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
416 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
417 n=AN(w); v=SBAV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
418 ASSERT(!n||SBT&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
419 GA(z,BOX,n,AR(w),AS(w)); zv=AAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
420 DO(n, u=SBUV(*v++); s=SBSV(u->i); RZ(*zv++=SBC2&u->flag?vec(C2T,u->n/2,s):str(u->n,s));); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
421 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
422 } /* boxed strings for symbol array w */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
423 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
424 #define C2FSB(zv,u,q,m,c) \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
425 {C*s=SBSV(u->i);I k=u->n; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
426 if(SBC2&u->flag){MC(zv,s,k); zv+=k/=2;}else DO(k, *zv++=*s++;); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
427 if(2==q)*zv++=c; else if(3==q)DO(m-k, *zv++=c;); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
428 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
429 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
430 static A jtsbstr(J jt,I q,A w){A z;B c2=0;C c;I m,n;SB*v,*v0;SBU*u; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
431 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
432 m=n=AN(w); v=v0=SBAV(w); c=1==q?'`':C0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
433 ASSERT(!n||SBT&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
434 DO(n, u=SBUV(*v++); if(u->flag&SBC2){c2=1; m+=u->n/2;}else m+=u->n;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
435 v=v0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
436 GA(z,c2?C2T:LIT,m,1,0); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
437 if(c2){C2*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
438 zv=(C2*)AV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
439 if(1==q)*zv++=c; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
440 DO(n-1, u=SBUV(*v++); C2FSB(zv,u,2,0,c);); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
441 if(n){ u=SBUV(*v++); C2FSB(zv,u,q,0,c);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
442 }else{C*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
443 zv=CAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
444 if(1==q)*zv++=c; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
445 DO(n-1, u=SBUV(*v++); MC(zv,SBSV(u->i),u->n); zv+=u->n; *zv++=c;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
446 if(n){ u=SBUV(*v++); MC(zv,SBSV(u->i),u->n); zv+=u->n; if(2==q)*zv=c;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
447 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
448 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
449 } /* leading (1=q) or trailing (2=q) separated string for symbol array w */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
450 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
451 static A jtsblit(J jt,C c,A w){A z;B c2=0;I k,m=0,n;SB*v,*v0;SBU*u; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
452 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
453 n=AN(w); v=v0=SBAV(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
454 ASSERT(!n||SBT&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
455 DO(n, u=SBUV(*v++); k=u->n; if(u->flag&SBC2){c2=1; k/=2;} if(m<k)m=k;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
456 v=v0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
457 GA(z,c2?C2T:LIT,n*m,1+AR(w),AS(w)); *(AR(w)+AS(z))=m; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
458 if(c2){C2*zv=(C2*)AV(z); DO(n, u=SBUV(*v++); C2FSB(zv,u,3,m,c););} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
459 else {C*zv=CAV(z); memset(zv,c,n*m); DO(n, u=SBUV(*v++); MC(zv,SBSV(u->i),u->n); zv+=m;);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
460 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
461 } /* literal array for symbol array w padded with c */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
462 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
463 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
464 static F1(jtsbhashstat){A z;I j,k,n,p,*zv;SBU*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
465 n=jt->sbun; v=jt->sbuv; p=AN(jt->sbh); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
466 GA(z,INT,n,1,0); zv=AV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
467 DO(n, j=v++->h%p; k=1; while(i!=(jt->sbhv)[j]){j=(j+1)%p; ++k;} *zv++=k;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
468 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
469 } /* # queries in hash table for each unique symbol */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
470 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
471 static A jtsbcheck1(J jt,A una,A sna,A u,A s,A h,A roota,A ff,A gp){PROLOG;A x,*xv,y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
472 B b,*dnv,*lfv,*rtv,*upv;C*ptv,*sv;I c,f,g,hn,*hv,i,j,r,sn,un,*yv;SBU*uv,*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
473 RZ(una&&sna&&u&&s&&h); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
474 ASSERTD(!AR(una),"c atom"); /* cardinality */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
475 ASSERTD(INT&AT(una),"c integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
476 c=*AV(una); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
477 ASSERTD(0<=c,"c non-negative"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
478 ASSERTD(!AR(sna),"sn atom"); /* string length */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
479 ASSERTD(INT&AT(sna),"sn integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
480 sn=*AV(sna); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
481 ASSERTD(0<=sn,"sn non-negative"); /* root */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
482 ASSERTD(!AR(roota),"root atom"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
483 ASSERTD(INT&AT(roota),"root integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
484 r=*AV(roota); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
485 ASSERTD(0<=r,"root non-negative"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
486 ASSERTD(r<c,"root bounded by c"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
487 ASSERTD(!AR(ff),"ff atom"); /* fill factor */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
488 ASSERTD(INT&AT(ff),"ff integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
489 f=*AV(ff); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
490 ASSERTD(0<=f,"ff non-negative"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
491 ASSERTD(!AR(gp),"gap atom"); /* gap */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
492 ASSERTD(INT&AT(gp),"gap integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
493 g=*AV(gp); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
494 ASSERTD(0<=g,"gap non-negative"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
495 ASSERTD(g<f,"gap bounded by ff"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
496 sv=CAV(s); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
497 un=*AS(u); uv=(SBU*)AV(u); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
498 hn= AN(h); hv=AV(h); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
499 ASSERTD(2==AR(u),"u matrix"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
500 ASSERTD(INT&AT(u),"u integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
501 ASSERTD(*(1+AS(u))==sizeof(SBU)/SZI,"u #columns"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
502 ASSERTD(c<=un,"c bounded by #u"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
503 ASSERTD(1==AR(s),"s vector"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
504 ASSERTD(LIT&AT(s),"s literal"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
505 ASSERTD(sn<=AN(s),"sn bounded by #s"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
506 ASSERTD(1==AR(h),"h vector"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
507 ASSERTD(INT&AT(h),"h integer"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
508 ASSERTD(c<=AN(h),"c bounded by #h"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
509 ASSERTD(equ(vec(INT,1L,&hn),factor(sc(hn))),"#h prime"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
510 b=0; DO(AN(h), j=hv[i]; if(-1==j)b=1; else ASSERTD(0<=j&&j<c,"h index");); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
511 ASSERTD(b,"h full"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
512 GA(x,B01,c,1,0); lfv=BAV(x); memset(lfv,C0,c); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
513 GA(x,B01,c,1,0); rtv=BAV(x); memset(rtv,C0,c); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
514 GA(x,B01,c,1,0); dnv=BAV(x); memset(dnv,C0,c); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
515 GA(x,B01,c,1,0); upv=BAV(x); memset(upv,C0,c); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
516 GA(x,LIT,c,1,0); ptv=CAV(x); memset(ptv,C0,c); ptv[0]=1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
517 GA(x,BOX,c,1,0); xv=AAV(x); RZ(xv[0]=str(uv->n,sv+uv->i)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
518 GA(y,INT,c,1,0); yv= AV(y); yv[0]=uv->order; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
519 for(i=1,v=1+uv;i<c;++i,++v){B c2;I ord,vi,vn;UC*vc;UI k; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
520 c2=1&&v->flag&SBC2; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
521 vi=v->i; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
522 vn=v->n; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
523 vc=(UC*)(sv+vi); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
524 ASSERTD(0<=vi&&vi<=sn,"u index"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
525 ASSERTD(!(c2&&vi%2),"u index alignment"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
526 ASSERTD(0<=vn&&!(c2&&vn%2),"u length"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
527 ASSERTD(sn>=vi+vn,"u index/length"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
528 k=(c2?hic2:hic)(vn,vc); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
529 ASSERTD(k==v->h,"u hash"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
530 j=k%hn; while(i!=hv[j]&&0<=hv[j])j=(1+j)%hn; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
531 ASSERTD(i==hv[j],"u/h mismatch"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
532 ASSERTD(BLACK==v->color||RED==v->color,"u color"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
533 RZ(xv[i]=c2?vec(C2T,vn/2,vc):str(vn,vc)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
534 yv[i]=ord=v->order; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
535 j=v->parent; ASSERTD( 0<=j&&j<c&&2>=++ptv[j],"u parent"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
536 j=v->left; ASSERTD(!j||0<=j&&j<c&&1>=++lfv[j]&& ord>(j+uv)->order ,"u left" ); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
537 j=v->right; ASSERTD(!j||0<=j&&j<c&&1>=++rtv[j]&& ord<(j+uv)->order ,"u right" ); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
538 j=v->down; ASSERTD( 0<=j&&j<c&&1>=++dnv[j]&&(!j||ord>(j+uv)->order),"u predecessor"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
539 j=v->up; ASSERTD( 0<=j&&j<c&&1>=++upv[j]&&(!j||ord<(j+uv)->order),"u successor" ); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
540 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
541 ASSERTD(equ(grade1(x),grade1(y)),"u order"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
542 EPILOG(one); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
543 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
544 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
545 static F1(jtsbcheck){R sbcheck1(sc(jt->sbun),sc(jt->sbsn),jt->sbu,jt->sbs,jt->sbh,sc(ROOT),sc(FILLFACTOR),sc(GAP));} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
546 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
547 static F1(jtsbsetdata){A h,s,u,*wv,x;I wd; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
548 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
549 ASSERTD(BOX&AT(w),"arg type"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
550 ASSERTD(1==AR(w), "arg rank"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
551 ASSERTD(8==AN(w), "arg length"); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
552 wv=AAV(w); wd=(I)w*ARELATIVE(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
553 RZ(sbcheck1(WVR(0),WVR(1),WVR(2),WVR(3),WVR(4),WVR(5),WVR(6),WVR(7))); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
554 jt->sbun=*AV(WVR(0)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
555 jt->sbsn=*AV(WVR(1)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
556 RZ(x=ra(ca(WVR(2)))); u=jt->sbu; jt->sbu=x; jt->sbuv=(SBU*)AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
557 RZ(x=ra(ca(WVR(3)))); s=jt->sbs; jt->sbs=x; jt->sbsv= CAV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
558 RZ(x=ra(ca(WVR(4)))); h=jt->sbh; jt->sbh=x; jt->sbhv= AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
559 ROOT =*AV(WVR(5)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
560 FILLFACTOR=*AV(WVR(6)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
561 GAP =*AV(WVR(7)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
562 fa(u); fa(s); fa(h); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
563 R one; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
564 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
565 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
566 static F1(jtsbgetdata){A z,*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
567 GA(z,BOX,8,1,0); zv=AAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
568 RZ(zv[0]=sc(jt->sbun)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
569 RZ(zv[1]=sc(jt->sbsn)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
570 RZ(zv[2]=ca(jt->sbu)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
571 RZ(zv[3]=ca(jt->sbs)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
572 RZ(zv[4]=ca(jt->sbh)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
573 RZ(zv[5]=sc(ROOT)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
574 RZ(zv[6]=sc(FILLFACTOR)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
575 RZ(zv[7]=sc(GAP)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
576 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
577 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
578 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
579 F2(jtsb2){A z;I j,k,n; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
580 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
581 I*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
582 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
583 RZ(a&&w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
584 RE(j=i0(a)); n=AN(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
585 ASSERT(!(1<=j&&j<=7)||!n||SBT&AT(w),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
586 switch(j){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
587 default: ASSERT(0,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
588 case 0: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
589 RE(k=i0(w)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
590 switch(k){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
591 default: ASSERT(0,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
592 case 0: R sc(jt->sbun); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
593 case 1: R sc(jt->sbsn); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
594 case 2: R ca(jt->sbu); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
595 case 3: R ca(jt->sbs); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
596 case 4: R ca(jt->sbh); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
597 case 5: R sc(ROOT); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
598 case 6: R sc(FILLFACTOR); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
599 case 7: R sc(GAP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
600 case 10: R sbgetdata(zero); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
601 case 11: R sbcheck(zero); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
602 case 12: R sbhashstat(zero); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
603 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
604 case 1: R sbstr(1L,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
605 case -1: R sbunstr(-1L,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
606 case 2: R sbstr(2L,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
607 case -2: R sbunstr(-2L,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
608 case 3: R sblit(C0,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
609 case -3: R sbunlit(C0,w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
610 case 4: R sblit(' ',w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
611 case -4: R sbunlit(' ',w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
612 case 5: R sbbox(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
613 case -5: R sbunbox(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
614 case 6: RZ(z=ca(w)); AT(z)=INT; R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
615 case -6: R sbunind(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
616 case 7: R sborder(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
617 case 10: R sbsetdata(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
618 case 16: GAP = 4; R sc(GAP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
619 case 17: GAP++; ASSERT(FILLFACTOR>GAP,EVLIMIT); R sc(GAP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
620 case 18: GAP--; R sc(GAP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
621 case 19: FILLFACTOR=1024; R sc(FILLFACTOR); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
622 case 20: FILLFACTOR*=2; R sc(FILLFACTOR); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
623 case 21: FILLFACTOR/=2; ASSERT(FILLFACTOR>GAP,EVLIMIT); R sc(FILLFACTOR); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
624 #ifdef TMP |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
625 case 22: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
626 GA(z,INT,10,1,0); zv=AV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
627 zv[0] = tmp_lr = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
628 zv[1] = tmp_rr = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
629 zv[2] = tmp_lt = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
630 zv[3] = tmp_while = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
631 zv[4] = tmp_node = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
632 zv[5] = tmp_reorder = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
633 zv[6] = tmp_moves = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
634 zv[7] = tmp_imax = 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
635 zv[8] = tmp_lhit; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
636 zv[9] = tmp_rhit; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
637 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
638 case 23: |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
639 GA(z,INT,10,1,0); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
640 zv[0] = tmp_lr; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
641 zv[1] = tmp_rr; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
642 zv[2] = tmp_lt; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
643 zv[3] = tmp_while; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
644 zv[4] = tmp_node; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
645 zv[5] = tmp_reorder; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
646 zv[6] = tmp_moves; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
647 zv[7] = tmp_imax; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
648 zv[8] = tmp_lhit; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
649 zv[9] = tmp_rhit; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
650 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
651 case 24: R sc((I)clo); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
652 case 25: R scf(tickk); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
653 #endif |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
654 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
655 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
656 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
657 B jtsbtypeinit(J jt){A x;I c=sizeof(SBU)/SZI,s[2]; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
658 s[0]=2000; s[1]=c; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
659 GA(x,LIT,20000,1,0); jt->sbs=x; jt->sbsv= CAV(x); jt->sbsn=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
660 RZ(x=apv(ptab[5],-1L,0L)); jt->sbh=x; jt->sbhv= AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
661 GA(x,INT,*s*c,2,s); jt->sbu=x; jt->sbuv=(SBU*)AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
662 GAP=15; /* TWICE the difference in order numbers we want after re-ordering */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
663 FILLFACTOR=1024; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
664 ROOT=0; /* initialize binary tree; initialize the empty symbol (used as fill) */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
665 jt->sbuv[0]=sentinel; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
666 jt->sbun=1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
667 *jt->sbhv=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
668 R 1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
669 } /* initialize global data for SBT datatype */ |