This is ManPageWindow.m in view mode; [Download] [Up]
// // ManPageWindow Class // // Harald Schlangmann, 19.7.93 // #undef TEST #import "ManPageWindow.h" #import "ManOpenApp.h" #import "WhereAmI.h" @implementation ManPageWindow - printManPage:sender { [theText printPSCode:sender]; return self; } - close { // Notify Application of Window's close (workaround deadlock) [NXApp perform:@selector(manPageClosed:) with:self afterDelay:1 cancelPrevious:NO]; return [super close]; } - abortLoad { NXRunAlertPanel(NULL,"Cannot open Manual Page " "for ``%s''...",NULL,NULL,NULL,[titleString stringValue]); return [self close]; } - makeKeyAndOrderFront:sender { [super makeKeyAndOrderFront:sender]; return [self makeFirstResponder:theText]; } - free { if( theFile ) NXZoneFree(NXDefaultMallocZone(),theFile); return [super free]; } - loadManPage:(const char *)name { char command[2*FILENAME_MAX]; FILE *pipe; #ifndef TEST NXStream *aStream; #endif char *cptr; BOOL hasCat = NO; // Store filename if( theFile ) NXZoneFree(NXDefaultMallocZone(),theFile); theFile = NXCopyStringBuffer(name); // Prepare window [theText setText:""]; // Prepare short Title cptr = strrchr(theFile,'/'); if( cptr ) { // Check whether catX exists if( cptr-theFile>4&&strncmp(cptr-4,"man",3)==0 ) { struct stat statMan; struct stat statCat; if( stat(theFile,&statMan)==0 ) { cptr[-4] = 'c'; cptr[-2] = 't'; if( stat(theFile,&statCat)==0 ) { if( statCat.st_mtime <statMan.st_mtime ) { cptr[-4] = 'c'; cptr[-2] = 't'; } else hasCat = YES; } else { cptr[-4] = 'm'; cptr[-2] = 'n'; } } } cptr++; } else cptr = theFile; strcpy(command,cptr); cptr = strrchr(command,'.'); if( cptr ) *cptr = '\0'; strcat(command," Manual Page"); [titleString setStringValue:command]; // Loading title if( hasCat ) sprintf(command,"Loading %s...",theFile); else sprintf(command,"Reformating and loading %s...",theFile); [self setTitle:command]; // Order front window now [self makeKeyAndOrderFront:self]; // Create command if( hasCat ) { char buffer[FILENAME_MAX]; sprintf(command,"/bin/cat %s | %s",theFile, [NXApp whereIs:"cat2rtf" path:buffer]); cptr = strrchr(theFile,'/'); cptr[-4] = 'm'; cptr[-2] = 'n'; } else { char buffer[FILENAME_MAX]; sprintf(command,[NXApp nroffCmd],theFile); strcat(command,"| "); strcat(command,[NXApp whereIs:"cat2rtf" path:buffer]); } // Execute command and prepare NXStream for reading pipe = popen(command,"r"); if( !pipe ) return [self abortLoad]; #ifndef TEST aStream = NXOpenFile(fileno(pipe),NX_READONLY); if( !aStream ) { pclose(pipe); return [self abortLoad]; } // Read text [[theText readRichText:aStream] sizeToFit]; #else { int ch = fgetc(pipe); while( ch!=EOF ) { fputc(ch,stderr); ch = fgetc(pipe); } } #endif [self setTitleAsFilename:theFile]; // Close NXStream and file descriptor #ifndef TEST NXClose(aStream); #endif pclose(pipe); [self setMiniwindowIcon:"ManOpen"]; return self; } - (const char *)getFile { return theFile; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.