Commit | Line | Data |
---|---|---|
97df14cd JM |
1 | -- --------------------------------------------------------- |
2 | -- printer.sql | |
3 | ||
0fc03918 | 4 | CREATE OR REPLACE PACKAGE printer IS |
2866f9a8 | 5 | FUNCTION pr_str_seq(M IN OUT NOCOPY types.mal_table, |
6a085103 | 6 | H IN OUT NOCOPY types.map_entry_table, |
2866f9a8 | 7 | seq mal_vals, sep varchar2, |
06951f55 | 8 | print_readably boolean DEFAULT TRUE) RETURN varchar; |
2866f9a8 | 9 | FUNCTION pr_str(M IN OUT NOCOPY types.mal_table, |
6a085103 | 10 | H IN OUT NOCOPY types.map_entry_table, |
0fc03918 JM |
11 | ast integer, |
12 | print_readably boolean DEFAULT TRUE) RETURN varchar; | |
13 | END printer; | |
97df14cd | 14 | / |
2866f9a8 | 15 | show errors; |
97df14cd | 16 | |
0fc03918 | 17 | CREATE OR REPLACE PACKAGE BODY printer AS |
97df14cd | 18 | |
2866f9a8 | 19 | FUNCTION pr_str_seq(M IN OUT NOCOPY types.mal_table, |
6a085103 | 20 | H IN OUT NOCOPY types.map_entry_table, |
2866f9a8 | 21 | seq mal_vals, sep varchar2, |
06951f55 | 22 | print_readably boolean DEFAULT TRUE) RETURN varchar IS |
9fc524f1 | 23 | first integer := 1; |
02936b42 | 24 | str CLOB; |
9fc524f1 JM |
25 | BEGIN |
26 | FOR i IN 1..seq.COUNT LOOP | |
27 | IF first = 1 THEN | |
28 | first := 0; | |
29 | ELSE | |
30 | str := str || sep; | |
31 | END IF; | |
6a085103 | 32 | str := str || pr_str(M, H, seq(i), print_readably); |
9fc524f1 JM |
33 | END LOOP; |
34 | RETURN str; | |
35 | END; | |
36 | ||
2866f9a8 | 37 | FUNCTION pr_str_map(M IN OUT NOCOPY types.mal_table, |
6a085103 JM |
38 | H IN OUT NOCOPY types.map_entry_table, |
39 | midx integer, sep varchar2, | |
40 | print_readably boolean DEFAULT TRUE) RETURN varchar IS | |
41 | key varchar2(256); | |
42 | first integer := 1; | |
02936b42 | 43 | str CLOB; |
6a085103 JM |
44 | BEGIN |
45 | key := H(midx).FIRST(); | |
46 | WHILE key IS NOT NULL LOOP | |
47 | IF first = 1 THEN | |
48 | first := 0; | |
49 | ELSE | |
50 | str := str || sep; | |
51 | END IF; | |
52 | str := str || pr_str(M, H, types.string(M, key), print_readably); | |
53 | str := str || ' ' || pr_str(M, H, H(midx)(key), print_readably); | |
54 | key := H(midx).NEXT(key); | |
55 | END LOOP; | |
56 | RETURN str; | |
57 | END; | |
58 | ||
59 | ||
2866f9a8 | 60 | FUNCTION pr_str(M IN OUT NOCOPY types.mal_table, |
6a085103 | 61 | H IN OUT NOCOPY types.map_entry_table, |
0fc03918 | 62 | ast integer, |
06951f55 | 63 | print_readably boolean DEFAULT TRUE) RETURN varchar IS |
97df14cd JM |
64 | type_id integer; |
65 | first integer := 1; | |
66 | i integer; | |
02936b42 | 67 | str CLOB; |
2866f9a8 | 68 | malfn mal_func_T; |
97df14cd | 69 | BEGIN |
0fc03918 | 70 | type_id := M(ast).type_id; |
2866f9a8 | 71 | -- io.writeline('pr_str type: ' || type_id); |
97df14cd JM |
72 | CASE |
73 | WHEN type_id = 0 THEN RETURN 'nil'; | |
74 | WHEN type_id = 1 THEN RETURN 'false'; | |
75 | WHEN type_id = 2 THEN RETURN 'true'; | |
76 | WHEN type_id = 3 THEN -- integer | |
2866f9a8 | 77 | RETURN CAST(TREAT(M(ast) AS mal_int_T).val_int as varchar); |
02936b42 JM |
78 | WHEN type_id IN (5,6) THEN -- string |
79 | IF type_id = 5 THEN | |
2866f9a8 | 80 | str := TREAT(M(ast) as mal_str_T).val_str; |
02936b42 | 81 | ELSE |
2866f9a8 | 82 | str := TREAT(M(ast) as mal_long_str_T).val_long_str; |
02936b42 | 83 | END IF; |
9fc524f1 JM |
84 | IF chr(127) = SUBSTR(str, 1, 1) THEN |
85 | RETURN ':' || SUBSTR(str, 2, LENGTH(str)-1); | |
86 | ELSIF print_readably THEN | |
87 | str := REPLACE(str, chr(92), '\\'); | |
88 | str := REPLACE(str, '"', '\"'); | |
89 | str := REPLACE(str, chr(10), '\n'); | |
90 | RETURN '"' || str || '"'; | |
91 | ELSE | |
92 | RETURN str; | |
93 | END IF; | |
2866f9a8 | 94 | RETURN TREAT(M(ast) AS mal_str_T).val_str; |
97df14cd | 95 | WHEN type_id = 7 THEN -- symbol |
2866f9a8 | 96 | RETURN TREAT(M(ast) AS mal_str_T).val_str; |
97df14cd | 97 | WHEN type_id = 8 THEN -- list |
6a085103 | 98 | RETURN '(' || pr_str_seq(M, H, |
2866f9a8 | 99 | TREAT(M(ast) AS mal_seq_T).val_seq, ' ', |
9fc524f1 | 100 | print_readably) || ')'; |
6a085103 JM |
101 | WHEN type_id = 9 THEN -- vector |
102 | RETURN '[' || pr_str_seq(M, H, | |
2866f9a8 | 103 | TREAT(M(ast) AS mal_seq_T).val_seq, ' ', |
6a085103 JM |
104 | print_readably) || ']'; |
105 | WHEN type_id = 10 THEN -- hash-map | |
106 | RETURN '{' || pr_str_map(M, H, | |
2866f9a8 | 107 | TREAT(M(ast) AS mal_map_T).map_idx, ' ', |
6a085103 | 108 | print_readably) || '}'; |
7836cfa3 JM |
109 | WHEN type_id = 11 THEN -- native function |
110 | RETURN '#<function ' || | |
2866f9a8 | 111 | TREAT(M(ast) AS mal_str_T).val_str || |
7836cfa3 | 112 | '>'; |
9fc524f1 | 113 | WHEN type_id = 12 THEN -- mal function |
2866f9a8 | 114 | malfn := TREAT(M(ast) AS mal_func_T); |
6a085103 JM |
115 | RETURN '(fn* ' || pr_str(M, H, malfn.params, print_readably) || |
116 | ' ' || pr_str(M, H, malfn.ast, print_readably) || ')'; | |
06951f55 | 117 | WHEN type_id = 13 THEN -- atom |
0fc03918 | 118 | RETURN '(atom ' || |
2866f9a8 | 119 | pr_str(M, H, TREAT(M(ast) AS mal_atom_T).val, print_readably) || |
0fc03918 | 120 | ')'; |
97df14cd JM |
121 | ELSE |
122 | RETURN 'unknown'; | |
123 | END CASE; | |
124 | END; | |
125 | ||
0fc03918 | 126 | END printer; |
97df14cd JM |
127 | / |
128 | show errors; |