Mercurial > hg > aim92
diff stitch/ops.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/ops.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,2264 @@ +/* + 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. +*/ + +/* + ops.c + ===== + + quickie operators for stitch + +*/ + + + +typedef char *Pointer ; + +typedef char *Address ; + + +/* a portable inteface to the system */ + +extern void stitch_error() ; + +extern Pointer stitch_malloc() ; +extern Pointer stitch_copied_malloc() ; +extern Pointer stitch_zeroed_malloc() ; +extern Pointer stitch_ralloc() ; +extern Pointer stitch_calloc() ; + +extern void stitch_free() ; +extern void stitch_exit() ; + +/* beware these definitions, they are for speed and fail if stitch.h not included */ + +extern void (*stitch_bcopy)() ; +extern void (*stitch_bzero)() ; + +extern char stitchStructStr[] ; + + + + +typedef struct _buffer *Buffer ; + + +struct _buffer { Pointer addr ; unsigned size, refs ; } ; + +extern Buffer NewBuffer( /* char where[] */ ) ; +extern Buffer SharedBuffer( /* Buffer buffer */ ) ; +extern Buffer ResizedBuffer( /* Buffer buffer, unsigned size */ ) ; +extern void FreeBuffer( /* Buffer buffer */ ) ; + + + + +/* basic types */ + +typedef struct _source *Source, *SourceArray[1] ; + + + +typedef Source CharSource, ShortSource, IntSource, FloatSource, DoubleSource, ComplexSource ; +typedef SourceArray CharSourceArray, ShortSourceArray, IntSourceArray, FloatSourceArray, DoubleSourceArray, ComplexSourceArray ; + +typedef int ByteCount ; + +/* dependant on type of source */ + +struct _source { Pointer (*pull)(), (*fill)(), (*roll)(), returned ; char *name, *type ; int opened ; Source (*open)() ; } ; +struct _source_operators { Source (*set)() ; Pointer (*delete)() ; Source (*setType)() ; char *(*getType)() ; char *(*getName)() ; } ; + +struct _pullable_source { struct _source parent ; } ; +struct _fillable_source { struct _source parent ; Buffer buffer ; } ; + + + + + + +extern Source setSource() ; +extern Source typeSource() ; +extern char *sourceType() ; +extern char *sourceName() ; +extern Pointer deleteSource() ; + +extern Pointer oldPull(), oldFill(), oldRoll() ; + + +extern void sinkSource() ; +extern void CloseSource() ; +extern void sinkAndCloseSource() ; + +/* derived source types for different purposes */ + +extern Source newTappingSource() ; +extern Source newRollableSource() ; + +extern Pointer nonRoller() ; + + + +/* fundamental active source types */ + +extern Source setPullableSource() ; +extern Pointer deletePullableSource() ; + +/* simple assertive derived sources */ + +extern Source newSlaveSource() ; +extern Source newStaticSource() ; +extern Source newRetainingSource() ; +extern Source newDelayingSource() ; +extern Source newBlockingSource() ; + + + +/* derived higher level filling sources */ + +extern Source setFillableSource() ; +extern Pointer deleteFillableSource() ; + +extern Source newSegmentingSource() ; + +extern Source setCallbackSource() ; +extern Source newExternalSource() ; +extern Source newThroughSource() ; + +extern Source newProcessingSource() ; +extern Source newSimpleProcessingSource() ; +extern Source newMultiplexedSource() ; +extern Source newMergingSource() ; + +extern Source sharingSource() ; + +extern Source *BindSources() ; + +/* for compatability... for now */ + +extern Source stdStaticSource() ; +extern Source stdSlaveSource() ; +extern Source stdAutoSource() ; +extern Source stdSelfSource() ; + + + +extern Source EmptySource ; +/* + stypes.h + ====== + + defines types for sources operations + + +*/ + +typedef struct { char *ident ; int size ; Source (*maker)() ; } TypeInfo ; + +extern int typeEntryNumber() ; +extern Source TypeConvertSource() ; +extern Source SourceSource() ; + +extern char CharIdent[] ; +extern char ShortIdent[] ; +extern char IntIdent[] ; +extern char LongIdent[] ; +extern char FloatIdent[] ; +extern char DoubleIdent[] ; + + + +/* basic data operations */ + +extern CharSource ConstantCharSource( ), IntegrateCharSource( ), CallingCharSource( ) ; +extern ShortSource ConstantShortSource( ), IntegrateShortSource( ), CallingShortSource( ) ; +extern IntSource ConstantIntSource( ), IntegrateIntSource( ), CallingIntSource( ) ; +extern FloatSource ConstantFloatSource( ), IntegrateFloatSource( ), CallingFloatSource( ) ; +extern DoubleSource ConstantDoubleSource( ), IntegrateDoubleSource( ), CallingDoubleSource( ) ; +extern ComplexSource ConstantComplexSource( ), IntegrateComplexSource( ), CallingComplexSource( ) ; + +/* binary operators */ + +extern CharSource AddCharSources( ), SubtractCharSources( ), MultiplyCharSources( ), DivideCharSources( ) ; +extern ShortSource AddShortSources( ), SubtractShortSources( ), MultiplyShortSources( ), DivideShortSources( ) ; +extern IntSource AddIntSources( ), SubtractIntSources( ), MultiplyIntSources( ), DivideIntSources( ) ; +extern FloatSource AddFloatSources( ), SubtractFloatSources( ), MultiplyFloatSources( ), DivideDoubleSources( ) ; +extern DoubleSource AddDoubleSources( ), SubtractDoubleSources( ), MultiplyDoubleSources( ), DivideFloatSources( ) ; +extern ComplexSource AddComplexSources( ), SubtractComplexSources( ), MultiplyComplexSources( ), DivideComplexSources( ) ; + +extern Source AddSources( ), SubtractSources( ), MultiplySources( ), DivideSources( ) ; + +/* convertors */ + +extern CharSource CharCharSource( ), ShortCharSource( ), IntCharSource( ), FloatCharSource( ), DoubleCharSource( ) ; +extern ShortSource CharShortSource( ), ShortShortSource( ), IntShortSource( ), FloatShortSource( ), DoubleShortSource( ) ; +extern IntSource CharIntSource( ), ShortIntSource( ), IntIntSource( ), FloatIntSource( ), DoubleIntSource( ) ; +extern FloatSource CharFloatSource( ), ShortFloatSource( ), IntFloatSource( ), FloatFloatSource( ), DoubleFloatSource( ) ; +extern DoubleSource CharDoubleSource( ), ShortDoubleSource( ), IntDoubleSource( ), FloatDoubleSource( ), DoubleDoubleSource( ) ; +extern ComplexSource CharComplexSource( ), ShortComplexSource( ), IntComplexSource( ), FloatComplexSource( ), DoubleComplexSource( ) ; + +extern Source SourceCharSource( ), SourceShortSource( ), SourceIntSource( ), SourceFloatSource( ), SourceDoubleSource( ), SourceComplexSource( ) ; + + +static void charConstantCallback( state, bytes, buffer, end ) +char *state ; +ByteCount *bytes ; +char *buffer, *end ; +{ + register char i, *optr = buffer, *eptr = end ; + + i = *state ; + + if( optr < eptr ) + do + *optr++ = i ; + while( optr < eptr ) ; + + return ; +} + +CharSource ConstantCharSource( constant ) +char constant ; +{ + char * state = ( char * ) stitch_malloc( (unsigned) ( ( sizeof * ( char * ) 0 ) ), stitchStructStr ) ; + + *state = constant ; + + return ( newExternalSource( (Pointer) ( (Pointer) state ), charConstantCallback, stitch_free, "ops.type constant" ) ) ; +} + + +static void charIntegralCallback( integral, bytes, buffer, end, input ) +char *integral ; +ByteCount *bytes ; +char *buffer, *end, *input ; +{ + register char *iptr = input ; + register char *optr = buffer ; + register char *eptr = end ; + + if( optr < eptr ) + do { + *optr++ = *integral ; + *integral += *iptr++ ; + } while( optr < eptr ) ; + + return ; +} + +CharSource IntegrateCharSource( source, initial ) +CharSource source ; +char initial ; +{ + char * integral = ( char * ) stitch_malloc( (unsigned) ( ( sizeof * ( char * ) 0 ) ), stitchStructStr ) ; + + *integral = initial ; + + return ( newProcessingSource( (Pointer) ( (Pointer) integral ), charIntegralCallback, stitch_free, source, "ops.type integrating" ) ) ; +} + +static void charCallingCallback( function, bytes, buffer, end, input ) +char (*function)() ; +ByteCount *bytes ; +char *buffer, *end, *input ; +{ + register char *iptr = input ; + register char *optr = buffer ; + register char *eptr = end ; + + if( optr < eptr ) + do + *optr++ = function( *iptr++ ) ; + while( optr < eptr ) ; + + return ; +} + +CharSource CallingCharSource( source, function ) +CharSource source ; +char (*function)() ; +{ + return ( newProcessingSource( (Pointer) ( (Pointer) function ), charCallingCallback, (void ( * )()) 0, source, "ops.type function" ) ) ; +} + +/* do operators */ + + +static void AddCharOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +char *output, *end, *input1, *input2 ; +{ + register char *optr = output ; + register char *ipt1 = input1 ; + register char *ipt2 = input2 ; + register char *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ + *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source AddCharSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddCharOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source AddCharSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddCharOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void SubtractCharOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +char *output, *end, *input1, *input2 ; +{ + register char *optr = output ; + register char *ipt1 = input1 ; + register char *ipt2 = input2 ; + register char *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ - *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source SubtractCharSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractCharOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source SubtractCharSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractCharOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void MultiplyCharOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +char *output, *end, *input1, *input2 ; +{ + register char *optr = output ; + register char *ipt1 = input1 ; + register char *ipt2 = input2 ; + register char *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ * *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source MultiplyCharSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyCharOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source MultiplyCharSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyCharOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void DivideCharOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +char *output, *end, *input1, *input2 ; +{ + register char *optr = output ; + register char *ipt1 = input1 ; + register char *ipt2 = input2 ; + register char *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ / *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source DivideCharSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideCharOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source DivideCharSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideCharOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +/* create convertors */ + +static void CharCharCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +char *buffer ; +{ + register char *i = ( ( char *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( char *) 0l + ( ( ( bytes ) >> ( sizeof( char) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register char *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +CharSource CharCharSource( source ) +CharSource source ; +{ + return( stdAutoSource( ( Pointer ) source, CharCharCallback ) ) ; +} + + +static void ShortCharCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +char *buffer ; +{ + register short *i = ( ( short *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( short *) 0l + ( ( ( bytes ) >> ( sizeof( char) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register char *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +CharSource ShortCharSource( source ) +CharSource source ; +{ + return( stdAutoSource( ( Pointer ) source, ShortCharCallback ) ) ; +} + + + + +static void IntCharCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +char *buffer ; +{ + register int *i = ( ( int *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( int *) 0l + ( ( ( bytes ) >> ( sizeof( char) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register char *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +CharSource IntCharSource( source ) +CharSource source ; +{ + return( stdAutoSource( ( Pointer ) source, IntCharCallback ) ) ; +} + + +static void FloatCharCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +char *buffer ; +{ + register float *i = ( ( float *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( float *) 0l + ( ( ( bytes ) >> ( sizeof( char) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register char *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +CharSource FloatCharSource( source ) +CharSource source ; +{ + return( stdAutoSource( ( Pointer ) source, FloatCharCallback ) ) ; +} + + + +static void DoubleCharCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +char *buffer ; +{ + register double *i = ( ( double *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( double *) 0l + ( ( ( bytes ) >> ( sizeof( char) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register char *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +CharSource DoubleCharSource( source ) +CharSource source ; +{ + return( stdAutoSource( ( Pointer ) source, DoubleCharCallback ) ) ; +} + + + + +Source SourceCharSource( source ) +Source source ; +{ + static Source (*converts[])() = { + SourceSource, + CharCharSource, + ShortCharSource, + IntCharSource, + FloatCharSource, + DoubleCharSource + } ; + + return ( converts[ typeEntryNumber( sourceType( (struct _source *) source ) ) ]( source ) ) ; +} + + +static void shortConstantCallback( state, bytes, buffer, end ) +short *state ; +ByteCount *bytes ; +short *buffer, *end ; +{ + register short i, *optr = buffer, *eptr = end ; + + i = *state ; + + if( optr < eptr ) + do + *optr++ = i ; + while( optr < eptr ) ; + + return ; +} + +ShortSource ConstantShortSource( constant ) +short constant ; +{ + short * state = ( short * ) stitch_malloc( (unsigned) ( ( sizeof * ( short * ) 0 ) ), stitchStructStr ) ; + + *state = constant ; + + return ( newExternalSource( (Pointer) ( (Pointer) state ), shortConstantCallback, stitch_free, "ops.type constant" ) ) ; +} + + +static void shortIntegralCallback( integral, bytes, buffer, end, input ) +short *integral ; +ByteCount *bytes ; +short *buffer, *end, *input ; +{ + register short *iptr = input ; + register short *optr = buffer ; + register short *eptr = end ; + + if( optr < eptr ) + do { + *optr++ = *integral ; + *integral += *iptr++ ; + } while( optr < eptr ) ; + + return ; +} + +ShortSource IntegrateShortSource( source, initial ) +ShortSource source ; +short initial ; +{ + short * integral = ( short * ) stitch_malloc( (unsigned) ( ( sizeof * ( short * ) 0 ) ), stitchStructStr ) ; + + *integral = initial ; + + return ( newProcessingSource( (Pointer) ( (Pointer) integral ), shortIntegralCallback, stitch_free, source, "ops.type integrating" ) ) ; +} + +static void shortCallingCallback( function, bytes, buffer, end, input ) +short (*function)() ; +ByteCount *bytes ; +short *buffer, *end, *input ; +{ + register short *iptr = input ; + register short *optr = buffer ; + register short *eptr = end ; + + if( optr < eptr ) + do + *optr++ = function( *iptr++ ) ; + while( optr < eptr ) ; + + return ; +} + +ShortSource CallingShortSource( source, function ) +ShortSource source ; +short (*function)() ; +{ + return ( newProcessingSource( (Pointer) ( (Pointer) function ), shortCallingCallback, (void ( * )()) 0, source, "ops.type function" ) ) ; +} + +/* do operators */ + +static void AddShortOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +short *output, *end, *input1, *input2 ; +{ + register short *optr = output ; + register short *ipt1 = input1 ; + register short *ipt2 = input2 ; + register short *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ + *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source AddShortSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddShortOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source AddShortSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddShortOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void SubtractShortOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +short *output, *end, *input1, *input2 ; +{ + register short *optr = output ; + register short *ipt1 = input1 ; + register short *ipt2 = input2 ; + register short *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ - *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source SubtractShortSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractShortOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source SubtractShortSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractShortOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void MultiplyShortOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +short *output, *end, *input1, *input2 ; +{ + register short *optr = output ; + register short *ipt1 = input1 ; + register short *ipt2 = input2 ; + register short *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ * *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source MultiplyShortSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyShortOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source MultiplyShortSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyShortOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void DivideShortOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +short *output, *end, *input1, *input2 ; +{ + register short *optr = output ; + register short *ipt1 = input1 ; + register short *ipt2 = input2 ; + register short *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ / *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source DivideShortSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideShortOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source DivideShortSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideShortOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +/* create convertors */ + + +static void CharShortCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +short *buffer ; +{ + register char *i = ( ( char *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( char *) 0l + ( ( ( bytes ) >> ( sizeof( short) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register short *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +ShortSource CharShortSource( source ) +ShortSource source ; +{ + return( stdAutoSource( ( Pointer ) source, CharShortCallback ) ) ; +} + + + +static void ShortShortCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +short *buffer ; +{ + register short *i = ( ( short *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( short *) 0l + ( ( ( bytes ) >> ( sizeof( short) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register short *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +ShortSource ShortShortSource( source ) +ShortSource source ; +{ + return( stdAutoSource( ( Pointer ) source, ShortShortCallback ) ) ; +} + + +static void IntShortCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +short *buffer ; +{ + register int *i = ( ( int *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( int *) 0l + ( ( ( bytes ) >> ( sizeof( short) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register short *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +ShortSource IntShortSource( source ) +ShortSource source ; +{ + return( stdAutoSource( ( Pointer ) source, IntShortCallback ) ) ; +} + + + +static void FloatShortCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +short *buffer ; +{ + register float *i = ( ( float *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( float *) 0l + ( ( ( bytes ) >> ( sizeof( short) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register short *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +ShortSource FloatShortSource( source ) +ShortSource source ; +{ + return( stdAutoSource( ( Pointer ) source, FloatShortCallback ) ) ; +} + + +static void DoubleShortCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +short *buffer ; +{ + register double *i = ( ( double *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( double *) 0l + ( ( ( bytes ) >> ( sizeof( short) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register short *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +ShortSource DoubleShortSource( source ) +ShortSource source ; +{ + return( stdAutoSource( ( Pointer ) source, DoubleShortCallback ) ) ; +} + + + + +Source SourceShortSource( source ) +Source source ; +{ + static Source (*converts[])() = { + SourceSource, + CharShortSource, + ShortShortSource, + IntShortSource, + FloatShortSource, + DoubleShortSource + } ; + + return ( converts[ typeEntryNumber( sourceType( (struct _source *) source ) ) ]( source ) ) ; +} + + + +static void intConstantCallback( state, bytes, buffer, end ) +int *state ; +ByteCount *bytes ; +int *buffer, *end ; +{ + register int i, *optr = buffer, *eptr = end ; + + i = *state ; + + if( optr < eptr ) + do + *optr++ = i ; + while( optr < eptr ) ; + + return ; +} + +IntSource ConstantIntSource( constant ) +int constant ; +{ + int * state = ( int * ) stitch_malloc( (unsigned) ( ( sizeof * ( int * ) 0 ) ), stitchStructStr ) ; + + *state = constant ; + + return ( newExternalSource( (Pointer) ( (Pointer) state ), intConstantCallback, stitch_free, "ops.type constant" ) ) ; +} + + +static void intIntegralCallback( integral, bytes, buffer, end, input ) +int *integral ; +ByteCount *bytes ; +int *buffer, *end, *input ; +{ + register int *iptr = input ; + register int *optr = buffer ; + register int *eptr = end ; + + if( optr < eptr ) + do { + *optr++ = *integral ; + *integral += *iptr++ ; + } while( optr < eptr ) ; + + return ; +} + +IntSource IntegrateIntSource( source, initial ) +IntSource source ; +int initial ; +{ + int * integral = ( int * ) stitch_malloc( (unsigned) ( ( sizeof * ( int * ) 0 ) ), stitchStructStr ) ; + + *integral = initial ; + + return ( newProcessingSource( (Pointer) ( (Pointer) integral ), intIntegralCallback, stitch_free, source, "ops.type integrating" ) ) ; +} + +static void intCallingCallback( function, bytes, buffer, end, input ) +int (*function)() ; +ByteCount *bytes ; +int *buffer, *end, *input ; +{ + register int *iptr = input ; + register int *optr = buffer ; + register int *eptr = end ; + + if( optr < eptr ) + do + *optr++ = function( *iptr++ ) ; + while( optr < eptr ) ; + + return ; +} + +IntSource CallingIntSource( source, function ) +IntSource source ; +int (*function)() ; +{ + return ( newProcessingSource( (Pointer) ( (Pointer) function ), intCallingCallback, (void ( * )()) 0, source, "ops.type function" ) ) ; +} + +/* do operators */ + + +static void AddIntOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +int *output, *end, *input1, *input2 ; +{ + register int *optr = output ; + register int *ipt1 = input1 ; + register int *ipt2 = input2 ; + register int *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ + *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source AddIntSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddIntOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source AddIntSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddIntOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + +static void SubtractIntOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +int *output, *end, *input1, *input2 ; +{ + register int *optr = output ; + register int *ipt1 = input1 ; + register int *ipt2 = input2 ; + register int *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ - *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source SubtractIntSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractIntOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source SubtractIntSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractIntOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +static void MultiplyIntOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +int *output, *end, *input1, *input2 ; +{ + register int *optr = output ; + register int *ipt1 = input1 ; + register int *ipt2 = input2 ; + register int *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ * *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source MultiplyIntSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyIntOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source MultiplyIntSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyIntOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + +static void DivideIntOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +int *output, *end, *input1, *input2 ; +{ + register int *optr = output ; + register int *ipt1 = input1 ; + register int *ipt2 = input2 ; + register int *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ / *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source DivideIntSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideIntOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source DivideIntSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideIntOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +/* create convertors */ + +static void CharIntCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +int *buffer ; +{ + register char *i = ( ( char *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( char *) 0l + ( ( ( bytes ) >> ( sizeof( int) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register int *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +IntSource CharIntSource( source ) +IntSource source ; +{ + return( stdAutoSource( ( Pointer ) source, CharIntCallback ) ) ; +} + + + +static void ShortIntCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +int *buffer ; +{ + register short *i = ( ( short *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( short *) 0l + ( ( ( bytes ) >> ( sizeof( int) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register int *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +IntSource ShortIntSource( source ) +IntSource source ; +{ + return( stdAutoSource( ( Pointer ) source, ShortIntCallback ) ) ; +} + + + +static void IntIntCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +int *buffer ; +{ + register int *i = ( ( int *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( int *) 0l + ( ( ( bytes ) >> ( sizeof( int) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register int *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +IntSource IntIntSource( source ) +IntSource source ; +{ + return( stdAutoSource( ( Pointer ) source, IntIntCallback ) ) ; +} + + + +static void FloatIntCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +int *buffer ; +{ + register float *i = ( ( float *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( float *) 0l + ( ( ( bytes ) >> ( sizeof( int) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register int *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +IntSource FloatIntSource( source ) +IntSource source ; +{ + return( stdAutoSource( ( Pointer ) source, FloatIntCallback ) ) ; +} + + + +static void DoubleIntCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +int *buffer ; +{ + register double *i = ( ( double *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( double *) 0l + ( ( ( bytes ) >> ( sizeof( int) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register int *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +IntSource DoubleIntSource( source ) +IntSource source ; +{ + return( stdAutoSource( ( Pointer ) source, DoubleIntCallback ) ) ; +} + + + + +Source SourceIntSource( source ) +Source source ; +{ + static Source (*converts[])() = { + SourceSource, + CharIntSource, + ShortIntSource, + IntIntSource, + FloatIntSource, + DoubleIntSource + } ; + + return ( converts[ typeEntryNumber( sourceType( (struct _source *) source ) ) ]( source ) ) ; +} + + +static void floatConstantCallback( state, bytes, buffer, end ) +float *state ; +ByteCount *bytes ; +float *buffer, *end ; +{ + register float i, *optr = buffer, *eptr = end ; + + i = *state ; + + if( optr < eptr ) + do + *optr++ = i ; + while( optr < eptr ) ; + + return ; +} + +FloatSource ConstantFloatSource( constant ) +float constant ; +{ + float * state = ( float * ) stitch_malloc( (unsigned) ( ( sizeof * ( float * ) 0 ) ), stitchStructStr ) ; + + *state = constant ; + + return ( newExternalSource( (Pointer) ( (Pointer) state ), floatConstantCallback, stitch_free, "ops.type constant" ) ) ; +} + + +static void floatIntegralCallback( integral, bytes, buffer, end, input ) +float *integral ; +ByteCount *bytes ; +float *buffer, *end, *input ; +{ + register float *iptr = input ; + register float *optr = buffer ; + register float *eptr = end ; + + if( optr < eptr ) + do { + *optr++ = *integral ; + *integral += *iptr++ ; + } while( optr < eptr ) ; + + return ; +} + +FloatSource IntegrateFloatSource( source, initial ) +FloatSource source ; +float initial ; +{ + float * integral = ( float * ) stitch_malloc( (unsigned) ( ( sizeof * ( float * ) 0 ) ), stitchStructStr ) ; + + *integral = initial ; + + return ( newProcessingSource( (Pointer) ( (Pointer) integral ), floatIntegralCallback, stitch_free, source, "ops.type integrating" ) ) ; +} + +static void floatCallingCallback( function, bytes, buffer, end, input ) +float (*function)() ; +ByteCount *bytes ; +float *buffer, *end, *input ; +{ + register float *iptr = input ; + register float *optr = buffer ; + register float *eptr = end ; + + if( optr < eptr ) + do + *optr++ = function( *iptr++ ) ; + while( optr < eptr ) ; + + return ; +} + +FloatSource CallingFloatSource( source, function ) +FloatSource source ; +float (*function)() ; +{ + return ( newProcessingSource( (Pointer) ( (Pointer) function ), floatCallingCallback, (void ( * )()) 0, source, "ops.type function" ) ) ; +} + +/* do operators */ + +static void AddFloatOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +float *output, *end, *input1, *input2 ; +{ + register float *optr = output ; + register float *ipt1 = input1 ; + register float *ipt2 = input2 ; + register float *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ + *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source AddFloatSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddFloatOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source AddFloatSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddFloatOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + +static void SubtractFloatOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +float *output, *end, *input1, *input2 ; +{ + register float *optr = output ; + register float *ipt1 = input1 ; + register float *ipt2 = input2 ; + register float *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ - *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source SubtractFloatSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractFloatOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source SubtractFloatSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractFloatOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void MultiplyFloatOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +float *output, *end, *input1, *input2 ; +{ + register float *optr = output ; + register float *ipt1 = input1 ; + register float *ipt2 = input2 ; + register float *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ * *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source MultiplyFloatSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyFloatOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source MultiplyFloatSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyFloatOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + +static void DivideFloatOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +float *output, *end, *input1, *input2 ; +{ + register float *optr = output ; + register float *ipt1 = input1 ; + register float *ipt2 = input2 ; + register float *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ / *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source DivideFloatSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideFloatOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source DivideFloatSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideFloatOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +/* create convertors */ + + +static void CharFloatCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +float *buffer ; +{ + register char *i = ( ( char *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( char *) 0l + ( ( ( bytes ) >> ( sizeof( float) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register float *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +FloatSource CharFloatSource( source ) +FloatSource source ; +{ + return( stdAutoSource( ( Pointer ) source, CharFloatCallback ) ) ; +} + + +static void ShortFloatCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +float *buffer ; +{ + register short *i = ( ( short *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( short *) 0l + ( ( ( bytes ) >> ( sizeof( float) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register float *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +FloatSource ShortFloatSource( source ) +FloatSource source ; +{ + return( stdAutoSource( ( Pointer ) source, ShortFloatCallback ) ) ; +} + + + +static void IntFloatCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +float *buffer ; +{ + register int *i = ( ( int *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( int *) 0l + ( ( ( bytes ) >> ( sizeof( float) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register float *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +FloatSource IntFloatSource( source ) +FloatSource source ; +{ + return( stdAutoSource( ( Pointer ) source, IntFloatCallback ) ) ; +} + + + +static void FloatFloatCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +float *buffer ; +{ + register float *i = ( ( float *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( float *) 0l + ( ( ( bytes ) >> ( sizeof( float) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register float *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +FloatSource FloatFloatSource( source ) +FloatSource source ; +{ + return( stdAutoSource( ( Pointer ) source, FloatFloatCallback ) ) ; +} + + + +static void DoubleFloatCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +float *buffer ; +{ + register double *i = ( ( double *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( double *) 0l + ( ( ( bytes ) >> ( sizeof( float) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register float *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +FloatSource DoubleFloatSource( source ) +FloatSource source ; +{ + return( stdAutoSource( ( Pointer ) source, DoubleFloatCallback ) ) ; +} + + + + +Source SourceFloatSource( source ) +Source source ; +{ + static Source (*converts[])() = { + SourceSource, + CharFloatSource, + ShortFloatSource, + IntFloatSource, + FloatFloatSource, + DoubleFloatSource + } ; + + return ( converts[ typeEntryNumber( sourceType( (struct _source *) source ) ) ]( source ) ) ; +} + + + + +static void doubleConstantCallback( state, bytes, buffer, end ) +double *state ; +ByteCount *bytes ; +double *buffer, *end ; +{ + register double i, *optr = buffer, *eptr = end ; + + i = *state ; + + if( optr < eptr ) + do + *optr++ = i ; + while( optr < eptr ) ; + + return ; +} + +DoubleSource ConstantDoubleSource( constant ) +double constant ; +{ + double * state = ( double * ) stitch_malloc( (unsigned) ( ( sizeof * ( double * ) 0 ) ), stitchStructStr ) ; + + *state = constant ; + + return ( newExternalSource( (Pointer) ( (Pointer) state ), doubleConstantCallback, stitch_free, "ops.type constant" ) ) ; +} + + +static void doubleIntegralCallback( integral, bytes, buffer, end, input ) +double *integral ; +ByteCount *bytes ; +double *buffer, *end, *input ; +{ + register double *iptr = input ; + register double *optr = buffer ; + register double *eptr = end ; + + if( optr < eptr ) + do { + *optr++ = *integral ; + *integral += *iptr++ ; + } while( optr < eptr ) ; + + return ; +} + +DoubleSource IntegrateDoubleSource( source, initial ) +DoubleSource source ; +double initial ; +{ + double * integral = ( double * ) stitch_malloc( (unsigned) ( ( sizeof * ( double * ) 0 ) ), stitchStructStr ) ; + + *integral = initial ; + + return ( newProcessingSource( (Pointer) ( (Pointer) integral ), doubleIntegralCallback, stitch_free, source, "ops.type integrating" ) ) ; +} + +static void doubleCallingCallback( function, bytes, buffer, end, input ) +double (*function)() ; +ByteCount *bytes ; +double *buffer, *end, *input ; +{ + register double *iptr = input ; + register double *optr = buffer ; + register double *eptr = end ; + + if( optr < eptr ) + do + *optr++ = function( *iptr++ ) ; + while( optr < eptr ) ; + + return ; +} + +DoubleSource CallingDoubleSource( source, function ) +DoubleSource source ; +double (*function)() ; +{ + return ( newProcessingSource( (Pointer) ( (Pointer) function ), doubleCallingCallback, (void ( * )()) 0, source, "ops.type function" ) ) ; +} + +/* do operators */ + + +static void AddDoubleOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +double *output, *end, *input1, *input2 ; +{ + register double *optr = output ; + register double *ipt1 = input1 ; + register double *ipt2 = input2 ; + register double *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ + *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source AddDoubleSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddDoubleOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source AddDoubleSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), AddDoubleOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +static void SubtractDoubleOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +double *output, *end, *input1, *input2 ; +{ + register double *optr = output ; + register double *ipt1 = input1 ; + register double *ipt2 = input2 ; + register double *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ - *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source SubtractDoubleSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractDoubleOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source SubtractDoubleSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), SubtractDoubleOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +static void MultiplyDoubleOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +double *output, *end, *input1, *input2 ; +{ + register double *optr = output ; + register double *ipt1 = input1 ; + register double *ipt2 = input2 ; + register double *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ * *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source MultiplyDoubleSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyDoubleOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source MultiplyDoubleSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), MultiplyDoubleOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + +static void DivideDoubleOp( state, bytes, output, end, input1, input2 ) +Pointer *state ; +ByteCount *bytes ; +double *output, *end, *input1, *input2 ; +{ + register double *optr = output ; + register double *ipt1 = input1 ; + register double *ipt2 = input2 ; + register double *eptr = end ; + + if( optr < eptr ) + do + *optr++ = *ipt1++ / *ipt2++ ; + while( optr < eptr ) ; + + return ; +} + +Source DivideDoubleSources( input1, input2 ) +Source input1, input2 ; +{ + Source * inputs = ( Source *) stitch_malloc( (unsigned) ( sizeof ( Source) * (unsigned) ( 3 ) ), "for 2 inputs" ) ; + + inputs[0] = input1 ; + inputs[1] = input2 ; + + inputs[2] = (struct _source *) 0 ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideDoubleOp, (void ( * )()) 0, inputs, "binary operator" ) ) ; +} + +/* VARARGS2 */ +Source DivideDoubleSourceArray( inputs ) +Source *inputs ; +{ + int count = 0 ; + + while( inputs[count] != (struct _source *) 0 ) + count++ ; + + return( newMergingSource( (Pointer) ( (Pointer) 0 ), DivideDoubleOp, (void ( * )()) 0, inputs, "operator" ) ) ; +} + + + + +/* create convertors */ + + +static void CharDoubleCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +double *buffer ; +{ + register char *i = ( ( char *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( char *) 0l + ( ( ( bytes ) >> ( sizeof( double) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register double *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +DoubleSource CharDoubleSource( source ) +DoubleSource source ; +{ + return( stdAutoSource( ( Pointer ) source, CharDoubleCallback ) ) ; +} + + + + +static void ShortDoubleCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +double *buffer ; +{ + register short *i = ( ( short *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( short *) 0l + ( ( ( bytes ) >> ( sizeof( double) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register double *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +DoubleSource ShortDoubleSource( source ) +DoubleSource source ; +{ + return( stdAutoSource( ( Pointer ) source, ShortDoubleCallback ) ) ; +} + + + +static void IntDoubleCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +double *buffer ; +{ + register int *i = ( ( int *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( int *) 0l + ( ( ( bytes ) >> ( sizeof( double) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register double *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +DoubleSource IntDoubleSource( source ) +DoubleSource source ; +{ + return( stdAutoSource( ( Pointer ) source, IntDoubleCallback ) ) ; +} + + + + +static void FloatDoubleCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +double *buffer ; +{ + register float *i = ( ( float *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( float *) 0l + ( ( ( bytes ) >> ( sizeof( double) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register double *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +DoubleSource FloatDoubleSource( source ) +DoubleSource source ; +{ + return( stdAutoSource( ( Pointer ) source, FloatDoubleCallback ) ) ; +} + + +static void DoubleDoubleCallback( state, bytes, buffer ) +Source state ; +ByteCount bytes ; +double *buffer ; +{ + register double *i = ( ( double *) ( state ->returned = oldPull( state , (ByteCount ) ( ( ( char *) ( ( double *) 0l + ( ( ( bytes ) >> ( sizeof( double) >> 1 ) ) ) ) - ( char *) 0l ) ) ) ) ) ; + register double *o = buffer ; + register Pointer e = (Pointer) buffer + bytes ; + + if( (Pointer) o < e ) + do + *o++ = *i++ ; + while( (Pointer) o < e ) ; + + return ; +} + +DoubleSource DoubleDoubleSource( source ) +DoubleSource source ; +{ + return( stdAutoSource( ( Pointer ) source, DoubleDoubleCallback ) ) ; +} + + + + +Source SourceDoubleSource( source ) +Source source ; +{ + static Source (*converts[])() = { + SourceSource, + CharDoubleSource, + ShortDoubleSource, + IntDoubleSource, + FloatDoubleSource, + DoubleDoubleSource + } ; + + return ( converts[ typeEntryNumber( sourceType( (struct _source *) source ) ) ]( source ) ) ; +} + + + +