1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-27 04:12:51 +00:00

Maiko sources matching state as of 020102 prior to initial patching for Mac OSX

This commit is contained in:
Nick Briggs
2015-04-20 18:53:52 -07:00
commit de170a64d9
427 changed files with 129342 additions and 0 deletions

997
src/foreign.c Executable file
View File

@@ -0,0 +1,997 @@
/* $Id: foreign.c,v 1.3 1999/05/31 23:35:28 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
static char *id = "$Id: foreign.c,v 1.3 1999/05/31 23:35:28 sybalsky Exp $ Copyright (C) Venue";
/************************************************************************/
/* */
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/* The contents of this file are proprietary information */
/* belonging to Venue, and are provided to you under license. */
/* They may not be further distributed or disclosed to third */
/* parties without the specific permission of Venue. */
/* */
/************************************************************************/
#include "version.h"
#ifndef NOFORN
#include <sys/param.h>
#include "dld.h"
#include "lispemul.h"
#include "lspglob.h"
#include "emlglob.h"
#include "adr68k.h"
#include "lispmap.h"
#include "lsptypes.h"
#include "locfile.h"
#include "medleyfp.h"
#include "arith.h"
#include "stack.h"
/***********************************************************/
/* L S t r i n g T o C S t r i n g */
/* */
/* Convert a lisp string to a C string up to MaxLen long. */
/***********************************************************/
#define LStringToCString(Lisp, C, MaxLen ,Len) \
{ \
OneDArray *arrayp; \
char *base; \
short *sbase; \
int i; \
\
arrayp = (OneDArray *)(Addr68k_from_LADDR((unsigned int)Lisp)); \
Len = min(MaxLen, arrayp->fillpointer); \
\
switch(arrayp->typenumber) \
{ \
case THIN_CHAR_TYPENUMBER: \
base = ((char *) \
(Addr68k_from_LADDR((unsigned int)arrayp->base))) \
+ ((int)(arrayp->offset)); \
for(i=0;i<Len;i++) \
C[i] = base[i]; \
C[Len] = '\0'; \
break; \
\
case FAT_CHAR_TYPENUMBER: \
sbase = ((short *) \
(Addr68k_from_LADDR((unsigned int)arrayp->base))) \
+ ((int)(arrayp->offset)); \
base = (char *)sbase; \
for(i=0;i<Len*2;i++) \
C[i] = base[i]; \
C[Len*2] = '\0'; \
break; \
\
default: \
error("LStringToCString can not handle\n"); \
} \
}
/************************************************************************/
/* */
/* F O R E I G N - F U N C T I O N C A L L I N T E R F A C E */
/* */
/* */
/* */
/************************************************************************/
/* void ( *fn ) () = args[0];
(*fn)();
return(NIL);
*/
#define VOIDTYPE 0
typedef void (*PFV)(); /* Pointer to Function returning Void */
typedef int (*PFI)(); /* Pointer to Function returning Int */
typedef char (*PFC)(); /* Pointer to Function returning Char */
typedef float (*PFF)(); /* Pointer to Function returning Float */
typedef int (*PFP)(); /* Pointer to Function returning a Pointer */
/************************************************************************/
/* */
/* C A L L _ C _ F N */
/* */
/* args[0]: descriptor block for the function */
/* 0 is the function address if the function is callable */
/* or 0 if the function is undefined or unresolved */
/* 1 is the result type */
/* 2 is the error return flag: 0=no errors. 1 if there's */
/* some problem */
/* 3 is the lenght of the arglist passed */
/* 4 is the pointer to the smasher place or 0 if return */
/* 5-n the arglist types */
/* args[1-<number-of-args+1>]: arguments */
/* */
/************************************************************************/
#define Max_Arg 32
LispPTR call_c_fn(LispPTR *args)
{
int intarg[Max_Arg], result, i, j;
int fnaddr, resulttype, *errorflag, *smasher, arglistlength, *descriptorblock;
PFI pickapart1, pickapart2, pickapart3, pickapart4;
float fresult;
DLword *fword, *createcell68k(unsigned int type);
FX2 *caller;
struct fnhead *fnhead;
ByteCode *pc;
/* Initialize the variables from the descriptorblock */
descriptorblock = (int *)Addr68k_from_LADDR(args[0]);
fnaddr=*descriptorblock++;
resulttype=*descriptorblock++;
errorflag=descriptorblock++;
arglistlength=*descriptorblock++;
smasher=descriptorblock++;
/* initialize the errorflag */
*errorflag=0;
/* Initialize the argvector */
for(i=0; i<Max_Arg ; i++){ intarg[i]=0; };
/* Test the function addr. If it is 0 we can not execute. */
if (fnaddr==0) {
*errorflag= -1;
return(NIL);
}
#ifdef TRACE
{ int *tracedesc;
printf("Start Foreign function call=====\n");
tracedesc = (int *)Addr68k_from_LADDR(args[0]);
printf("fnaddr: %d\n", *tracedesc++);
printf("resulttype: %d\n", *tracedesc++);
printf("errorflag: %d\n", *tracedesc++);
printf("arglistlength: %d\n", *tracedesc++);
printf("smasher: %d\n", *tracedesc++);
for (i=0; i<arglistlength; i++){
printf("arg[%d]= %d\n",i , *tracedesc++);
}
printf("End Foreign function call=====\n");
}
#endif /* TRACE */
for(i=1, j=0; i<(arglistlength + 1) ; i++, j++){
int expectedtype;
expectedtype=*descriptorblock++;
switch (GetTypeNumber( args[i] )){
case TYPE_ARRAYBLOCK :
*errorflag=i;
return(NIL);
break;
case TYPE_SMALLP :
if(expectedtype <= TYPE_FIXP) {
intarg[j] = LispIntToCInt(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_FIXP :
if(expectedtype <= TYPE_FIXP) {
intarg[j] = LispIntToCInt(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_FLOATP :
if(expectedtype == TYPE_FLOATP) {
float temp;
temp = FLOATP_VALUE(args[i]);
intarg[j++] = pickapart1(temp);
intarg[j++] = pickapart2(temp);
intarg[j++] = pickapart3(temp);
intarg[j++] = pickapart4(temp);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_LITATOM :
case TYPE_NEWATOM:
if(expectedtype == TYPE_LITATOM) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_LISTP :
if(expectedtype == TYPE_LISTP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_ARRAYP :
if(expectedtype == TYPE_ARRAYP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_STRINGP :
*errorflag=i;
return(NIL);
break;
case TYPE_STACKP :
*errorflag=i;
return(NIL);
break;
case TYPE_CHARACTERP :
if(expectedtype == TYPE_CHARACTERP) {
intarg[j] = (0xFFFF & args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_VMEMPAGEP :
*errorflag=i;
return(NIL);
break;
case TYPE_STREAM :
*errorflag=i;
return(NIL);
break;
case TYPE_BITMAP :
if(expectedtype == TYPE_BITMAP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_COMPILED_CLOSURE :
break;
case TYPE_ONED_ARRAY :
if(expectedtype == TYPE_ONED_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_TWOD_ARRAY :
if(expectedtype == TYPE_TWOD_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_GENERAL_ARRAY :
if(expectedtype == TYPE_GENERAL_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_BIGNUM :
if(expectedtype == TYPE_BIGNUM) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_RATIO :
if(expectedtype == TYPE_RATIO) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_COMPLEX :
if(expectedtype == TYPE_COMPLEX) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_PATHNAME :
break;
default:
*errorflag=i;
return(NIL);
break;
}
}
switch (resulttype) {
case VOIDTYPE:
((PFV)fnaddr)(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
caller = (FX2 *) CURRENTFX; /* Don't return values, just continue. */
fnhead = (struct fnhead *)
Addr68k_from_LADDR(POINTERMASK & swapx((int)caller->fnheader));
pc = (ByteCode *)fnhead+(caller->pc);
break;
case TYPE_SMALLP:
case TYPE_FIXP:
{ int tmp;
tmp = ((PFI)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
return(CIntToLispInt(tmp));
};
break;
case TYPE_CHARACTERP:
{ int tmp;
tmp = ((PFC)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
return(S_CHAR | tmp);
};
break;
case TYPE_FLOATP:
fresult = ((PFF)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
fword = createcell68k(TYPE_FLOATP);
*((float *)fword) = fresult;
return(LADDR_from_68k(fword));
break;
default:
*errorflag=-2;
break;
}
}
/************************************************************************/
/* */
/* S M A S H I N G _ C _ F N */
/* */
/* args[0]: descriptor block for the function */
/* 0 is the function address if the function is callable */
/* or 0 if the function is undefined or unresolved */
/* 1 is the result type */
/* 2 is the error return flag: 0=no errors. 1 if there's */
/* some problem */
/* 3 is the lenght of the arglist passed */
/* 4-n the arglist types */
/* args[1]: Smashing place */
/* args[2 - <number-of-args+1>]: arguments */
/* */
/* This is an aboration. It is only implemented on the speciffic */
/* request of an influential customer. The things we do for money! */
/* */
/* The result of this functioncall will be smashed into what */
/* arg[0] points to. If it is a cell of the right type we are ok. */
/* If it is not we are on the road to hell. /jarl nilsson */
/* */
/************************************************************************/
LispPTR smashing_c_fn(LispPTR *args)
{
int intarg[Max_Arg], result, i, j;
int fnaddr, resulttype, *errorflag, arglistlength, *descriptorblock;
PFI pickapart1, pickapart2, pickapart3, pickapart4;
float fresult;
int *valueplace;
DLword *fword, *createcell68k(unsigned int type);
FX2 *caller;
struct fnhead *fnhead;
ByteCode *pc;
/* Initialize the variables from the descriptorblock */
descriptorblock = (int *)Addr68k_from_LADDR(args[0]);
fnaddr=*descriptorblock++;
resulttype=*descriptorblock++;
errorflag=descriptorblock++;
arglistlength=*descriptorblock++;
/* initialize the errorflag */
*errorflag=0;
/* Initialize the valueplace */
valueplace = (int *)Addr68k_from_LADDR(args[1]);
/* Initialize the argvector */
for(i=0; i<Max_Arg ; i++){ intarg[i]=0; };
/* Test the function addr. If it is 0 we can not execute. */
if (fnaddr==0) {
*errorflag=-1;
return(NIL);
}
for(i=2, j=0; i<(arglistlength + 2) ; i++, j++){
int expectedtype;
expectedtype=*descriptorblock++;
switch (GetTypeNumber( args[i] )){
case TYPE_ARRAYBLOCK :
*errorflag=i;
return(NIL);
break;
case TYPE_SMALLP :
if(expectedtype <= TYPE_FIXP) {
intarg[j] = LispIntToCInt(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_FIXP :
if(expectedtype <= TYPE_FIXP) {
intarg[j] = LispIntToCInt(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_FLOATP :
if(expectedtype == TYPE_FLOATP) {
float temp;
temp = FLOATP_VALUE(args[i]);
intarg[j++] = pickapart1(temp);
intarg[j++] = pickapart2(temp);
intarg[j++] = pickapart3(temp);
intarg[j++] = pickapart4(temp);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_LITATOM :
case TYPE_NEWATOM:
if(expectedtype == TYPE_LITATOM) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_LISTP :
if(expectedtype == TYPE_LISTP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_ARRAYP :
if(expectedtype == TYPE_ARRAYP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_STRINGP :
*errorflag=i;
return(NIL);
break;
case TYPE_STACKP :
*errorflag=i;
return(NIL);
break;
case TYPE_CHARACTERP :
if(expectedtype == TYPE_CHARACTERP) {
intarg[j] = (char)(0xFF && args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_VMEMPAGEP :
*errorflag=i;
return(NIL);
break;
case TYPE_STREAM :
*errorflag=i;
return(NIL);
break;
case TYPE_BITMAP :
if(expectedtype == TYPE_BITMAP) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_COMPILED_CLOSURE :
break;
case TYPE_ONED_ARRAY :
if(expectedtype == TYPE_ONED_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_TWOD_ARRAY :
if(expectedtype == TYPE_TWOD_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_GENERAL_ARRAY :
if(expectedtype == TYPE_GENERAL_ARRAY) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_BIGNUM :
if(expectedtype == TYPE_BIGNUM) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_RATIO :
if(expectedtype == TYPE_RATIO) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_COMPLEX :
if(expectedtype == TYPE_COMPLEX) {
intarg[j] = *(int *)Addr68k_from_LADDR(args[i]);
} else {
*errorflag=i;
return(NIL);
}
break;
case TYPE_PATHNAME :
break;
default:
*errorflag=i;
return(NIL);
break;
}
}
switch (resulttype) {
case VOIDTYPE:
((PFV)fnaddr)(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
caller = (FX2 *) CURRENTFX; /* Don't return values, just continue. */
fnhead = (struct fnhead *)
Addr68k_from_LADDR(POINTERMASK & swapx((int)caller->fnheader));
pc = (ByteCode *)fnhead+(caller->pc);
break;
case TYPE_SMALLP:
case TYPE_FIXP:
{ int tmp;
tmp = ((PFI)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
*valueplace=tmp;
return(NIL);
};
break;
case TYPE_CHARACTERP:
return(S_CHAR | (((PFC)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
)));
break;
case TYPE_FLOATP:
fresult = ((PFF)fnaddr)
(intarg[0], intarg[1], intarg[2], intarg[3],
intarg[4], intarg[5], intarg[6], intarg[7],
intarg[8], intarg[9], intarg[10], intarg[11],
intarg[12], intarg[13], intarg[14], intarg[15],
intarg[16], intarg[17], intarg[18], intarg[19],
intarg[20], intarg[21], intarg[22], intarg[23],
intarg[24], intarg[25], intarg[26], intarg[27],
intarg[28], intarg[29], intarg[30], intarg[31]
);
*valueplace=fresult;
return(NIL);
break;
default:
*errorflag=-2;
break;
}
}
/************************************************************************/
/* */
/* M d l d _ l i n k */
/* */
/* args[0] - The lisp string name of the path to the filename */
/* Return value: 0 -> ok. */
/* 1 - 16 -> errorcode */
/* */
/************************************************************************/
int Mdld_link(LispPTR *args)
{
char filename[MAXPATHLEN];
int result, leng;
#ifdef TRACE
printf( "TRACE: dld_link(" );
#endif
LStringToCString( args[0], filename, MAXPATHLEN, leng);
#ifdef TRACE
printf( "%s)\n", filename );
#endif
result = dld_link( filename );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ u n l i n k _ b y _ f i l e */
/* */
/* args[0] - The lisp string name of the path to the filename */
/* args[1] - Force flag. If NonZero, force the unlinking, even */
/* if there are references to this module. */
/* Return value: 0 -> ok. */
/* 1 - 16 -> errorcode */
/* */
/************************************************************************/
int Mdld_unlink_by_file(LispPTR *args)
{
char filename[MAXPATHLEN];
int hard, result, leng;
#ifdef TRACE
printf( "TRACE: dld_unlink_by_file(" );
#endif
LStringToCString( args[0], filename, MAXPATHLEN, leng );
hard = GetSmalldata( args[1] );
#ifdef TRACE
printf( "%s, %d)\n", filename, hard );
#endif
result = dld_unlink_by_file( filename, hard );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ u n l i n k _ b y _ s y m b o l */
/* */
/* args[0] - The lisp string name of the symbol in some module. */
/* args[1] - Force flag. If NonZero, force the unlinking, even */
/* if there are references to this module. */
/* Return value: 0 -> ok. */
/* 1 - 16 -> errorcode */
/* */
/************************************************************************/
int Mdld_unlink_by_symbol(LispPTR *args)
{
char symbolname[MAXPATHLEN];
int hard, result, leng;
#ifdef TRACE
printf( "TRACE: dld_unlink_by_symbol(" );
#endif
LStringToCString( args[0], symbolname, MAXPATHLEN, leng );
hard = GetSmalldata( args[1] );
#ifdef TRACE
printf( "%s, %d)\n", symbolname, hard );
#endif
result = dld_unlink_by_symbol( symbolname, hard );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ g e t _ s y m b o l */
/* */
/* args[0] - The lisp string name of the symbol. */
/* Return value - a pointer to the symbol or 0 */
/* */
/************************************************************************/
unsigned long Mdld_get_symbol(LispPTR *args)
{
char symbolname[MAXPATHLEN];
int result, leng;
#ifdef TRACE
printf( "TRACE: dld_get_symbol(" );
#endif
LStringToCString( args[0], symbolname, MAXPATHLEN, leng );
#ifdef TRACE
printf( "%s, %d)\n", symbolname );
#endif
result = dld_get_symbol( symbolname );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ g e t _ f u n c */
/* */
/* args[0] - The lisp string name of the function. */
/* Return value - a pointer to the function or 0. */
/* */
/************************************************************************/
unsigned long Mdld_get_func(LispPTR *args)
{
char funcname[MAXPATHLEN];
int result, leng;
#ifdef TRACE
printf( "TRACE: dld_get_func(" );
#endif
LStringToCString( args[0], funcname, MAXPATHLEN, leng );
#ifdef TRACE
printf( "%s )\n", funcname );
#endif
result = dld_get_func( funcname );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ f u n c t i o n _ e x e c u t a b l e _ p */
/* */
/* args[0] - The lisp string name of the function. */
/* */
/************************************************************************/
int Mdld_function_executable_p(LispPTR *args)
{
char funcname[MAXPATHLEN];
int result, leng;
#ifdef TRACE
printf( "TRACE: dld_function_executable_p(" );
#endif
LStringToCString( args[0], funcname, MAXPATHLEN, leng );
#ifdef TRACE
printf( "%s, %d)\n", funcname );
#endif
result = dld_function_executable_p( funcname );
N_ARITH_SWITCH ( result );
};
/************************************************************************/
/* */
/* M d l d _ l i s t _ u n d e f i n e d _ s y m */
/* */
/* */
/************************************************************************/
int Mdld_list_undefined_sym(void)
{
char **dld_list_undefined_sym();
int temp;
extern int dld_undefined_sym_count;
#ifdef TRACE
printf( "TRACE: dld_list_undefined_sym()\n" );
#endif
if (dld_undefined_sym_count == 0) {
return (NIL);
}
temp = (int)dld_list_undefined_sym( );
N_ARITH_SWITCH ( temp );
};
/************************************************************************/
/* */
/* m a l l o c */
/* */
/* */
/************************************************************************/
int c_malloc (LispPTR *args)
{
printf ("malloc!\n");
return(NIL);
}
/************************************************************************/
/* */
/* f r e e */
/* */
/* */
/************************************************************************/
int c_free (LispPTR *args)
{
printf ("free!\n");
return(NIL);
}
/************************************************************************/
/* */
/* P U T B A S E B Y T E */
/* */
/* arg[0] = the base address. */
/* arg[1] = the offset as calculated by the type */
/* arg[2] = type of access. */
/* 0 = set the bit pointed out by address + offset */
/* 1 = set the byte pointed out by address + offset */
/* 2 = set the word (16bit) pointed to by address + offset */
/* 3 = set the integer pointed out by address + offset */
/* 4 = set the float pointed out by address + offset */
/* arg[3] = the new value. */
/* The offset changes depending on the type argument. If type is */
/* 0 the changed value will be the bit at ADDRESS + OFFSET bits. */
/* If type is 1 the changedvalue will be the byte at ADDRESS + */
/* OFFSET bytes. If type is 2 the changed value will be the int */
/* at ADDRESS + OFFSET. */
/* */
/* This makes it easy to set values in arrays. */
/* */
/************************************************************************/
int put_c_basebyte (LispPTR *args)
{
int addr, offset, newval;
addr = LispIntToCInt(args[0]);
offset = LispIntToCInt(args[1]);
newval= LispIntToCInt(args[3]);
switch (LispIntToCInt(args[2])) {
case 0: /* bit */
if (newval == 0) {
GETBYTE((char *)(addr + (offset >> 3))) &= (~(1 << (0x7 & offset)));
} else {
GETBYTE((char *)(addr + (offset >> 3))) |= (1 << (0x7 & offset));
};
break;
case 1: /* byte */
GETBYTE((char*)(addr + offset)) = 0xFF & newval;
break;
case 2: /* word */
newval &= 0xFFFF;
(*((short *) ((addr & 0xFFFFFFFE) + (offset << 1)))) = newval;
break;
case 3: /* int */
(*((int *) ((addr & 0xFFFFFFFE) + (offset << 2)))) = newval;
break;
case 4: /* float */
(*((float *) ((addr & 0xFFFFFFFE) + (offset << 2)))) = FLOATP_VALUE(args[3]);
break;
}
return(NIL);
}
/************************************************************************/
/* */
/* G E T _ C _ B A S E B Y T E */
/* */
/* arg[0] = the base address. */
/* arg[1] = the offset as calculated by the type */
/* arg[2] = type of access. */
/* 0 = get the bit pointed out by address + offset */
/* 1 = get the byte pointed out by address + offset */
/* 2 = get the word (16bit) pointed to by address + offset */
/* 3 = get the integer pointed out by address + offset */
/* 4 = get the float pointed out by address + offset */
/* The offset changes depending on the type argument. If type */
/* is 0 the return value will be the bit at ADDRESS + OFFSET bits. */
/* If type is 1 the return value will be the byte at ADDRESS + */
/* OFFSET bytes. If type is 2 the return value will be the integer */
/* at ADDRESS + OFFSET. */
/* */
/* This makes it easy to access arrays. */
/* */
/************************************************************************/
int get_c_basebyte(LispPTR *args)
{
int addr, offset, type;
DLword *fword, *createcell68k(unsigned int type);
addr = LispIntToCInt(args[0]);
offset = LispIntToCInt(args[1]);
switch (LispIntToCInt(args[2])) {
case 0: /* bit */
if ((GETBYTE((char *)(addr + (offset >> 3)))) & (1 << (0x7 & offset))) {
/* ^get bitmask from offset ^get the byte at the byteaddress */
return(ATOM_T);
} else {
return(NIL);
};
break;
case 1: /* byte */
return((0xFF & (GETBYTE((char *)(addr + offset)))) | S_POSITIVE);
break;
case 2: /* word */
return( CIntToLispInt (0xFFFF & (*((short *) ((addr & 0xFFFFFFFE) + (offset << 1))))));
break;
case 3: /* int */
return( CIntToLispInt (*((int *) ((addr & 0xFFFFFFFE) + (offset << 2)))));
break;
case 4: /* float */
fword = createcell68k(TYPE_FLOATP);
*((float *)fword) = *(float *)((addr & 0xFFFFFFFE) + (offset << 2));
return(LADDR_from_68k(fword));
break;
}
}
#endif /* NOFORN */