This is service.m in view mode; [Download] [Up]
/* A variation on a command-line program to run a service. * Use it as you see fit. * Scott Hess <scott@nic.gac.edu> * * cc -o service -s -O service.m -lNeXT_s * cc -arch m68k -arch i386 -o service -s -O service.m -lNeXT_s * cc -arch m68k -arch i386 -arch hppa -o service -s -O service.m -lNeXT_s */ #import <appkit/appkit.h> NXDefaultsVector defs={ { "Input", "NeXT plain ascii pasteboard type"}, { "Output", "NeXT plain ascii pasteboard type"}, { "Service", NULL}, { NULL, NULL}, }; void main( int argc, char **argv) { Pasteboard *pb=[Pasteboard newUnique]; const char *inType=NULL, *outType=NULL, *service=NULL; NXApp=[Application new]; NXRegisterDefaults( "service", defs); inType=NXGetDefaultValue( "service", "Input"); outType=NXGetDefaultValue( "service", "Output"); service=NXGetDefaultValue( "service", "Service"); if( inType && *inType) { NXStream *stream=NXOpenMemory( NULL, 0, NX_WRITEONLY); char *data; int length, maxLength; #define BUFSIZE 4096 char buf[ BUFSIZE]; while( (length=fread( buf, BUFSIZE, 1, stdin))>0) { NXWrite( stream, buf, length); } [pb declareTypes:&inType num:1 owner:nil]; NXGetMemoryBuffer( stream, &data, &length, &maxLength); [pb writeType:inType data:data length:length]; NXCloseMemory( stream, NX_FREEBUFFER); } if( NXPerformService( service, pb) && outType && *outType) { const char *const *types=[pb types]; char *data; int length; while( *types && strcmp( outType, *types)) { types++; } if( *types) { [pb readType:*types data:&data length:&length]; fwrite( data, length, 1, stdout); [pb deallocatePasteboardData:data length:length]; } else { pb=[pb free]; exit( 1); } } pb=[pb free]; } /* Allow for a list of input types. Allow for a list of output types. Allow to specify file descriptors for input and output types. Allow for an input source default. */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.