/** * Support for implementing and invoking tools that have multiple * inputs and outputs. * * @author Martin Bravenboer */ module dryad/lib-ext/xtc/multi-options imports dryad/lib-ext/multi-options strategies /** * Wraps a strategy into a command-line tool that allows a list of * inputs and outputs. * * @param s List(FILE) -> List(FILE) */ xtc-multi-io-wrap(s) = xtc-multi-io-wrap(fail, s) xtc-multi-io-wrap(extra-opts, s) = xtc-multi-io-wrap(extra-opts, system-usage, system-about, s) xtc-multi-io-wrap(extra-opts, usage, about, s) = option-wrap(extra-opts <+ multi-io-options, usage, about, id, xtc-multi-io(s)) strategies /** * Transform a list of files with an external process. * * @type List(FILE) -> List(FILE) */ xtc-multi-transform(|tool) = xtc-multi-transform(|tool, []) xtc-multi-transform(|tool, args) : fs -> <map(!FILE(<id>))> out-names where <map(?FILE(<id>))> fs => in-names ; <map(xtc-new-file)> fs => out-names ; <flatten-list> [args, "-i", in-names, "-o", out-names] ; xtc-command(!tool) xtc-multi-transform(|tool, args) : [stdin()] -> FILE(g) where xtc-new-file => g ; <conc> (args, ["-o", g]) ; xtc-command(!tool) /** * Strategies that support multi-io-wrap and xtc-multi-io-wrap. */ strategies xtc-multi-io(s) = xtc-multi-input(xtc-multi-output(s)) strategies xtc-multi-output(s) = abstract-multi-output( s , {file, t: ?(file, t) ; if <?FILE(_) + stdin()> t then <copy-to(!file)> t else single-output-to-file end } , {stream, t: ?(stream, t) ; if <?FILE(_) + stdin()> t then <xtc-copy-to-stream(|stream)> t else single-output-to-stream end } ) xtc-copy-to-stream(|stream) = ?FILE(f) ; <open> f => fdin ; <fflush> stream ; <fileno> stream => fdout ; <fdcopy> (fdin, fdout) xtc-multi-input(s) = xtc-temp-files( ( <get-config> "--multi-input"; map(!FILE(<id>)) <+ ![stdin()] ) ; s <+ prim("SSL_stacktrace_get_all_frame_names") ; report-failure(xtc-exit) ) signature constructors FILE : String -> FILE