%include "CONSTS" %include "FORMS" %include "SEG7" %include "PROCS" %record(sdfm) %map NEW SD (%record(sdfm)%name skeleton, %integer strm) %record(sdfm) %name x %system %integer %spec n streams; ! Set up by linker... %integer j, size size = 512 size = 128 %if skeleton_type = char type; ! shorter buffer j = 0 %cycle; ! Hunt for spare descriptor+buffer j = j + 1 %signal 2, 1, 0 %if j > addr(n streams); ! none free x == S7_sb(j)_sd %if x_refs = 0 %start; ! Found one x = skeleton; ! Copy existing fields x_refs = 1 x_buffad = addr(S7_sb(j)_bf(0)) x_ebp = x_buffad + size %if strm < 0 %start; ! Input stream x_buffp = x_ebp; ! Make read necessary %else x_buffp = x_buffad; ! Empty buffer set EOT (x_buffad) %if size = 512;! Fill disk block with EOT %finish %result == x %finish %repeat %end %external %routine XOPEN %alias "IO$OPEN" %c (%string(*) %name file, %integer strm) ! strm < 0 for input stream, > 0 for output (Streams 0 already open) %record(sdfm) t %record(sdfm) %name sd, t2 %record(sdfm) %name %array %name da %integer dser, j, sno da == S7_out strm; sno = strm da == S7_in strm %and sno = -sno %if sno < 0 %if parse (file, t) %start ! Some fields of t filled in... %if t_type = char type %start; ! Look for open device stream dser = t_ser %for j = 0, 1, max streams %cycle sd == da(j); %continue %if sd == null %if sd_type = char type %and sd_ser = dser %start sd_refs = sd_refs + 1 -> got it %finish %repeat %else %if t_type = null type sd == null -> got it %finish sd == new sd (t, strm); ! Find free buffer.. got it: da(sno) == sd; ! Point stream descr. at it %else %signal 9, 3, bad file; ! Could not parse name %finish %end %end %of %file