Mercurial > hg > aim92
diff stitch/io.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stitch/io.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,145 @@ +/* + Copyright (c) Applied Psychology Unit, Medical Research Council. 1988, 1989 + =========================================================================== + + Permission to use, copy, modify, and distribute this software without fee + is hereby granted for research purposes, provided that this copyright + notice appears in all copies and in all supporting documentation, and that + the software is not redistributed for any fee (except for a nominal shipping + charge). Anyone wanting to incorporate all or part of this software in a + commercial product must obtain a license from the Medical Research Council. + + The MRC makes no representations about the suitability of this + software for any purpose. It is provided "as is" without express or implied + warranty. + + THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE + A.P.U. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* + io.c + ==== + + file i/o sources/sinks. + + +*/ + +#include <stdio.h> + +#include "stitch.h" +#include "source.h" +#include "io.h" + +extern int fclose() ; + +/* for IBM pc's */ +#ifdef PC +char readBinary[] = "rb" ; +char writeBinary[] = "wb" ; +#else +char readBinary[] = "r" ; +char writeBinary[] = "w" ; +#endif + +/* sources */ + +static void read_callback( state, bytes, buffer, end ) +FILE *state ; +ByteCount *bytes ; +Pointer buffer ; +{ + int actuall ; + + if( *bytes > 0 ) { + actuall = fread( (char *) buffer, sizeof ( char ), *bytes, state ) ; + + if( actuall == EOF ) + actuall = 0 ; + + stitch_bzero( (char *)buffer+actuall, *bytes-actuall ) ; + + *bytes = actuall ; + } + else if( *bytes < 0 ) + (void) fseek( state, (long) -*bytes, 1 ) ; + + return ; +} + +Source FileSource( fp ) +FILE *fp ; +{ + if( fp == ( FILE * ) 0 ) + (void) fprintf( stderr, "Bad file pointer FileSource - unable to open file?\n" ) ; + + return ( NewExternalSource( (Pointer) fp, read_callback, (void ( * )()) 0, "io.c file pointer" ) ) ; +} + +Source StdinSource() +{ + return ( FileSource( stdin ) ) ; +} + +Source FileNameSource( name ) +char *name ; +{ + FILE *fp = fopen( name, readBinary ) ; + + if( fp == (FILE *) 0 ) + if( strcmp( name, "-" ) == 0 ) + return ( StdinSource() ) ; + else { + (void) fprintf( stderr, "Bad file pointer FileSource - unable to open file?\n" ) ; + return ( EmptySource ) ; + } + + return ( NewExternalSource( (Pointer) fopen( name, readBinary ), read_callback, (void ( * )()) fclose, "io.c named file" ) ) ; +} + + +/* tap source into file on way past */ + +static void write_callback( state, bytes, buffer, end ) +FILE *state ; +ByteCount *bytes ; +Pointer buffer ; +{ + if( *bytes > 0 ) + (void) fwrite( (char *) buffer, sizeof ( char ), *bytes, state ) ; + else if( *bytes < 0 ) + (void) fseek( state, (long) -*bytes, 1 ) ; + + return ; +} + +Source FileTap( source, fp ) +Source source ; +FILE *fp ; +{ + if( fp == ( FILE * ) 0 ) + (void) fprintf( stderr, "Bad file pointer FileTap - unable to open file?\n" ) ; + + return ( NewTappingSource( (Pointer) fp, write_callback, (void (*)()) 0, source, "io.c file pointer tapping" ) ) ; +} + +Source FileNameTap( source, name ) +Source source ; +char *name ; +{ + (void) unlink( name ) ; + + return ( NewTappingSource( (Pointer) fopen( name, writeBinary ), write_callback, (void ( * )()) fclose, source, "io.c named file tapping" ) ) ; +} + +Source StdoutTap( source ) +Source source ; +{ + return ( FileTap( source, stdout ) ) ; +} +