Commit | Line | Data |
---|---|---|
adc5b4fb JM |
1 | -- --------------------------------------------------------- |
2 | -- printer.sql | |
3 | ||
494792ab JM |
4 | CREATE SCHEMA printer; |
5 | ||
6 | CREATE FUNCTION printer.pr_str_array(arr integer[], | |
7 | sep varchar, print_readably boolean) | |
5340418b JM |
8 | RETURNS varchar AS $$ |
9 | DECLARE | |
10 | i integer; | |
11 | res varchar[]; | |
12 | BEGIN | |
13 | IF array_length(arr, 1) > 0 THEN | |
14 | FOR i IN array_lower(arr, 1) .. array_upper(arr, 1) | |
15 | LOOP | |
494792ab | 16 | res := array_append(res, printer.pr_str(arr[i], print_readably)); |
5340418b JM |
17 | END LOOP; |
18 | RETURN array_to_string(res, sep); | |
19 | ELSE | |
20 | RETURN ''; | |
21 | END IF; | |
22 | END; $$ LANGUAGE plpgsql; | |
23 | ||
494792ab JM |
24 | CREATE FUNCTION printer.pr_str(ast integer, |
25 | print_readably boolean DEFAULT true) | |
5340418b | 26 | RETURNS varchar AS $$ |
adc5b4fb | 27 | DECLARE |
adc5b4fb | 28 | type integer; |
b642c0db JM |
29 | seq integer[]; |
30 | hash hstore; | |
adc5b4fb JM |
31 | cid integer; |
32 | vid integer; | |
5340418b JM |
33 | pid integer; |
34 | str varchar; | |
adc5b4fb JM |
35 | BEGIN |
36 | -- RAISE NOTICE 'pr_str ast: %', ast; | |
494792ab | 37 | SELECT type_id FROM types.value WHERE value_id = ast INTO type; |
adc5b4fb JM |
38 | -- RAISE NOTICE 'pr_str type: %', type; |
39 | CASE | |
40 | WHEN type = 0 THEN RETURN 'nil'; | |
41 | WHEN type = 1 THEN RETURN 'false'; | |
42 | WHEN type = 2 THEN RETURN 'true'; | |
5340418b | 43 | WHEN type = 3 THEN -- integer |
adc5b4fb | 44 | RETURN CAST((SELECT val_int |
494792ab | 45 | FROM types.value WHERE value_id = ast) as varchar); |
5340418b | 46 | WHEN type = 5 THEN -- string |
494792ab | 47 | str := types._valueToString(ast); |
08e44c41 | 48 | IF chr(CAST(x'7f' AS integer)) = substring(str FROM 1 FOR 1) THEN |
53105a77 JM |
49 | RETURN ':' || substring(str FROM 2 FOR (char_length(str)-1)); |
50 | ELSIF print_readably THEN | |
5340418b JM |
51 | str := replace(str, E'\\', '\\'); |
52 | str := replace(str, '"', '\"'); | |
53 | str := replace(str, E'\n', '\n'); | |
54 | RETURN '"' || str || '"'; | |
55 | ELSE | |
56 | RETURN str; | |
57 | END IF; | |
58 | WHEN type = 7 THEN -- symbol | |
494792ab | 59 | RETURN types._valueToString(ast); |
5340418b | 60 | WHEN type = 8 THEN -- list |
adc5b4fb | 61 | BEGIN |
494792ab | 62 | SELECT val_seq INTO seq FROM types.value WHERE value_id = ast; |
adc5b4fb JM |
63 | RETURN '(' || |
64 | array_to_string(array( | |
494792ab | 65 | SELECT printer.pr_str(x, print_readably) |
b642c0db | 66 | FROM unnest(seq) AS x), ' ') || |
adc5b4fb JM |
67 | ')'; |
68 | END; | |
5340418b | 69 | WHEN type = 9 THEN -- vector |
adc5b4fb | 70 | BEGIN |
494792ab | 71 | SELECT val_seq INTO seq FROM types.value WHERE value_id = ast; |
adc5b4fb JM |
72 | RETURN '[' || |
73 | array_to_string(array( | |
494792ab | 74 | SELECT printer.pr_str(x, print_readably) |
b642c0db | 75 | FROM unnest(seq) AS x), ' ') || |
adc5b4fb JM |
76 | ']'; |
77 | END; | |
53105a77 JM |
78 | WHEN type = 10 THEN -- hash-map |
79 | BEGIN | |
494792ab | 80 | SELECT val_hash INTO hash FROM types.value WHERE value_id = ast; |
53105a77 JM |
81 | RETURN '{' || |
82 | array_to_string(array( | |
494792ab JM |
83 | SELECT printer.pr_str(CAST(key AS integer), |
84 | print_readably) || ' ' || | |
85 | printer.pr_str(CAST(value AS integer), | |
86 | print_readably) | |
b642c0db | 87 | FROM each(hash)), ' ') || |
53105a77 JM |
88 | '}'; |
89 | END; | |
5340418b JM |
90 | WHEN type = 11 THEN -- native function |
91 | RETURN '#<function ' || | |
494792ab | 92 | (SELECT val_string FROM types.value WHERE value_id = ast) || |
5340418b JM |
93 | '>'; |
94 | WHEN type = 12 THEN -- mal function | |
adc5b4fb | 95 | BEGIN |
b642c0db JM |
96 | SELECT ast_id, params_id |
97 | INTO vid, pid | |
494792ab JM |
98 | FROM types.value WHERE value_id = ast; |
99 | RETURN '(fn* ' || printer.pr_str(pid, print_readably) || | |
100 | ' ' || printer.pr_str(vid, print_readably) || ')'; | |
5340418b JM |
101 | END; |
102 | WHEN type = 13 THEN -- atom | |
103 | BEGIN | |
b642c0db | 104 | SELECT val_seq[1] INTO vid |
494792ab JM |
105 | FROM types.value WHERE value_id = ast; |
106 | RETURN '(atom ' || printer.pr_str(vid, print_readably) || ')'; | |
adc5b4fb JM |
107 | END; |
108 | ELSE | |
109 | RETURN 'unknown'; | |
110 | END CASE; | |
111 | END; $$ LANGUAGE plpgsql; |