This is performService.m in view mode; [Download] [Up]
/* This command was contributed by Mike Dixon <mdixon@parc.xerox.com> * cc -o performService -s -O performService.m -lNeXT_s * cc -arch m68k -arch i386 -o performService -s -O performService.m -lNeXT_s * cc -arch m68k -arch i386 -arch hppa -o performService -s -O performService.m -lNeXT_s */ #import <stdlib.h> #import <stdio.h> #import <libc.h> #import <strings.h> #import <appkit/appkit.h> #define STDIN 0 #define STDOUT 1 #define STDERR 2 char *use = "Use: performService <service> {-stdin | -input 'foo' | -empty} <inType> <outType>*\n"; id pb = 0; void die (char *msg) { write(STDERR, msg, strlen(msg)); if (pb) [pb freeGlobally]; exit(-1); } void main (int argc, char **argv) { const char *serviceName, *sendTypes[2], **recvTypes, *const *rcvdTypes, *const *p; char *sendBuf, *recvBuf; int nextArg, allocSize, bytesRead, sendLen, numRecvType, recvLen, i; if (argc < 4) die(use); serviceName = argv[1]; nextArg = 2; if (! strcmp(argv[nextArg], "-stdin")) { allocSize = 15000; sendBuf = malloc(allocSize); sendLen = bytesRead = read(STDIN, sendBuf, allocSize); while (bytesRead>0) { allocSize += allocSize; sendBuf = realloc(sendBuf, sendLen + allocSize); bytesRead = read(STDIN, sendBuf+sendLen, allocSize); sendLen += bytesRead; } ++nextArg; } else if (! strcmp(argv[nextArg], "-input")) { sendBuf = argv[nextArg+1]; sendLen = strlen(sendBuf); nextArg += 2; } else if (! strcmp(argv[nextArg], "-empty")) { sendBuf = ""; sendLen = 0; ++nextArg; } else die(use); if (argc <= nextArg) die(use); sendTypes[0] = argv[nextArg]; sendTypes[1] = 0; ++nextArg; numRecvType = argc - nextArg; recvTypes = &argv[nextArg]; pb = [Pasteboard newUnique]; NXApp=[Application new]; [pb declareTypes: sendTypes num: 1 owner: NULL]; if (! [pb writeType: sendTypes[0] data: sendBuf length: sendLen]) die("Couldn't write my pasteboard.\n"); if (! NXPerformService(serviceName, pb)) die("No such service.\n"); if (numRecvType == 0) { sleep( 10); [pb freeGlobally]; exit(0); } rcvdTypes = [pb types]; for (i = 0; i < numRecvType; i++) for (p = rcvdTypes; *p; p++) if (! strcmp(recvTypes[i], *p)) { if ([pb readType: *p data: &recvBuf length: &recvLen]) { write(STDOUT, recvBuf, recvLen); [pb freeGlobally]; exit(0); } die("Error reading service reply.\n"); } die("No reply of the requested type received from service.\n"); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.