This is rtfcat.m in view mode; [Download] [Up]
/* * rtfcat [-afpP] [rtf-files] * * Concatenate RTF files on the standard output. * Also a handy way to convert RTF -> ascii / PostScript, etc. * Options: * -a stdout will be plain ascii, folded to 72-char lines * and with some common funny characters (bullets, em dashes, etc) * converted to a crude ascii equivalent. * -f when converting to ascii, don't do the folding and converting. * -p stdout will be PostScript. * -P write output to the PasteBoard. * * Let me know if you make any changes. * NB -- PS won't work with < 3.0 release. See below. * NB -- RTFD wrappers not handled. (They should be!) * * M. J. Hawley * MIT Media Laboratory * 20 Ames Street * Cambridge, MA 02139 * mike@media-lab.mit.edu * Copyright (c) 1992 MIT Media Laboratory. */ #include <appkit/Application.h> #include <appkit/Window.h> #include <appkit/Text.h> #include <streams/streams.h> #define Case break; case #define Default break; default static char *_arg, *_argp; /* use by 'for_each_argument */ static char *av0; /* will hold name of the command */ #define argument (_arg=(*_argp? _argp : av[++i==ac? --i : i]),_argp+=strlen(_argp),_arg) #define for_each_argument av0 = av[0]; for (i=1;i<ac && *av[i]=='-';i++)\ for (_argp = &av[i][1]; *_argp;)\ switch(*_argp++) #define ASCII 0 #define RTF 1 #define PS 2 int WriteOutput = RTF; int ToPasteboard = 0; int Fold = 1; e(a,b,c,d) char *a; { fprintf(stderr,a,b,c,d); fprintf(stderr,"\n"); } use(){ e("use: %s [-apP] [-s #] [rtf-files]",av0); e("Concatenate Rich-Text files on the standard output."); e(" -a write output as plain ascii"); e(" -f don't fold ASCII output"); e(" -p write output as PostScript"); e(" -P send output to Pasteboard"); exit(1); } int folder(){ FILE *p, *popen(); if (!Fold || WriteOutput != ASCII) return fileno(stdout); /* Be careful editing the following kludgy line if using Edit. . . */ p = popen("tr '\\320\\257\\256\\252\\272\\261\\267\' \'\\020\\006\\007\\016\\017\\261\\005\' | sed \'\ns//*/g\ns//--/g\ns//fl/g\ns//fi/g\ns//``/g\ns//\'"\'\'"\'/g\ns/\\. /.\\\n/g\' | fmt","w"); return p? fileno(p) : fileno(stdout); } main(ac, av) char **av; { NXRect r = {36, 82, 500, 720}, b = {0,0,0,0}; NXStream *f, *o; Text *t; Window *w; Pasteboard *pb; int i, l; NXAtom types[] = {NXAsciiPboardType, NXRTFPboardType, (NXAtom)0}; for_each_argument { case 'a': WriteOutput = ASCII; Case 'f': Fold = !Fold; Case 'p': WriteOutput = PS; Case 'P': ToPasteboard = 1; Default : use(); } NXApp = [Application new]; if (ToPasteboard) pb = [Pasteboard new]; t = [[Text alloc] initFrame: &r]; if (!t) e("%s: can't create internal text object\n", av0), exit(1); [t setMonoFont:NO]; [t setGraphicsImportEnabled:YES]; o = NXOpenFile(folder(), NX_WRITEONLY); if (i==ac) ac++; for (; i<ac; i++) { f = av[i]? NXMapFile(av[i], NX_READONLY) : NXOpenFile(fileno(stdin), NX_READONLY); if (!f) e("%s: couldn't open '%s'", av0, av[i]); else { l = [t textLength]; [t setSel:l:l]; [t replaceSelWithRichText:f]; NXClose(f); } } [t calcLine]; l = [t textLength]; switch (WriteOutput){ case ASCII: if (ToPasteboard){ [t setSel:0:l]; [t writeSelectionToPasteboard:pb types:types]; } else [t writeText:o]; Case RTF: if (ToPasteboard){ [t setSel:0:l]; [t writeSelectionToPasteboard:pb types:types]; } else [t writeRichText: o]; Case PS: { NXCoord w, h; [t getMinWidth:&w minHeight:&h maxWidth:r.size.width maxHeight:1.0e38]; r.size.height = h; } w = [[Window alloc] initContent:&r style:NX_TITLEDSTYLE backing:NX_RETAINED buttonMask:NX_CLOSEBUTTONMASK defer:NO]; [t windowChanged:w]; [w setContentView:t]; r.origin.x = r.origin.y = 0.; if (ToPasteboard) [t writePSCodeInside:&r to:pb]; // no can do under 2.x else [t copyPSCodeInside:&r to:o]; } NXClose(o); exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.