#include "niml.h"
/*--- Copy stdin to a NI_stream ---*/
#define NBUF 65000
int main( int argc , char *argv[] )
{
NI_stream ns ;
char lbuf[NBUF] , *reop=NULL ;
int nn , nl=0 , jj , ntot=0 , ct , ech , iarg=1 ;
if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
printf("Usage: nicat [-reopen rr] [-rR] streamspec\n"
"Copies stdin to the NIML stream, which will be opened\n"
"for writing.\n"
"\n"
"-reopen rr == reopen the stream after connection\n"
" to the stream specified by 'rr'\n"
"-r == Copy the stream to stdout instead; the\n"
" 'streamspec' will be opened for reading.\n"
"-R == Read the stream but don't copy to stdout.\n"
"\n"
"Intended for testing other programs that use NIML for\n"
"various services. Example:\n"
" aiv -p 4444 &\n"
" im2niml zork.jpg | nicat tcp:localhost:4444\n"
"Starts aiv listening on TCP/IP port 444, then sends image\n"
"file zork.jpg to that port for display.\n"
) ;
exit(0) ;
}
if( strcmp(argv[iarg],"-reopen") == 0 ){
reop = argv[++iarg] ; iarg++ ;
}
/** write stdin to the stream **/
if( toupper(argv[iarg][1]) != 'R' ){
ns = NI_stream_open( argv[iarg] , "w" ) ;
if( ns == NULL ){
fprintf(stderr,"** NI_stream_open fails\n") ; exit(1) ;
}
while(1){
nn = NI_stream_writecheck( ns , 400 ) ;
if( nn == 1 ){ fprintf(stderr,"!\n") ; break ; }
if( nn < 0 ){ fprintf(stderr,"BAD\n"); exit(1) ; }
fprintf(stderr,"-") ;
}
if( reop ){ /* 23 Aug 2002 */
fprintf(stderr,"++ reopening") ;
nn = NI_stream_reopen( ns , reop ) ;
if( nn == 0 ) fprintf(stderr,".BAD") ;
else fprintf(stderr,".GOOD") ;
fprintf(stderr,"\n") ;
}
ct = NI_clock_time() ;
while(1){
jj = fread(lbuf,1,NBUF,stdin) ; if( jj <= 0 ) break ;
nn = NI_stream_write( ns , lbuf , jj ) ;
if( nn < 0 ){
fprintf(stderr,"** NI_stream_write fails\n"); break ;
} else if( nn < jj ){
fprintf(stderr,"++ nl=%d: wrote %d/%d bytes\n",nl,nn,jj) ;
}
nl++ ; ntot += jj ;
}
NI_sleep(1) ; NI_stream_close(ns) ;
ct = NI_clock_time()-ct ;
fprintf(stderr,"++ Wrote %d bytes in %d ms: %.3f Mbytes/s\n",
ntot,ct,(9.5367e-7*ntot)/(1.e-3*ct) ) ;
sleep(1) ; exit(0) ;
}
/** write the stream to stdout */
if( argc < iarg+2 ){
fprintf(stderr,"** %s needs argv[%d]\n",argv[1],iarg+1); exit(1);
}
ech = (argv[iarg][1] == 'r') ;
ns = NI_stream_open( argv[iarg+1], (argv[iarg][2]=='\0') ? "r" : "w" ) ;
if( ns == NULL ){
fprintf(stderr,"** NI_stream_open fails\n") ; exit(1) ;
}
while(1){
nn = NI_stream_readcheck( ns , 400 ) ;
if( nn == 1 ){ fprintf(stderr,"!\n") ; break ; }
if( nn < 0 ){ fprintf(stderr,"BAD\n"); exit(1) ; }
fprintf(stderr,"-") ;
}
if( reop ){ /* 23 Aug 2002 */
fprintf(stderr,"++ reopening") ;
nn = NI_stream_reopen( ns , reop ) ;
if( nn == 0 ) fprintf(stderr,".BAD") ;
else fprintf(stderr,".GOOD") ;
fprintf(stderr,"\n") ;
}
ct = NI_clock_time() ;
while(1){
nn = NI_stream_read( ns , lbuf , NBUF ) ;
if( nn < 0 ){
fprintf(stderr,"\nNI_stream_read fails\n"); break;
} else {
ntot += nn ;
}
if( ech && nn > 0 ){
printf("%.*s",nn,lbuf) ; nl++ ;
}
}
ct = NI_clock_time()-ct ;
fprintf(stderr,"Read %d bytes in %d ms: %.3f Mbytes/s\n",
ntot,ct,(9.5367e-7*ntot)/(1.e-3*ct) ) ;
sleep(1) ; exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1