Graphviz code: fslist.pal
From PROSE Programming Language - Wiki
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% fslist.pal
% Author: Mark R. Bannister
% Date: 05/Oct/2016
% Modified 20/Apr/2017 for graphviz demo
%
% Creates the system function tools.fslist() for listing all files
% underneath a filesystem object
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
~Module
EQUS {[sys.tools]}
._init
func/def [fslist], &[.list], NULL, [psPointer], [start_node]
local/rtn
.list
stack/lock
var/addr PUSH, [start_node]
attr/addr PUSH, PULL, [psPointer]
reg/jmpeq &[.invalid], PEEK, NULL
class/test PEEK, [psFileHook], [psFile]
reg/jmpeq &[.notfs], SFLG, #0
reg/load P14, ![.prose.sys.io]
attr/load P15, [psStreamOut], P13, [psFilePath]
% -------------------------------------------
%attr/direct P14, P15, PEEK, P13
%attr/add P14, P15, [\n]
%obj/dump PEEK
func/bcall NULL, [tools.gv_add_node], PEEK
% -------------------------------------------
reg/load PUSH, (PULL)
reg/jmpeq &[.rtn], PEEK, NULL
.loop
reg/load P0, (PEEK)
reg/jmpeq &[.loop_next], P0, NULL
% -------------------------------------------
%attr/direct P14, P15, P0, P13
%attr/add P14, P15, [\n]
%obj/dump P0
func/bcall NULL, [tools.gv_add_node], P0
% -------------------------------------------
reg/load P1, (P0)
reg/jmpeq &[.loop], P1, NULL
stack/push P1
local/jmp &[.loop]
.loop_next
reg/clr PULL
reg/jmpne &[.loop], PEEK, LOCK
stack/unlock
.rtn
func/rtn
.invalid
error/now ![.prose.error.sys.BadAddress],
[Pointer argument contained invalid object address]
.notfs
error/now ![.prose.error.sys.InvalidArgument],
[Pointer argument did not point to a filesystem object]