80 lines · 2.6 KB · Text
RawDownload
= filter: data processing interface     include "filter.m";    filter := load Filter filterpath;     Rq: adt {         pick {         Start =>              pid: int;         Fill or Result =>              buf: array of byte;              reply: chan of int;         Finished =>              buf: array of byte;         Info =>              msg: string;         Error =>              e: string;         }    };     init:  fn();    start: fn(param: string): chan of ref Rq; Filter  defines  a  general  module interface for byte-streamprocessing.  This manual page documents how to use the inter‐face,  and  by implication how a Filter module should behave.There is a different implementation module  for  each  filtertype  and  algorithm  (eg, for compression or line encoding).All implementations are instances of type Filter, loaded fromthe  Dis  file  filterpath, given in the manual page for eachstandard filter (or you can write  your  own  to  match  thisspecification).   For details of each existing filter module,see filter-deflate(2) and following manual pages. Init must be called before any other operation  of  a  filtermodule. Start  sets  the  filter going; param can be used to pass anyfilter-specific information to the processor.  Start spawns anew thread to do the processing; it returns a channel that isused to receive requests from the filter.  The first  messagesent  is  always  Rq.Start;  pid is the process id of the newprocess spawned. Subsequent messages are: Rq.Fill       A request by the filter to fill buf  with  data.   The       number  of bytes that have actually been placed in the       buffer should be sent on reply.  If -1  is  sent,  the       filter  will terminate.  If the value is 0, the filter       will terminate once it has processed all its input. Rq.Result       Buf contains data from the filter.  Receipt of the the       data must be acknowledged by sending a value on reply.       If the value is -1, the filter will terminate. Rq.Finished       The filter has finished processing.  Buf contains  any       data  that  was not consumed by the filter. The filter       terminates after sending this message. Rq.Info       This message is used to send  a  string  of  arbitrary       information  from  the filter during the course of its       processing. Rq.Error       The filter has encountered an error  when  processing.       E  is a string describing the error. The filter termi‐       nates after sending this message. == source/module/filter.m == see ALSOgzip(1), filter-deflate(2), filter-slip(2)