This is rtf2ps.m in view mode; [Download] [Up]
// Print RTF files from the command line // (without a connection to the Window Server!) // Eric P. Scott, San Francisco State University, November 1993 // + for NS 2.1 and 3.1 // cc -o rtf2ps -s -O rtf2ps.m -lNeXT_s /* * enhanced to handle multiple files (both .rtf and .rtfd) * and to emit postscript to stdout instead of printing it. * * Steve Hayman * February 1994 * shayman@Objectario.com */ #ifdef NX_COMPILER_RELEASE_3_0 #include <ansi/stdio.h> #import <defaults/defaults.h> #else #include <stdio.h> #import <appkit/defaults.h> #endif #import <streams/streams.h> #import <objc/Object.h> #import <objc/Storage.h> #import <appkit/PrintInfo.h> #import <appkit/Text.h> #import <dpsclient/dpsclient.h> #import <dpsclient/psops.h> @interface FakeApp:Object { id _focusStack; id printInfo; } + initialize; - init; - printInfo; - (BOOL)shouldRunPrintPanel:aView; - (const char *)appName; - (const char *const *)systemLanguages; - _focusStack; - (DPSContext)context; #ifdef NX_COMPILER_RELEASE_3_0 - (BOOL)_calibratedColorOK; #endif @end @implementation FakeApp + initialize { static NXDefaultsVector PRDefaults = { { "NXFont", "Helvetica" }, { "NXFontSize", "12" }, { "NXMargins", "72 72 90 90" }, { "NXPaperType", "Letter" }, #ifdef NX_COMPILER_RELEASE_3_0 { "NXBoldSystemFonts", "Helvetica" }, { "NXSystemFonts", "Helvetica-Bold" }, #endif { (char *)NULL, (char *)NULL } }; NXRegisterDefaults("rtf2ps", PRDefaults); return self; } - init { [super init]; _focusStack=[[Storage allocFromZone:[self zone]] initCount:0 elementSize:10 description:"@*c"]; return self; } - printInfo { if (!printInfo) printInfo=[[PrintInfo allocFromZone:[self zone]] init]; return printInfo; } - (BOOL)shouldRunPrintPanel:aView { return NO; } - (const char *)appName { return "rtf2ps"; } - (const char *const *)systemLanguages { return (const char *const *)NULL; } - _focusStack { return _focusStack; } - (DPSContext)context { return (DPSContext)NULL; } #ifdef NX_COMPILER_RELEASE_3_0 - (BOOL)_calibratedColorOK { return YES; } #endif @end @interface Text(printrtf) - (BOOL)lockFocus; - unlockFocus; - (BOOL)getVisibleRect:(NXRect *)theRect; #ifndef NX_COMPILER_RELEASE_3_0 - beginPSOutput; #endif - display:(const NXRect *)rects :(int)rectCount :(BOOL)clipFlag; - spoolFile:(const char *)filename; @end @implementation Text(printrtf) - (BOOL)lockFocus { return (NXDrawingStatus==NX_PRINTING) ? NO : [super lockFocus]; } - unlockFocus { return (NXDrawingStatus==NX_PRINTING) ? self : [super unlockFocus]; } - (BOOL)getVisibleRect:(NXRect *)theRect { if (NXDrawingStatus!=NX_PRINTING) return [super getVisibleRect:theRect]; [self getBounds:theRect]; return YES; } #ifndef NX_COMPILER_RELEASE_3_0 - beginPSOutput { extern id NXApp; [[NXApp printInfo] setPageOrder:NX_ASCENDINGORDER]; return [super beginPSOutput]; } #endif - display:(const NXRect *)rects :(int)rectCount :(BOOL)clipFlag { if (NXDrawingStatus!=NX_PRINTING) return [super display:rects:rectCount:clipFlag]; PSgsave(); PStranslate(0.0, -frame.size.height+ (rects[0].size.height+rects[0].origin.y)*2.0); PSscale(1.0, -1.0); [self drawSelf:rects:rectCount]; PSgrestore(); return self; } - spoolFile:(const char *)filename { extern id NXApp; id pi; const char *pn; int cp; char cmd[256]; pi=[NXApp printInfo]; (void)strcpy(cmd, "exec lpr"); #ifdef NX_COMPILER_RELEASE_3_0 if ((pn=[[pi printer] name])&&*pn) { #else if ((pn=[pi printerName])&&*pn) { #endif (void)strcat(cmd, " -P"); (void)strcat(cmd, pn); } if ((cp=[pi copies])>1) (void)sprintf(&cmd[strlen(cmd)], " -#%d", cp); (void)strcat(cmd, " -r -s "); (void)strcat(cmd, filename); /* * forget all that, just ship it to stdout ...sah */ sprintf(cmd, "cat %s", filename); (void)system(cmd); /* really should check status here! */ return self; } @end main(int argc, char *argv[]) { extern id NXApp; register int i; NXStream *f; Text *t; int errs; NXRect fr; char *streambuf; int len, maxlen; id pi; char path[24]; errs=0; [Text excludeFromServicesMenu:YES]; NXApp=[[FakeApp alloc] init]; pi=[NXApp printInfo]; [pi setHorizCentered:NO]; [pi setVertCentered:NO]; #ifdef NX_COMPILER_RELEASE_3_0 [pi setReversePageOrder:YES]; #endif for (i=1;i<argc;i++) { const NXSize large={ 504.0, 1.0e38 }; char *extension; char *rindex(); BOOL isRTFD; extension = rindex( argv[i], '.' ); isRTFD = (extension && (strcmp(extension, ".rtfd") == 0)); if (!isRTFD && !(f=NXMapFile(argv[i], NX_READONLY))) { perror(argv[i]); errs++; continue; } if ( !isRTFD ) NXGetMemoryBuffer(f, &streambuf, &len, &maxlen); NXSetRect(&fr, 0.0, 0.0, 504.0, 21.0); t=[[Text alloc] initFrame:&fr]; [t setMaxSize:&large]; [t setVertResizable:YES]; if ( isRTFD ) { [t setMonoFont:NO]; [t openRTFDFrom:argv[i]]; } else if (streambuf&&!strncmp(streambuf, "{\\rtf0\\", 7)) { [t setMonoFont:NO]; [t readRichText:f]; } else [t readText:f]; [t sizeToFit]; (void)strcpy(path, "/tmp/.printrtfXXXXXX.ps"); (void)NXGetTempFilename(path, 14); [pi setOutputFile:path]; #if 0 if ( isRTFD ){ NXStream *s = NXOpenMemory(NULL, 0L, NX_READWRITE); int c; [t writeRTFDTo:s]; NXSeek(s, 0L, NX_FROMSTART); while ((c = NXGetc(s)) >= 0 ) printf("%c",c); } #endif [t printPSCode:NXApp]; unlink( path ); // sah if ( !isRTFD ) NXCloseMemory(f, NX_FREEBUFFER); } exit(errs); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.