This is WorkspaceManager.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "WorkspaceManager.h"
#import "MenuManager.h"
#import <appkit/Text.h>
#import <appkit/Panel.h>
#import <objc/objc-load.h>
#import <stdlib.h>
#import <strings.h>
#import <sys/file.h>
#import <sys/types.h>
#import <sys/stat.h>
#import <libc.h>
@implementation WorkspaceManager
- evalSelection:sender
{ // compile and run the workspace selection
char *textBuf, *headerBuf, *cursor, *trueBuf, comBuf[128] ;
char tmpFile[20] = "CBXXXXXX" ;
char *moduleNames[2] ;
NXStream *aStream ;
NXSelPt start, end ;
FILE *fp ;
int textLen, maxLen ;
[self message: "Creating temporary class..."] ;
// get the selected text
[textView getSel:&start :&end] ;
textLen = end.cp-start.cp ;
textBuf = trueBuf = (char *) malloc(textLen) ;
[textView getSubstring:textBuf start:start.cp length:textLen] ;
textBuf[textLen] = '\0' ;
// now find out if we have any header
headerBuf = textBuf ;
while(*headerBuf == ' ' || *headerBuf == '\n' || *headerBuf == '\t')
headerBuf++ ; // scan past any initial whiteSpace
if(!strncmp(headerBuf,"#header",7)) // then we have a header
{ headerBuf += 7 ; // header starts after #header
cursor = headerBuf ;
while(strncmp(cursor,"#endheader", 10)) // find end of header
{ cursor++ ;
cursor = index(cursor,'#') ; // try next hash sign
if(cursor == (char *) 0) // then no #endheader
{ NXRunAlertPanel("CB","Error: no #endheader line found",
NULL,NULL,NULL) ;
free(textBuf) ;
return self ;
}
}
textBuf = &cursor[10] ;
*cursor = '\0' ; // chop string into 2 pieces
}
else
cursor = headerBuf = "" ; // no header at all
// now hack up the file...
mktemp(tmpFile) ;
sprintf(comBuf,"/tmp/%s.m",tmpFile) ;
fp = fopen(comBuf,"w+") ;
fprintf(fp,
"%s\n"
"#import <objc/Object.h>\n"
"#import <objc/HashTable.h>\n"
"@interface DictManager: Object ;\n"
"+ initialize ;\n"
"+ inserKey: (char *) aKey value: (void *) data type: (char *) aType ;\n"
"+ (void *) valueForKey: (char *) aKey type: (char *) aType ;\n"
"@end\n"
"extern id NXApp;\n"
"@interface Doit: Object\n"
"+(void) doit ;\n"
"@end\n\n"
"@implementation Doit\n"
"+ (void) doit\n"
"{\n"
"#line 1\n"
"%s\n"
"}\n"
"@end",
headerBuf, textBuf) ;
fflush(fp) ;
fclose(fp) ;
// free up alloc'ed memory
if(headerBuf[0] != '\0') // string was cut into 2 pieces...
*cursor = ' ' ; // reassemble
free(trueBuf) ; // trueBuf always points to beginning of malloc'ed string
// compile and load the file
[self message: "Compiling..."] ;
sprintf(comBuf, "cc -c -I /usr/include/objc -Wall -o /tmp/%s.o /tmp/%s.m"
" 2> /tmp/%s", tmpFile, tmpFile, tmpFile) ;
if(system(comBuf)) // non-zero exit status == must report the errors
{ sprintf(comBuf,"/tmp/%s",tmpFile) ;
[NXApp appendFileToTranscript: comBuf] ;
NXRunAlertPanel("CB","Compilation errors: see Transcript Window\n",
NULL,NULL,NULL) ;
sprintf(comBuf,"rm /tmp/%s.m /tmp/%s.o /tmp/%s 2> /dev/null",
tmpFile,tmpFile,tmpFile) ;
system(comBuf) ;
[self message: ""] ;
return self ;
}
[self message: "Loading..."] ;
aStream = NXOpenMemory(NULL, 0, NX_READWRITE) ;
sprintf(comBuf,"/tmp/%s.o",tmpFile) ;
moduleNames[0] = comBuf ;
moduleNames[1] = NULL ;
objc_loadModules(moduleNames, aStream, NULL, NULL, NULL) ;
NXPutc(aStream,'\0') ;
NXGetMemoryBuffer(aStream, &textBuf, &textLen, &maxLen);
[NXApp printf: textBuf];
[self message: "Executing..."] ;
objc_msgSend(objc_getClass("Doit"),
sel_getUid("doit")) ;
[self message: ""] ;
objc_unloadModules(aStream, NULL) ;
NXCloseMemory(aStream,NX_TRUNCATEBUFFER) ;
sprintf(comBuf,"rm /tmp/%s.m /tmp/%s.o /tmp/%s 2> /dev/null",
tmpFile,tmpFile,tmpFile) ;
system(comBuf) ;
return self ;
}
- (char *) extension ;
{ // provide file extension
return "wsp" ;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.