needs lib/struct lib/psrs lib/time lib/diag io/log unit mem/logroll struct LogRollItem { uint ts ; *LogEvent event ; [void,0] args ; } struct LogRoll { uint maxargs rowcnt logcnt ; [void,0] buf( ; } : rowsz ( lr -- n ) maxargs 4* 8+ ; : bufsz ( lr -- n ) bi rowcnt | rowsz * ; : newlogroll ( rowcnt maxargs -- lr ) 0 rot> 3 n,@ dup bufsz allot ; : idx>item ( idx lr -- lri A=lr ) A! rowcnt mod A> rowsz * A> buf( + ; : actualnargs ( event lr -- ) maxargs swap nargs min ; : logroll ( ... logevent lr -- ... logevent ) doto logcnt dup 1+ | ( ... event olcnt A=lr ) A> idx>item over A> actualnargs ( ... event a nargs ) now rot !+ ( ... event nargs a+4 ) >A 1+ ps[] A> swap move ; : .logroll ( n lr -- ) r! rowcnt min V1 logcnt tuck swap- max0 ( maxidx idx V1=lr ) do i V1 idx>item dup ts .time spc> ( lri V1=lr ) dup event LogEvent.name stype spc> dup args swap event V1 actualnargs spit[] nl> loop rdrop ;