This is pbtool.m in view mode; [Download] [Up]
#import <appkit/appkit.h>
#import "PBNames.h"
static void show (NXStream * outp, const char * name)
{ NXAtom pbKey = ! name ? NXGeneralPboard :
name[0] == '-' ? [[PBNames new] key:name+1] :
NXUniqueString(name);
id pb = [Pasteboard newName:pbKey];
const NXAtom * t;
NXPrintf(outp, "%s\t%d\n", [pb name], [pb changeCount]);
for (t = [pb types]; *t; ++ t)
NXPrintf(outp, "\t%s\n", *t);
}
static void listener ()
{ id myListener = [[Listener new] setServicesDelegate:[Object new]];
if ([myListener checkInAs:"pbtool"])
[myListener error:"pbtool in use\n"];
[myListener addPort];
[Listener run];
}
@implementation Object (show)
- show:pb userData:(const char *)ud error:(char **)msg
{ NXStream * outp = NXOpenFile(1, NX_WRITEONLY);
show(outp, [pb name]);
NXClose(outp);
return self;
}
@end
@implementation Object (pipe)
- pipe:pb userData:(const char *)ud error:(char **)msg
{ const NXAtom * types = [pb types];
char * buf; int len;
char cmd [BUFSIZ];
FILE * fp;
if (types[0])
[pb readType:types[0] data:&buf length:&len];
sprintf(cmd, "%s | %s/put -ascii '%s'", ud, PATH, [pb name]);
fp = popen(cmd, "w");
if (types[0])
{ fwrite(buf, len, 1, fp); // Vorsicht: SIGPIPE...
if (len && buf[len-1] != '\n')
putc('\n', fp);
}
pclose(fp);
if (types[0])
[pb deallocatePasteboardData:buf length:len];
return self;
}
@end
int main (int argc, char * argv [])
{
if (argc > 1)
{ NXStream * outp = NXOpenFile(1, NX_WRITEONLY);
while (++ argv, -- argc)
show(outp, *argv);
NXFlush(outp);
}
else
listener();
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.