This is HFunction.m in view mode; [Download] [Up]
/* HFunction.m by Paul Kunz May 1992
* Base class for Hippo Functions
*
* Copyright (C) 1991-1992 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*/
#import "HFunction.h"
const char HFunction_h_rcsid[] = HFUNCTION_H_ID;
const char HFunction_m_rcsid[] = "$Id: HFunction.m,v 2.16.2.1 1994/01/05 02:22:11 rensing Exp $";
#import <objc/objc-load.h>
#import <mach-o/rld.h>
#import <appkit/appkit.h>
#define ERRORFILE "/tmp/compErrors"
@interface HFunction(PrivateMethods)
- appendSuffix:(char *)buf;
/*
* Appends a suffix to the filename according to the language.
*/
- (void *) findSymbol:(const char *)string;
/*
* Finds the function string in the symbol table and returns
* its address if found or 0 if not.
*/
@end
@implementation HFunction
- init
{
flags = NXCopyStringBuffer("");
outputDir = NULL;
language = ANSI_C;
function = NULL;
return self;
}
- setFileName:(const char *)fname
{
if (filename) NX_FREE(filename);
filename = NXCopyStringBuffer(fname);
return self;
}
- setOutputDir:(const char *)fname
{
if (outputDir) NX_FREE(outputDir);
outputDir = NXCopyStringBuffer(fname);
return self;
}
- (const char *)outputDir
{
return outputDir;
}
- initFromDirectory:(const char *)path
{
NXStream *oldCodeStream;
char buf[MAXPATHLEN+1];
[self init];
strcpy(buf, path );
strcat(buf, "/");
strcat(buf,name);
[self appendSuffix:buf];
oldCodeStream = codeStream;
codeStream = NXMapFile( buf, NX_READONLY );
if ( !codeStream ) {
codeStream = oldCodeStream;
}
return self;
}
- (const char *)functionName
{
return name;
}
- setFunctionName:(const char *)fname
{
if (name) NX_FREE(name);
name = NXCopyStringBuffer(fname);
return self;
}
- (LANGUAGE) language
{
return language;
}
- setLanguage: (LANGUAGE)lang
{
language = lang;
return self;
}
- (int) saveToTmpFile
{
int pos, fname_len;
int irc;
if ( !codeStream ) return (-1);
pos = strlen(name) + 5;
fname_len = pos + 9;
NX_MALLOC(filename, char, fname_len);
sprintf(filename, "/tmp/%sXXXXXX", name);
filename = NXGetTempFilename(filename, pos);
[self appendSuffix:filename];
irc = NXSaveToFile( codeStream, filename);
NXCloseMemory( codeStream, NX_FREEBUFFER);
return irc;
}
-(const char*) filename
{
return filename;
}
- (void *) funcPointer
{
return function;
}
- setCompileFlags: (const char *)flgs
{
if (flags) NX_FREE(flags);
flags = NXCopyStringBuffer(flgs);
return self;
}
- (const char *) compileFlags;
{
return flags;
}
- getFunctionFrom:sender
{
function = [sender findSymbol:name];
return self;
}
- saveToDirectory:(const char *) directory
{
char buf[MAXPATHLEN+1];
strcpy(buf, directory);
strcat(buf, "/");
strcat(buf, name);
[self appendSuffix:buf ];
codeStream = NXMapFile( filename, NX_READONLY );
if ( codeStream ) {
NXSaveToFile( codeStream, buf);
} else {
NXRunAlertPanel( "Error", "Can not open function file: %s",
"Ok", NULL, NULL, filename );
}
NXCloseMemory( codeStream, NX_FREEBUFFER);
return self;
}
- (int) compile
{
const char *cmd[] = { "cc -Wall", "f77", "cc -Wall -ObjC++",
"cc -Wall" };
char *command;
char *dot;
int rc;
if (!outputDir)
{
ofilename = NXCopyStringBuffer(filename);
}
else
{
char *sl = strrchr(filename,'/');
if (!sl) sl = filename;
else sl++;
ofilename = NXZoneMalloc([self zone],
(strlen(sl) + strlen(outputDir) +
2)*sizeof(char) );
strcpy(ofilename,outputDir);
strcat(ofilename,"/");
strcat(ofilename,sl);
}
dot = strrchr(ofilename,'.');
dot[1] = 'o';
dot[2] = '\0';
command = (char *)malloc( (strlen(cmd[language]) + strlen(flags) +
strlen(ofilename) + strlen(filename) +
40)*sizeof(char) );
sprintf(command, "%s -g -c -o %s %s %s > %s 2>&1",
cmd[language], ofilename, flags, filename, ERRORFILE);
rc = system(command);
/* if ( rc != 0 )
{
free(command);
return rc;
}
sprintf(command, "ld -r -o %s %s.o >> /tmp/compError 2>&1", ofilename,
ofilename);
rc = system(command);
*/
free(command);
return rc;
}
- (int) link
{
NXStream *errorStream;
char template[24] = {"/tmp/compXXXXXX"};
char *tempchar;
char *moduleList[2] = { NULL, NULL };
int irc = 0;
/* errors will get placed here */
errorStream = NXOpenFile(2, NX_WRITEONLY); // stderr is fileno 2
moduleList[0] = NXCopyStringBuffer(ofilename);
tempchar = NXGetTempFilename(template, 9);
irc = objc_loadModules( moduleList, errorStream, NULL, NULL, tempchar );
NXClose(errorStream);
function = [self findSymbol:name];
return irc;
}
- (int) unload
{
NXStream *errorStream;
int irc = 0;
errorStream = NXOpenFile(2, NX_WRITEONLY);
irc = objc_unloadModules(errorStream, NULL);
NXClose(errorStream);
return !irc;
}
- (NXStream *) openMessages
{
NXStream *msgStream;
msgStream = NXMapFile(ERRORFILE, NX_READONLY);
return msgStream;
}
- write:(NXTypedStream *)ts
{
[super write:ts];
NXWriteTypes( ts, "*i", &name, &language );
return self;
}
- read:(NXTypedStream *)ts
{
[super read:ts];
NXReadTypes( ts, "*i", &name, &language );
return self;
}
- free
{
if (codeStream) NXClose(codeStream);
if (filename) NX_FREE(filename);
if (ofilename) NX_FREE(ofilename);
if (flags) NX_FREE(flags);
if (name) NX_FREE(name);
return [super free];
}
@end
@implementation HFunction(PrivateMethods)
- appendSuffix:(char *)buf
{
switch (language) {
case OBJECTIVE_C:
strcat(buf, ".m");
break;
case FORTRAN:
strcat(buf, ".F");
break;
case CPP:
strcat(buf, ".C");
break;
case ANSI_C:
strcat(buf, ".c");
}
return self;
}
- (void *) findSymbol:(const char *)string
{
NXStream *errorStream;
char *symbol_string;
unsigned long symbol = 0;
long irc;
int length;
length = strlen(string)+4;
NX_MALLOC( symbol_string, char, length );
sprintf( symbol_string, "_%s", string);
errorStream = NXOpenFile(2, NX_WRITEONLY);
irc = rld_lookup( errorStream, symbol_string, &symbol );
if ( !irc ) {
symbol = 0;
}
NXClose(errorStream);
NX_FREE(symbol_string);
return (void *)symbol;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.