2016-03-31 21:29:47 -05:00
|
|
|
@io.sql
|
|
|
|
|
@types.sql
|
|
|
|
|
@reader.sql
|
|
|
|
|
@printer.sql
|
|
|
|
|
|
2016-04-07 01:22:15 -05:00
|
|
|
CREATE OR REPLACE PACKAGE mal IS
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-29 00:11:59 -05:00
|
|
|
FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-07 01:22:15 -05:00
|
|
|
END mal;
|
2016-03-31 21:29:47 -05:00
|
|
|
/
|
|
|
|
|
|
2016-04-07 01:22:15 -05:00
|
|
|
CREATE OR REPLACE PACKAGE BODY mal IS
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-29 00:11:59 -05:00
|
|
|
FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer IS
|
2016-05-03 23:25:41 -05:00
|
|
|
M types.mal_table; -- general mal value memory pool
|
2016-05-02 23:56:48 -05:00
|
|
|
H types.map_entry_table; -- hashmap memory pool
|
2016-05-03 00:28:33 -05:00
|
|
|
line CLOB;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-04 23:37:52 -05:00
|
|
|
-- read
|
2016-04-07 01:22:15 -05:00
|
|
|
FUNCTION READ(line varchar) RETURN integer IS
|
2016-04-04 23:37:52 -05:00
|
|
|
BEGIN
|
2016-05-02 23:56:48 -05:00
|
|
|
RETURN reader.read_str(M, H, line);
|
2016-04-04 23:37:52 -05:00
|
|
|
END;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-04 23:37:52 -05:00
|
|
|
-- eval
|
2016-04-07 01:22:15 -05:00
|
|
|
FUNCTION EVAL(ast integer, env varchar) RETURN integer IS
|
2016-04-04 23:37:52 -05:00
|
|
|
BEGIN
|
|
|
|
|
RETURN ast;
|
|
|
|
|
END;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
2016-04-04 23:37:52 -05:00
|
|
|
-- print
|
2016-04-07 01:22:15 -05:00
|
|
|
FUNCTION PRINT(exp integer) RETURN varchar IS
|
2016-04-04 23:37:52 -05:00
|
|
|
BEGIN
|
2016-05-02 23:56:48 -05:00
|
|
|
RETURN printer.pr_str(M, H, exp);
|
2016-04-04 23:37:52 -05:00
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
-- repl
|
|
|
|
|
FUNCTION REP(line varchar) RETURN varchar IS
|
|
|
|
|
BEGIN
|
|
|
|
|
RETURN PRINT(EVAL(READ(line), ''));
|
|
|
|
|
END;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
|
|
|
|
BEGIN
|
2016-05-02 23:56:48 -05:00
|
|
|
-- initialize memory pools
|
2016-04-07 01:22:15 -05:00
|
|
|
M := types.mem_new();
|
2016-05-02 23:56:48 -05:00
|
|
|
H := types.map_entry_table();
|
2016-04-07 01:22:15 -05:00
|
|
|
|
2016-04-05 01:29:14 -05:00
|
|
|
WHILE true LOOP
|
2016-03-31 21:29:47 -05:00
|
|
|
BEGIN
|
2016-05-03 00:28:33 -05:00
|
|
|
line := io.readline('user> ', 0);
|
|
|
|
|
IF line = EMPTY_CLOB() THEN CONTINUE; END IF;
|
2016-03-31 21:29:47 -05:00
|
|
|
IF line IS NOT NULL THEN
|
2016-05-03 00:28:33 -05:00
|
|
|
io.writeline(REP(line));
|
2016-03-31 21:29:47 -05:00
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
EXCEPTION WHEN OTHERS THEN
|
2016-05-03 22:29:07 -05:00
|
|
|
IF SQLCODE = -20001 THEN -- io read stream closed
|
2016-05-03 23:25:41 -05:00
|
|
|
io.writeline('closing stream 1');
|
2016-05-03 22:29:07 -05:00
|
|
|
io.close(1); -- close output stream
|
2016-03-31 21:29:47 -05:00
|
|
|
RETURN 0;
|
|
|
|
|
END IF;
|
2016-05-03 00:28:33 -05:00
|
|
|
io.writeline('Error: ' || SQLERRM);
|
|
|
|
|
io.writeline(dbms_utility.format_error_backtrace);
|
2016-03-31 21:29:47 -05:00
|
|
|
END;
|
|
|
|
|
END LOOP;
|
|
|
|
|
END;
|
2016-04-04 23:37:52 -05:00
|
|
|
|
2016-04-07 01:22:15 -05:00
|
|
|
END mal;
|
2016-03-31 21:29:47 -05:00
|
|
|
/
|
2016-04-04 23:37:52 -05:00
|
|
|
show errors;
|
2016-03-31 21:29:47 -05:00
|
|
|
|
|
|
|
|
quit;
|