Commit | Line | Data |
---|---|---|
97df14cd JM |
1 | -- --------------------------------------------------------- |
2 | -- persistent values | |
3 | ||
97df14cd | 4 | BEGIN |
2866f9a8 | 5 | EXECUTE IMMEDIATE 'DROP TYPE mal_T FORCE'; |
97df14cd JM |
6 | EXCEPTION |
7 | WHEN OTHERS THEN IF SQLCODE != -4043 THEN RAISE; END IF; | |
8 | END; | |
9 | / | |
10 | ||
11 | -- list of types for type_id | |
12 | -- 0: nil | |
13 | -- 1: false | |
14 | -- 2: true | |
15 | -- 3: integer | |
16 | -- 4: float | |
17 | -- 5: string | |
02936b42 | 18 | -- 6: long string (CLOB) |
97df14cd JM |
19 | -- 7: symbol |
20 | -- 8: list | |
21 | -- 9: vector | |
22 | -- 10: hashmap | |
23 | -- 11: function | |
24 | -- 12: malfunc | |
25 | -- 13: atom | |
26 | ||
9fc524f1 | 27 | -- nil (0), false (1), true (2) |
2866f9a8 | 28 | CREATE OR REPLACE TYPE mal_T FORCE AS OBJECT ( |
97df14cd JM |
29 | type_id integer |
30 | ) NOT FINAL; | |
31 | / | |
32 | ||
2866f9a8 JM |
33 | -- general nested table of mal values (integers) |
34 | -- used frequently for argument passing | |
35 | CREATE OR REPLACE TYPE mal_vals FORCE AS TABLE OF integer; | |
36 | / | |
37 | ||
38 | ||
9fc524f1 | 39 | -- integer (3) |
2866f9a8 | 40 | CREATE OR REPLACE TYPE mal_int_T FORCE UNDER mal_T ( |
97df14cd JM |
41 | val_int integer |
42 | ) FINAL; | |
43 | / | |
44 | ||
02936b42 | 45 | -- string/keyword (5,6), symbol (7) |
2866f9a8 | 46 | CREATE OR REPLACE TYPE mal_str_T FORCE UNDER mal_T ( |
97df14cd | 47 | val_str varchar2(4000) |
02936b42 JM |
48 | ) NOT FINAL; |
49 | / | |
50 | ||
2866f9a8 | 51 | CREATE OR REPLACE TYPE mal_long_str_T FORCE UNDER mal_str_T ( |
02936b42 | 52 | val_long_str CLOB -- long character object (for larger than 4000 chars) |
97df14cd JM |
53 | ) FINAL; |
54 | / | |
02936b42 | 55 | show errors; |
97df14cd | 56 | |
9fc524f1 | 57 | -- list (8), vector (9) |
2866f9a8 JM |
58 | CREATE OR REPLACE TYPE mal_seq_T FORCE UNDER mal_T ( |
59 | val_seq mal_vals, | |
6a085103 JM |
60 | meta integer |
61 | ) FINAL; | |
62 | / | |
63 | ||
2866f9a8 | 64 | CREATE OR REPLACE TYPE mal_map_T FORCE UNDER mal_T ( |
6a085103 JM |
65 | map_idx integer, -- index into map entry table |
66 | meta integer | |
97df14cd JM |
67 | ) FINAL; |
68 | / | |
69 | ||
9fc524f1 | 70 | -- malfunc (12) |
2866f9a8 | 71 | CREATE OR REPLACE TYPE mal_func_T FORCE UNDER mal_T ( |
0fc03918 JM |
72 | ast integer, |
73 | params integer, | |
74 | env integer, | |
6a085103 JM |
75 | is_macro integer, |
76 | meta integer | |
9fc524f1 JM |
77 | ) FINAL; |
78 | / | |
97df14cd | 79 | |
06951f55 | 80 | -- atom (13) |
2866f9a8 JM |
81 | CREATE OR REPLACE TYPE mal_atom_T FORCE UNDER mal_T ( |
82 | val integer -- index into mal_table | |
0fc03918 | 83 | ); |
06951f55 JM |
84 | / |
85 | ||
97df14cd | 86 | |
7836cfa3 | 87 | -- --------------------------------------------------------- |
97df14cd | 88 | |
0fc03918 | 89 | CREATE OR REPLACE PACKAGE types IS |
2866f9a8 JM |
90 | -- memory pool for mal_objects (non-hash-map) |
91 | TYPE mal_table IS TABLE OF mal_T; | |
92 | ||
93 | -- memory pool for hash-map objects | |
6a085103 JM |
94 | TYPE map_entry IS TABLE OF integer INDEX BY varchar2(256); |
95 | TYPE map_entry_table IS TABLE OF map_entry; | |
96 | ||
7836cfa3 | 97 | -- general functions |
2866f9a8 | 98 | FUNCTION mem_new RETURN mal_table; |
0fc03918 | 99 | |
6a085103 | 100 | FUNCTION tf(val boolean) RETURN integer; |
2866f9a8 | 101 | FUNCTION equal_Q(M IN OUT NOCOPY mal_table, |
6a085103 | 102 | H IN OUT NOCOPY map_entry_table, |
0fc03918 | 103 | a integer, b integer) RETURN boolean; |
97df14cd | 104 | |
2866f9a8 | 105 | FUNCTION clone(M IN OUT NOCOPY mal_table, |
6a085103 JM |
106 | H IN OUT NOCOPY map_entry_table, |
107 | obj integer, | |
108 | meta integer DEFAULT 1) RETURN integer; | |
109 | ||
7836cfa3 | 110 | -- scalar functions |
2866f9a8 JM |
111 | FUNCTION int(M IN OUT NOCOPY mal_table, num integer) RETURN integer; |
112 | FUNCTION string(M IN OUT NOCOPY mal_table, name varchar) RETURN integer; | |
113 | FUNCTION string_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean; | |
114 | FUNCTION symbol(M IN OUT NOCOPY mal_table, name varchar) RETURN integer; | |
115 | FUNCTION keyword(M IN OUT NOCOPY mal_table, name varchar) RETURN integer; | |
116 | FUNCTION keyword_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean; | |
aa42fdce JM |
117 | FUNCTION number_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean; |
118 | FUNCTION function_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean; | |
119 | FUNCTION macro_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean; | |
97df14cd | 120 | |
7836cfa3 | 121 | -- sequence functions |
2866f9a8 | 122 | FUNCTION seq(M IN OUT NOCOPY mal_table, |
6a085103 | 123 | type_id integer, |
2866f9a8 | 124 | items mal_vals, |
6a085103 | 125 | meta integer DEFAULT 1) RETURN integer; |
2866f9a8 JM |
126 | FUNCTION list(M IN OUT NOCOPY mal_table) RETURN integer; |
127 | FUNCTION list(M IN OUT NOCOPY mal_table, | |
0fc03918 | 128 | a integer) RETURN integer; |
2866f9a8 | 129 | FUNCTION list(M IN OUT NOCOPY mal_table, |
0fc03918 | 130 | a integer, b integer) RETURN integer; |
2866f9a8 | 131 | FUNCTION list(M IN OUT NOCOPY mal_table, |
0fc03918 | 132 | a integer, b integer, c integer) RETURN integer; |
2866f9a8 JM |
133 | |
134 | FUNCTION first(M IN OUT NOCOPY mal_table, | |
135 | seq integer) RETURN integer; | |
136 | FUNCTION slice(M IN OUT NOCOPY mal_table, | |
137 | seq integer, | |
138 | idx integer, | |
139 | last integer DEFAULT NULL) RETURN integer; | |
140 | FUNCTION slice(M IN OUT NOCOPY mal_table, | |
141 | items mal_vals, | |
6a085103 | 142 | idx integer) RETURN integer; |
2866f9a8 JM |
143 | FUNCTION islice(items mal_vals, |
144 | idx integer) RETURN mal_vals; | |
145 | FUNCTION nth(M IN OUT NOCOPY mal_table, | |
0fc03918 JM |
146 | seq integer, idx integer) RETURN integer; |
147 | ||
2866f9a8 | 148 | FUNCTION count(M IN OUT NOCOPY mal_table, |
0fc03918 JM |
149 | seq integer) RETURN integer; |
150 | ||
2866f9a8 | 151 | FUNCTION atom_new(M IN OUT NOCOPY mal_table, |
0fc03918 | 152 | val integer) RETURN integer; |
2866f9a8 JM |
153 | FUNCTION atom_reset(M IN OUT NOCOPY mal_table, |
154 | atm integer, | |
155 | val integer) RETURN integer; | |
0fc03918 | 156 | |
6a085103 | 157 | -- hash-map functions |
2866f9a8 | 158 | FUNCTION assoc_BANG(M IN OUT NOCOPY mal_table, |
6a085103 JM |
159 | H IN OUT NOCOPY map_entry_table, |
160 | midx integer, | |
2866f9a8 JM |
161 | kvs mal_vals) RETURN integer; |
162 | FUNCTION dissoc_BANG(M IN OUT NOCOPY mal_table, | |
6a085103 JM |
163 | H IN OUT NOCOPY map_entry_table, |
164 | midx integer, | |
2866f9a8 JM |
165 | ks mal_vals) RETURN integer; |
166 | FUNCTION hash_map(M IN OUT NOCOPY mal_table, | |
6a085103 | 167 | H IN OUT NOCOPY map_entry_table, |
2866f9a8 | 168 | kvs mal_vals, |
6a085103 JM |
169 | meta integer DEFAULT 1) RETURN integer; |
170 | ||
0fc03918 | 171 | -- function functions |
2866f9a8 JM |
172 | FUNCTION func(M IN OUT NOCOPY mal_table, name varchar) RETURN integer; |
173 | FUNCTION malfunc(M IN OUT NOCOPY mal_table, | |
0fc03918 JM |
174 | ast integer, |
175 | params integer, | |
176 | env integer, | |
6a085103 JM |
177 | is_macro integer DEFAULT 0, |
178 | meta integer DEFAULT 1) RETURN integer; | |
0fc03918 | 179 | END types; |
7836cfa3 | 180 | / |
2866f9a8 JM |
181 | show errors; |
182 | ||
7836cfa3 | 183 | |
0fc03918 | 184 | CREATE OR REPLACE PACKAGE BODY types IS |
97df14cd | 185 | |
9fc524f1 JM |
186 | -- --------------------------------------------------------- |
187 | -- general functions | |
188 | ||
2866f9a8 | 189 | FUNCTION mem_new RETURN mal_table IS |
0fc03918 JM |
190 | BEGIN |
191 | -- initialize mal type memory pool | |
192 | -- 1 -> nil | |
193 | -- 2 -> false | |
194 | -- 3 -> true | |
2866f9a8 | 195 | RETURN mal_table(mal_T(0), mal_T(1), mal_T(2)); |
0fc03918 | 196 | END; |
9fc524f1 | 197 | |
6a085103 | 198 | FUNCTION tf(val boolean) RETURN integer IS |
9fc524f1 JM |
199 | BEGIN |
200 | IF val THEN | |
0fc03918 | 201 | RETURN 3; -- true |
9fc524f1 | 202 | ELSE |
0fc03918 | 203 | RETURN 2; -- false |
9fc524f1 JM |
204 | END IF; |
205 | END; | |
206 | ||
2866f9a8 | 207 | FUNCTION equal_Q(M IN OUT NOCOPY mal_table, |
6a085103 | 208 | H IN OUT NOCOPY map_entry_table, |
0fc03918 | 209 | a integer, b integer) RETURN boolean IS |
6a085103 JM |
210 | atyp integer; |
211 | btyp integer; | |
2866f9a8 JM |
212 | aseq mal_vals; |
213 | bseq mal_vals; | |
6a085103 JM |
214 | amidx integer; |
215 | bmidx integer; | |
216 | i integer; | |
217 | k varchar2(256); | |
9fc524f1 | 218 | BEGIN |
0fc03918 JM |
219 | atyp := M(a).type_id; |
220 | btyp := M(b).type_id; | |
221 | IF NOT (atyp = btyp OR (atyp IN (8,9) AND btyp IN (8,9))) THEN | |
9fc524f1 JM |
222 | RETURN FALSE; |
223 | END IF; | |
224 | ||
225 | CASE | |
0fc03918 | 226 | WHEN atyp IN (0,1,2) THEN |
9fc524f1 | 227 | RETURN TRUE; |
0fc03918 | 228 | WHEN atyp = 3 THEN |
2866f9a8 JM |
229 | RETURN TREAT(M(a) AS mal_int_T).val_int = |
230 | TREAT(M(b) AS mal_int_T).val_int; | |
02936b42 | 231 | WHEN atyp IN (5,6,7) THEN |
2866f9a8 JM |
232 | IF TREAT(M(a) AS mal_str_T).val_str IS NULL AND |
233 | TREAT(M(b) AS mal_str_T).val_str IS NULL THEN | |
9fc524f1 JM |
234 | RETURN TRUE; |
235 | ELSE | |
2866f9a8 JM |
236 | RETURN TREAT(M(a) AS mal_str_T).val_str = |
237 | TREAT(M(b) AS mal_str_T).val_str; | |
9fc524f1 | 238 | END IF; |
0fc03918 | 239 | WHEN atyp IN (8,9) THEN |
2866f9a8 JM |
240 | aseq := TREAT(M(a) AS mal_seq_T).val_seq; |
241 | bseq := TREAT(M(b) AS mal_seq_T).val_seq; | |
9fc524f1 JM |
242 | IF aseq.COUNT <> bseq.COUNT THEN |
243 | RETURN FALSE; | |
244 | END IF; | |
245 | FOR i IN 1..aseq.COUNT LOOP | |
6a085103 | 246 | IF NOT equal_Q(M, H, aseq(i), bseq(i)) THEN |
9fc524f1 JM |
247 | RETURN FALSE; |
248 | END IF; | |
249 | END LOOP; | |
250 | RETURN TRUE; | |
6a085103 | 251 | WHEN atyp = 10 THEN |
2866f9a8 JM |
252 | amidx := TREAT(M(a) AS mal_map_T).map_idx; |
253 | bmidx := TREAT(M(b) AS mal_map_T).map_idx; | |
6a085103 JM |
254 | IF H(amidx).COUNT() <> H(bmidx).COUNT() THEN |
255 | RETURN FALSE; | |
256 | END IF; | |
257 | ||
258 | k := H(amidx).FIRST(); | |
259 | WHILE k IS NOT NULL LOOP | |
260 | IF H(amidx)(k) IS NULL OR H(bmidx)(k) IS NULL THEN | |
261 | RETURN FALSE; | |
262 | END IF; | |
263 | IF NOT equal_Q(M, H, H(amidx)(k), H(bmidx)(k)) THEN | |
264 | RETURN FALSE; | |
265 | END IF; | |
266 | k := H(amidx).NEXT(k); | |
267 | END LOOP; | |
268 | RETURN TRUE; | |
9fc524f1 JM |
269 | ELSE |
270 | RETURN FALSE; | |
271 | END CASE; | |
272 | END; | |
97df14cd | 273 | |
2866f9a8 | 274 | FUNCTION clone(M IN OUT NOCOPY mal_table, |
6a085103 JM |
275 | H IN OUT NOCOPY map_entry_table, |
276 | obj integer, | |
277 | meta integer DEFAULT 1) RETURN integer IS | |
278 | type_id integer; | |
279 | new_hm integer; | |
280 | old_midx integer; | |
281 | new_midx integer; | |
282 | k varchar2(256); | |
2866f9a8 | 283 | malfn mal_func_T; |
6a085103 JM |
284 | BEGIN |
285 | type_id := M(obj).type_id; | |
286 | CASE | |
287 | WHEN type_id IN (8,9) THEN -- list/vector | |
288 | RETURN seq(M, type_id, | |
2866f9a8 | 289 | TREAT(M(obj) AS mal_seq_T).val_seq, |
6a085103 JM |
290 | meta); |
291 | WHEN type_id = 10 THEN -- hash-map | |
2866f9a8 JM |
292 | new_hm := types.hash_map(M, H, mal_vals(), meta); |
293 | old_midx := TREAT(M(obj) AS mal_map_T).map_idx; | |
294 | new_midx := TREAT(M(new_hm) AS mal_map_T).map_idx; | |
6a085103 JM |
295 | |
296 | k := H(old_midx).FIRST(); | |
297 | WHILE k IS NOT NULL LOOP | |
298 | H(new_midx)(k) := H(old_midx)(k); | |
299 | k := H(old_midx).NEXT(k); | |
300 | END LOOP; | |
301 | ||
302 | RETURN new_hm; | |
303 | WHEN type_id = 12 THEN -- mal function | |
2866f9a8 | 304 | malfn := TREAT(M(obj) AS mal_func_T); |
6a085103 JM |
305 | RETURN types.malfunc(M, |
306 | malfn.ast, | |
307 | malfn.params, | |
308 | malfn.env, | |
309 | malfn.is_macro, | |
310 | meta); | |
311 | ELSE | |
312 | raise_application_error(-20008, | |
313 | 'clone not supported for type ' || type_id, TRUE); | |
314 | END CASE; | |
315 | END; | |
7836cfa3 JM |
316 | |
317 | ||
318 | -- --------------------------------------------------------- | |
319 | -- scalar functions | |
320 | ||
321 | ||
2866f9a8 | 322 | FUNCTION int(M IN OUT NOCOPY mal_table, num integer) RETURN integer IS |
0fc03918 JM |
323 | BEGIN |
324 | M.EXTEND(); | |
2866f9a8 | 325 | M(M.COUNT()) := mal_int_T(3, num); |
0fc03918 JM |
326 | RETURN M.COUNT(); |
327 | END; | |
328 | ||
2866f9a8 | 329 | FUNCTION string(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS |
6a085103 JM |
330 | BEGIN |
331 | M.EXTEND(); | |
02936b42 | 332 | IF LENGTH(name) <= 4000 THEN |
2866f9a8 | 333 | M(M.COUNT()) := mal_str_T(5, name); |
02936b42 | 334 | ELSE |
2866f9a8 | 335 | M(M.COUNT()) := mal_long_str_T(6, NULL, name); |
02936b42 | 336 | END IF; |
6a085103 JM |
337 | RETURN M.COUNT(); |
338 | END; | |
339 | ||
2866f9a8 | 340 | FUNCTION string_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS |
02936b42 | 341 | str CLOB; |
6a085103 | 342 | BEGIN |
02936b42 JM |
343 | IF M(val).type_id IN (5,6) THEN |
344 | IF M(val).type_id = 5 THEN | |
2866f9a8 | 345 | str := TREAT(M(val) AS mal_str_T).val_str; |
02936b42 | 346 | ELSE |
2866f9a8 | 347 | str := TREAT(M(val) AS mal_long_str_T).val_long_str; |
02936b42 JM |
348 | END IF; |
349 | IF str IS NULL OR | |
350 | str = EMPTY_CLOB() OR | |
351 | SUBSTR(str, 1, 1) <> chr(127) THEN | |
6a085103 JM |
352 | RETURN TRUE; |
353 | ELSE | |
354 | RETURN FALSE; | |
355 | END IF; | |
356 | ELSE | |
357 | RETURN FALSE; | |
358 | END IF; | |
359 | END; | |
360 | ||
2866f9a8 | 361 | FUNCTION symbol(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS |
0fc03918 JM |
362 | BEGIN |
363 | M.EXTEND(); | |
2866f9a8 | 364 | M(M.COUNT()) := mal_str_T(7, name); |
0fc03918 JM |
365 | RETURN M.COUNT(); |
366 | END; | |
367 | ||
2866f9a8 | 368 | FUNCTION keyword(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS |
7836cfa3 | 369 | BEGIN |
0fc03918 | 370 | M.EXTEND(); |
2866f9a8 | 371 | M(M.COUNT()) := mal_str_T(5, chr(127) || name); |
0fc03918 | 372 | RETURN M.COUNT(); |
7836cfa3 JM |
373 | END; |
374 | ||
2866f9a8 | 375 | FUNCTION keyword_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS |
02936b42 | 376 | str CLOB; |
6a085103 JM |
377 | BEGIN |
378 | IF M(val).type_id = 5 THEN | |
2866f9a8 | 379 | str := TREAT(M(val) AS mal_str_T).val_str; |
6a085103 JM |
380 | IF LENGTH(str) > 0 AND SUBSTR(str, 1, 1) = chr(127) THEN |
381 | RETURN TRUE; | |
382 | ELSE | |
383 | RETURN FALSE; | |
384 | END IF; | |
385 | ELSE | |
386 | RETURN FALSE; | |
387 | END IF; | |
388 | END; | |
7836cfa3 | 389 | |
aa42fdce JM |
390 | FUNCTION number_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS |
391 | str CLOB; | |
392 | BEGIN | |
393 | IF M(val).type_id IN (3,4) THEN | |
394 | RETURN TRUE; | |
395 | ELSE | |
396 | RETURN FALSE; | |
397 | END IF; | |
398 | END; | |
399 | ||
400 | FUNCTION function_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS | |
401 | str CLOB; | |
402 | BEGIN | |
403 | IF M(val).type_id = 11 THEN | |
404 | RETURN TRUE; | |
405 | ELSIF M(val).type_id = 12 THEN | |
406 | RETURN TREAT(M(val) AS mal_func_T).is_macro = 0; | |
407 | ELSE | |
408 | RETURN FALSE; | |
409 | END IF; | |
410 | END; | |
411 | ||
412 | FUNCTION macro_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS | |
413 | str CLOB; | |
414 | BEGIN | |
415 | IF M(val).type_id = 12 THEN | |
416 | RETURN TREAT(M(val) AS mal_func_T).is_macro > 0; | |
417 | ELSE | |
418 | RETURN FALSE; | |
419 | END IF; | |
420 | END; | |
421 | ||
0fc03918 | 422 | |
7836cfa3 JM |
423 | -- --------------------------------------------------------- |
424 | -- sequence functions | |
97df14cd | 425 | |
2866f9a8 | 426 | FUNCTION seq(M IN OUT NOCOPY mal_table, |
6a085103 | 427 | type_id integer, |
2866f9a8 | 428 | items mal_vals, |
6a085103 | 429 | meta integer DEFAULT 1) RETURN integer IS |
97df14cd | 430 | BEGIN |
0fc03918 | 431 | M.EXTEND(); |
2866f9a8 | 432 | M(M.COUNT()) := mal_seq_T(type_id, items, meta); |
0fc03918 | 433 | RETURN M.COUNT(); |
97df14cd JM |
434 | END; |
435 | ||
0fc03918 JM |
436 | -- list: |
437 | -- return a mal list | |
2866f9a8 | 438 | FUNCTION list(M IN OUT NOCOPY mal_table) RETURN integer IS |
97df14cd | 439 | BEGIN |
0fc03918 | 440 | M.EXTEND(); |
2866f9a8 | 441 | M(M.COUNT()) := mal_seq_T(8, mal_vals(), 1); |
0fc03918 | 442 | RETURN M.COUNT(); |
97df14cd JM |
443 | END; |
444 | ||
2866f9a8 | 445 | FUNCTION list(M IN OUT NOCOPY mal_table, |
0fc03918 | 446 | a integer) RETURN integer IS |
97df14cd | 447 | BEGIN |
0fc03918 | 448 | M.EXTEND(); |
2866f9a8 | 449 | M(M.COUNT()) := mal_seq_T(8, mal_vals(a), 1); |
0fc03918 | 450 | RETURN M.COUNT(); |
97df14cd JM |
451 | END; |
452 | ||
2866f9a8 | 453 | FUNCTION list(M IN OUT NOCOPY mal_table, |
0fc03918 | 454 | a integer, b integer) RETURN integer IS |
97df14cd | 455 | BEGIN |
0fc03918 | 456 | M.EXTEND(); |
2866f9a8 | 457 | M(M.COUNT()) := mal_seq_T(8, mal_vals(a, b), 1); |
0fc03918 | 458 | RETURN M.COUNT(); |
97df14cd JM |
459 | END; |
460 | ||
2866f9a8 | 461 | FUNCTION list(M IN OUT NOCOPY mal_table, |
0fc03918 | 462 | a integer, b integer, c integer) RETURN integer IS |
9fc524f1 | 463 | BEGIN |
0fc03918 | 464 | M.EXTEND(); |
2866f9a8 | 465 | M(M.COUNT()) := mal_seq_T(8, mal_vals(a, b, c), 1); |
0fc03918 | 466 | RETURN M.COUNT(); |
9fc524f1 JM |
467 | END; |
468 | ||
2866f9a8 | 469 | FUNCTION first(M IN OUT NOCOPY mal_table, |
0fc03918 | 470 | seq integer) RETURN integer IS |
7836cfa3 | 471 | BEGIN |
2866f9a8 | 472 | RETURN TREAT(M(seq) AS mal_seq_T).val_seq(1); |
7836cfa3 JM |
473 | END; |
474 | ||
2866f9a8 | 475 | FUNCTION slice(M IN OUT NOCOPY mal_table, |
0fc03918 JM |
476 | seq integer, |
477 | idx integer, | |
478 | last integer DEFAULT NULL) RETURN integer IS | |
2866f9a8 JM |
479 | old_items mal_vals; |
480 | new_items mal_vals; | |
7836cfa3 | 481 | i integer; |
0fc03918 | 482 | final_idx integer; |
7836cfa3 | 483 | BEGIN |
2866f9a8 JM |
484 | old_items := TREAT(M(seq) AS mal_seq_T).val_seq; |
485 | new_items := mal_vals(); | |
0fc03918 JM |
486 | IF last IS NULL THEN |
487 | final_idx := old_items.COUNT(); | |
488 | ELSE | |
489 | final_idx := last + 1; | |
490 | END IF; | |
10cc781f JM |
491 | IF final_idx > idx THEN |
492 | new_items.EXTEND(final_idx - idx); | |
493 | FOR i IN idx+1..final_idx LOOP | |
494 | new_items(i-idx) := old_items(i); | |
495 | END LOOP; | |
496 | END IF; | |
0fc03918 | 497 | M.EXTEND(); |
2866f9a8 | 498 | M(M.COUNT()) := mal_seq_T(8, new_items, 1); |
0fc03918 | 499 | RETURN M.COUNT(); |
7836cfa3 JM |
500 | END; |
501 | ||
2866f9a8 JM |
502 | FUNCTION slice(M IN OUT NOCOPY mal_table, |
503 | items mal_vals, | |
6a085103 | 504 | idx integer) RETURN integer IS |
2866f9a8 | 505 | new_items mal_vals; |
6a085103 JM |
506 | BEGIN |
507 | new_items := islice(items, idx); | |
508 | M.EXTEND(); | |
2866f9a8 | 509 | M(M.COUNT()) := mal_seq_T(8, new_items, 1); |
6a085103 JM |
510 | RETURN M.COUNT(); |
511 | END; | |
512 | ||
2866f9a8 JM |
513 | FUNCTION islice(items mal_vals, |
514 | idx integer) RETURN mal_vals IS | |
515 | new_items mal_vals; | |
9fc524f1 JM |
516 | i integer; |
517 | BEGIN | |
2866f9a8 | 518 | new_items := mal_vals(); |
10cc781f JM |
519 | IF items.COUNT > idx THEN |
520 | new_items.EXTEND(items.COUNT - idx); | |
521 | FOR i IN idx+1..items.COUNT LOOP | |
522 | new_items(i-idx) := items(i); | |
523 | END LOOP; | |
524 | END IF; | |
6a085103 | 525 | RETURN new_items; |
9fc524f1 JM |
526 | END; |
527 | ||
6a085103 | 528 | |
2866f9a8 | 529 | FUNCTION nth(M IN OUT NOCOPY mal_table, |
0fc03918 | 530 | seq integer, idx integer) RETURN integer IS |
7836cfa3 | 531 | BEGIN |
2866f9a8 | 532 | RETURN TREAT(M(seq) AS mal_seq_T).val_seq(idx+1); |
7836cfa3 | 533 | END; |
97df14cd | 534 | |
2866f9a8 | 535 | FUNCTION count(M IN OUT NOCOPY mal_table, |
0fc03918 | 536 | seq integer) RETURN integer IS |
9fc524f1 | 537 | BEGIN |
2866f9a8 | 538 | RETURN TREAT(M(seq) AS mal_seq_T).val_seq.COUNT; |
9fc524f1 JM |
539 | END; |
540 | ||
6a085103 JM |
541 | -- --------------------------------------------------------- |
542 | -- hash-map functions | |
543 | ||
2866f9a8 | 544 | FUNCTION assoc_BANG(M IN OUT NOCOPY mal_table, |
6a085103 JM |
545 | H IN OUT NOCOPY map_entry_table, |
546 | midx integer, | |
2866f9a8 | 547 | kvs mal_vals) RETURN integer IS |
6a085103 JM |
548 | i integer; |
549 | BEGIN | |
550 | IF MOD(kvs.COUNT(), 2) = 1 THEN | |
551 | raise_application_error(-20007, | |
552 | 'odd number of arguments to assoc', TRUE); | |
553 | END IF; | |
554 | ||
555 | i := 1; | |
556 | WHILE i <= kvs.COUNT() LOOP | |
2866f9a8 | 557 | H(midx)(TREAT(M(kvs(i)) AS mal_str_T).val_str) := kvs(i+1); |
6a085103 JM |
558 | i := i + 2; |
559 | END LOOP; | |
560 | RETURN midx; | |
561 | END; | |
562 | ||
2866f9a8 | 563 | FUNCTION dissoc_BANG(M IN OUT NOCOPY mal_table, |
6a085103 JM |
564 | H IN OUT NOCOPY map_entry_table, |
565 | midx integer, | |
2866f9a8 | 566 | ks mal_vals) RETURN integer IS |
6a085103 JM |
567 | i integer; |
568 | BEGIN | |
569 | FOR i IN 1..ks.COUNT() LOOP | |
2866f9a8 | 570 | H(midx).DELETE(TREAT(M(ks(i)) AS mal_str_T).val_str); |
6a085103 JM |
571 | END LOOP; |
572 | RETURN midx; | |
573 | END; | |
574 | ||
2866f9a8 | 575 | FUNCTION hash_map(M IN OUT NOCOPY mal_table, |
6a085103 | 576 | H IN OUT NOCOPY map_entry_table, |
2866f9a8 | 577 | kvs mal_vals, |
6a085103 JM |
578 | meta integer DEFAULT 1) RETURN integer IS |
579 | midx integer; | |
580 | BEGIN | |
581 | H.EXTEND(); | |
582 | midx := H.COUNT(); | |
583 | midx := assoc_BANG(M, H, midx, kvs); | |
584 | ||
585 | M.EXTEND(); | |
2866f9a8 | 586 | M(M.COUNT()) := mal_map_T(10, midx, meta); |
6a085103 JM |
587 | RETURN M.COUNT(); |
588 | END; | |
0fc03918 JM |
589 | |
590 | ||
591 | -- --------------------------------------------------------- | |
592 | -- function functions | |
593 | ||
2866f9a8 | 594 | FUNCTION func(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS |
0fc03918 JM |
595 | BEGIN |
596 | M.EXTEND(); | |
2866f9a8 | 597 | M(M.COUNT()) := mal_str_T(11, name); |
0fc03918 JM |
598 | RETURN M.COUNT(); |
599 | END; | |
600 | ||
2866f9a8 | 601 | FUNCTION malfunc(M IN OUT NOCOPY mal_table, |
0fc03918 JM |
602 | ast integer, |
603 | params integer, | |
604 | env integer, | |
6a085103 JM |
605 | is_macro integer DEFAULT 0, |
606 | meta integer DEFAULT 1) RETURN integer IS | |
0fc03918 JM |
607 | BEGIN |
608 | M.EXTEND(); | |
2866f9a8 | 609 | M(M.COUNT()) := mal_func_T(12, ast, params, env, is_macro, meta); |
0fc03918 JM |
610 | RETURN M.COUNT(); |
611 | END; | |
612 | ||
06951f55 JM |
613 | |
614 | -- --------------------------------------------------------- | |
615 | -- atom functions | |
616 | ||
2866f9a8 | 617 | FUNCTION atom_new(M IN OUT NOCOPY mal_table, |
0fc03918 | 618 | val integer) RETURN integer IS |
06951f55 JM |
619 | aidx integer; |
620 | BEGIN | |
0fc03918 | 621 | M.EXTEND(); |
2866f9a8 | 622 | M(M.COUNT()) := mal_atom_T(13, val); |
0fc03918 | 623 | RETURN M.COUNT(); |
06951f55 JM |
624 | END; |
625 | ||
2866f9a8 JM |
626 | FUNCTION atom_reset(M IN OUT NOCOPY mal_table, |
627 | atm integer, | |
628 | val integer) RETURN integer IS | |
629 | BEGIN | |
630 | M(atm) := mal_atom_T(13, val); | |
631 | RETURN val; | |
632 | END; | |
633 | ||
634 | ||
06951f55 | 635 | |
0fc03918 | 636 | END types; |
7836cfa3 JM |
637 | / |
638 | show errors; |