This is StuartSpeaker.m in view mode; [Download] [Up]
/* Copyright (c) 1990, 1992, Scott Hess. No rights reserved. No * warranty is provided for this software, neither explicit nor * implied. The source and object code for this file may be used * and modified as the user sees fit. */ #import "StuartSpeaker.h" #import <appkit/Listener.h> #import <libc.h> #import <math.h> #import <stdio.h> #import <strings.h> extern id NXResponsibleDelegate(); @implementation StuartSpeaker - init { self=[super init]; if( self) { defaults=[[NXStringTable allocFromZone:[self zone]] init]; } return self; } - free { /* Since I was storing static strings in defaults, I don't want * them to be freed by the NXStringTable code. */ [defaults empty]; defaults=[defaults free]; return [super free]; } -(int)_stuartNew:(char *)defs activate:(int)flag { return [self selectorRPC:"_stuartNew:activate:" paramTypes:"ci", defs, flag]; } -(int)_stuartGet:(char **)defs { return [self selectorRPC:"_stuartGet:" paramTypes:"C", defs]; } static const char *sValue; // a temp variable. static char buffer[ 1024]; const char *itoa( int i) { sprintf( buffer, "%d", i); return buffer; } const char *ftoa( float f) { sprintf( buffer, "%f", f); return buffer; } const char *btoa( BOOL b) { sprintf( buffer, "%s", b ? "YES" : "NO"); return buffer; } BOOL atob( const char *s) { if( !s) { return NO; } else if( !*s) { return YES; } else if( !strcmp( s, "YES")) { return YES; } else { return atoi( s)!=0; } } -(const char *)default:(const char *)name { return [defaults valueForStringKey:name]; } -(int)defaultAsInt:(const char *)name { return (sValue=[self default:name]) ? atoi( sValue) : 0; } -(float)defaultAsFloat:(const char *)name { return (sValue=[self default:name]) ? atof( sValue) : NAN; } -(BOOL)defaultAsBOOL:(const char *)name { return (sValue=[self default:name]) ? atob( sValue) : NO; } - default:(const char *)name as:(const char *)value { return [defaults insertKey:(void *)name value:(void *)value]; } - default:(const char *)name asInt:(int)value { return [self default:name as:itoa( value)]; } - default:(const char *)name asFloat:(float)value { return [self default:name as:ftoa( value)]; } - default:(const char *)name asBOOL:(BOOL)value { return [self default:name as:btoa( value)]; } - removeDefault:(const char *)name { [defaults removeKey:(void *)name]; return self; } -(int)stuartNew { int i=-1; NXStream *aStream=NXOpenMemory( NULL, 0, NX_WRITEONLY); if( aStream) { char *data; int len, maxLen; BOOL activate=[self defaultAsBOOL:"Activate"]; [self removeDefault:"Activate"]; [defaults writeToStream:aStream]; NXPutc( aStream, '\0'); NXGetMemoryBuffer( aStream, &data, &len, &maxLen); i=[self _stuartNew:data activate:activate]; NXCloseMemory( aStream, NX_FREEBUFFER); } return i; } -(int)stuartGet { NXStream *aStream; int i, len; char *defs; i=[self _stuartGet:&defs]; if( i) { return i; } len=strlen( defs); aStream=NXOpenMemory( defs, len, NX_READONLY); if( aStream) { [defaults readFromStream:aStream]; NXCloseMemory( aStream, NX_FREEBUFFER); } return 0; } -(int)stuartSend:(int)fd { int ret=0; NXStream *aStream=NXOpenFile( fd, NX_READONLY); if( aStream) { [defaults readFromStream:aStream]; ret=[self stuartNew]; NXClose( aStream); } return ret; } -(int)stuartConnectAndNew { int ret=-1; port_t stuartPort=NXPortFromName( "Stuart", [self default:"NXHost"]); [self removeDefault:"NXHost"]; if( stuartPort!=PORT_NULL) { [self setSendPort:stuartPort]; ret=[self stuartNew]; } else { fprintf( stderr, "Stuart not running\n"); } return ret; } -(int)stuartConnectAndGet { int ret=-1; port_t stuartPort=NXPortFromName( "Stuart", [self default:"NXHost"]); [self removeDefault:"NXHost"]; if( stuartPort!=PORT_NULL) { [self setSendPort:stuartPort]; ret=[self stuartGet]; } else { fprintf( stderr, "Stuart not running\n"); } return ret; } -(int)stuartConnectAndSend:(int)fd { int ret=-1; port_t stuartPort=NXPortFromName( "Stuart", [self default:"NXHost"]); [self removeDefault:"NXHost"]; if( stuartPort!=PORT_NULL) { [self setSendPort:stuartPort]; ret=[self stuartSend:fd]; } else { fprintf( stderr, "Stuart not running\n"); } return ret; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.