This is RTFDescription.m in view mode; [Download] [Up]
#import "RTFDescription.h" static const char *header = "{\\rtf0\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\fo\n"; @implementation RTFDescription - init { [super init]; textStream = NULL; buffer = NULL; return self; } - free { if(textStream) NXCloseMemory(textStream,NX_FREEBUFFER); NX_FREE(buffer); return [super free]; } - copyFromZone:(NXZone *)zone { RTFDescription *theCopy; theCopy = [super copyFromZone:zone]; theCopy->textStream = NULL; if(buffer){ NX_ZONEMALLOC(zone, theCopy->buffer,char,strlen(buffer) + 1); strcpy(theCopy->buffer, buffer); } else theCopy->buffer = NULL; return theCopy; } - (NXStream *)stream { if(!textStream){ textStream = NXOpenMemory(0,0,NX_READWRITE); if(!buffer) NXWrite(textStream, header, strlen(header)); else NXWrite(textStream, buffer, strlen(buffer)); } NXSeek(textStream, 0L, NX_FROMSTART); return textStream; } - freeStream { if(textStream) NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NULL; return self; } - setRTFFromTextView:aView { int maxlen,length; char *ptr; if(textStream) NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NXOpenMemory(0,0,NX_READWRITE); [aView writeRichText:textStream]; NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen); if(buffer){ NX_ZONEREALLOC([self zone], buffer,char,length + 1); } else { NX_ZONEMALLOC([self zone], buffer,char,length + 1); } strcpy(buffer,ptr); NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NULL; return self; } - setRTF:(const char *)string { if(buffer){ NX_ZONEREALLOC([self zone], buffer,char,strlen(string) + 1); } else { NX_ZONEMALLOC([self zone], buffer,char,strlen(string) + 1); } strcpy(buffer, string); return self; } - setAscii:(const char *)string { int maxlen,length; char *ptr; if(!string){ NX_FREE(buffer); buffer = NULL; return self; } if(textStream) NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NXOpenMemory(0,0,NX_READWRITE); NXWrite(textStream, header, strlen(header)); NXSeek(textStream, 0L, NX_FROMEND); while(*string){ switch(*string){ case '\n': case '{': case '}': case '\\': NXPutc(textStream, '\\'); break; default: break; } NXPutc(textStream, *string); string++; } NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen); if(buffer){ NX_ZONEREALLOC([self zone], buffer,char,length + 1); } else { NX_ZONEMALLOC([self zone], buffer,char,length + 1); } strcpy(buffer,ptr); NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NULL; return self; } - beginAppend { if(textStream) NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NXOpenMemory(0,0,NX_READWRITE); NXWrite(textStream, header, strlen(header)); return self; } - appendRTF:(const char *)string { if(!string) return self; NXSeek(textStream, 0L, NX_FROMEND); NXWrite(textStream, string, strlen(string)); return self; } - appendAscii:(const char *)string { if(!string) return self; NXSeek(textStream, 0L, NX_FROMEND); while(*string){ switch(*string){ case '\n': case '{': case '}': case '\\': NXPutc(textStream, '\\'); break; default: break; } NXPutc(textStream, *string); string++; } return self; } - bold:(BOOL)flag { [self appendRTF: flag ? "\\b " : "\\b0 "]; return self; } - setJustify:(int)mode { switch(mode){ case NX_LEFTALIGNED: case NX_JUSTIFIED: [self appendRTF:"\\ql "]; break; case NX_CENTERED: [self appendRTF:"\\qc "]; break; case NX_RIGHTALIGNED: [self appendRTF:"\\qr "]; break; default: break; } return self; } - endAppend { int maxlen,length; char *ptr; NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen); if(buffer){ NX_ZONEREALLOC([self zone], buffer,char,length + 1); } else { NX_ZONEMALLOC([self zone], buffer,char,length + 1); } strcpy(buffer,ptr); NXCloseMemory(textStream,NX_FREEBUFFER); textStream = NULL; return self; } - write:(NXTypedStream *)stream { NXWriteType(stream,"*",&buffer); return self; } - read:(NXTypedStream *)stream { NXReadType(stream,"*",&buffer); return self; } - awake { [super awake]; textStream = NULL; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.