This is Eval-PostScript.m in view mode; [Download] [Up]
#import "Eval.h" @implementation Eval(PostScript) + ps: (char *) format, ... ; { // Format (as in printf) and send to windowserver. // Done in a separate context to provide good // error handling and recovery. The idea is stolen // from Yap. NXStream *dataStream, *errorStream ; char *dataBuffer ; va_list argList ; int len, maxLen ; NXHandler exception; static DPSContext EvalContext = NULL; // The second context id graphicsView = [NXApp transcriptGraphics] ; DPSContext curContext = DPSGetCurrentContext(); [[graphicsView image] lockFocus] ; if(!EvalContext) // create the second context { const char *app = [NXApp appName]; EvalContext = DPSCreateContext(NXGetDefaultValue(app, "NXHost"), NXGetDefaultValue(app, "NXPSName"), NULL, NULL); DPSSetContext(curContext); } dataStream = NXOpenMemory(NULL, 0, NX_READWRITE) ; va_start(argList, format) ; NXVPrintf(dataStream, format, argList) ; NXPutc(dataStream,'\n') ; NXGetMemoryBuffer(dataStream, &dataBuffer, &len, &maxLen); SwitchContextsWithFocus(EvalContext); exception.code = 0 ; NX_DURING DPSWriteData(EvalContext,dataBuffer,len) ; NXPing() ; NX_HANDLER if(NXLocalHandler.code != dps_err_ps) NX_RERAISE() ; else // handle postscript errors locally exception = NXLocalHandler ; NX_ENDHANDLER DPSSetContext(curContext); NXCloseMemory(dataStream,NX_FREEBUFFER) ; [[graphicsView image] unlockFocus] ; if(exception.code) { errorStream = NXOpenMemory(NULL,0,NX_WRITEONLY); DPSPrintErrorToStream(errorStream, (DPSBinObjSeq) exception.data2); NXPrintf(errorStream,"\n%c",0) ; NXFlush(errorStream); NXGetMemoryBuffer(errorStream, &dataBuffer, &len, &maxLen); [Eval printf: "%s\n", dataBuffer] ; NXCloseMemory(errorStream, NX_FREEBUFFER); DPSDestroyContext(EvalContext); EvalContext = NULL; NXRunAlertPanel("Eval","Postcript errors in message\n" "to [ps...] : see transcript",NULL,NULL,NULL) ; } else { [graphicsView display] ; [[graphicsView window] orderFront: self] ; } return self; } + startPS ; { // lock focus on graphics image [[[NXApp transcriptGraphics] image] lockFocus] ; return self ; } + stopPS ; { // unlock focus on graphics image ; display the graphics id graphicsView = [NXApp transcriptGraphics] ; [[graphicsView image] unlockFocus] ; [graphicsView display] ; [[graphicsView window] orderFront: self] ; return self ; } - evalPs: (id) pboard userData: (const char *) uBuf error: (char **) msg ; { // evaluate postscript from pasteboard // fetch the data from pasteboard const char *const *types ; char *text, *buf ; int textLen, i ; BOOL found = NO ; types = [pboard types] ; for(i = 0 ; types[i]; i++) { if(!strcmp(types[i], NXAsciiPboardType)) { found = YES ; break ; } } if(!found) // no ascii found... return self ; [pboard readType:NXAsciiPboardType data:&text length:&textLen]; if(!text || !textLen) return self ; // change text into a null-terminated string buf = alloca(textLen + 1) ; strncpy(buf,text,textLen) ; buf[textLen] = '\0' ; [self message: "Evaluating Postscript..."] ; [Eval ps: buf] ; [self message: ""] ; [pboard deallocatePasteboardData:text length:textLen]; return self ; } - evalPsHelpPanel: sender ; { // evaluate selection in help panel NXSelPt start, end ; int textLen ; char *textBuf ; if(!helpText) [self helpText: sender] ; [helpText getSel:&start :&end] ; textLen = end.cp - start.cp ; textBuf = malloc(textLen + 1) ; if(textBuf) { [helpText getSubstring:textBuf start:start.cp length:textLen] ; textBuf[textLen] = '\0' ; [Eval ps: textBuf] ; } return self ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.