1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-14 07:30:21 +00:00
Nick Briggs dadb754e56 Resolve "warning: cast from 'DLword *' to 'LispPTR *' increases required alignment from 2 to 4"
by casting through (void *) since we know that the CurrentStackPTR is maintained with 4-byte
   aligned pointers.

Resolve type error for user_subr argument.
2023-02-17 17:01:27 -08:00

180 lines
4.9 KiB
C

/* $Id: miscn.c,v 1.3 1999/05/31 23:35:39 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
/************************************************************************/
/* */
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/************************************************************************/
#include "version.h"
/***********************************************************/
/*
File Name: miscn.c
Including: OP_miscn
*/
/***********************************************************/
#include "arith.h" // for N_GETNUMBER
#include "commondefs.h" // for error
#include "emlglob.h"
#include "lispemul.h" // for LispPTR, state, CurrentStackPTR, TopOfStack
#include "loopsopsdefs.h" // for LCFetchMethod, LCFetchMethodOrHelp, LCFind...
#include "lspglob.h"
#include "lsptypes.h"
#include "miscndefs.h" // for OP_miscn
#include "mvsdefs.h" // for values, values_list
#include "subrs.h" // for miscn_LCFetchMethod, miscn_LCFetchMethodOr...
#include "sxhashdefs.h" // for STRING_EQUAL_HASHBITS, STRING_HASHBITS
#include "usrsubrdefs.h" // for UserSubr
/***********************************************************/
/*
Func Name : OP_miscn
Interface: Global Machine State
Returns: (must UFN)
0 = continue, C code succeeded.
1 = must UFN, C code failed.
*/
/***********************************************************/
int OP_miscn(int misc_index, int arg_count) {
LispPTR *stk;
int result;
static LispPTR args[255];
/* Put the Args into a Vector */
args[0] = NIL_PTR;
stk = ((LispPTR *)(void *)CurrentStackPTR) + 1;
{
int arg_num = arg_count;
if (arg_num > 0) {
*stk++ = (LispPTR)TopOfStack;
while (arg_num > 0) args[--arg_num] = *--stk;
}
}
/* Select the Misc Number */
switch (misc_index) {
case miscn_USER_SUBR: {
int user_subr;
N_GETNUMBER(args[0], user_subr, do_ufn);
if ((result = UserSubr(user_subr, arg_count - 1, &args[1])) < 0) goto do_ufn;
} break;
case miscn_SXHASH: result = SX_hash(args[0]); break;
case miscn_STRING_EQUAL_HASHBITS: result = STRING_EQUAL_HASHBITS(args[0]); break;
case miscn_STRINGHASHBITS: result = STRING_HASHBITS(args[0]); break;
case miscn_VALUES:
if (arg_count > 255) {
error("miscn: arg_count too big! continue punts");
goto do_ufn;
}
result = values(arg_count, args);
break;
case miscn_VALUES_LIST:
/*** debugging: should be impossible, but ADB found this once -FS *****/
if (arg_count > 255) {
error("miscn: arg_count too big! continue punts");
goto do_ufn;
}
result = values_list(arg_count, args);
break;
case miscn_LCFetchMethod:
result = LCFetchMethod(args[0], args[1]);
if (result < 0) goto lc_ufn;
break;
case miscn_LCFetchMethodOrHelp:
result = LCFetchMethodOrHelp(args[0], args[1]);
if (result < 0) goto lc_ufn;
break;
case miscn_LCFindVarIndex:
result = LCFindVarIndex(args[0], args[1]);
if (result < 0) goto lc_ufn;
break;
case miscn_LCGetIVValue:
result = LCGetIVValue(args[0], args[1]);
if (result < 0) goto lc_ufn;
break;
case miscn_LCPutIVValue:
result = LCPutIVValue(args[0], args[1], args[2]);
if (result < 0) goto lc_ufn;
break;
#ifdef RS232
case miscn_RAW_RS232C_OPEN:
if ((result = raw_rs232c_open(args[0])) == NIL) goto do_ufn;
break;
case miscn_RAW_RS232C_CLOSE:
if ((result = raw_rs232c_close(args[0])) == NIL) goto do_ufn;
break;
case miscn_RAW_RS232C_SETPARAM:
if ((result = raw_rs232c_setparams(args[0], args[1])) == NIL) goto do_ufn;
break;
case miscn_RAW_RS232C_GETPARAM:
/******/ break;
case miscn_RAW_RS232C_READ:
if ((result = raw_rs232c_read(args[0], args[1], args[2])) == NIL) goto do_ufn;
break;
case miscn_RAW_RS232C_WRITE:
if ((result = raw_rs232c_write(args[0], args[1], args[2])) == NIL) goto do_ufn;
break;
case miscn_RAW_RS232C_SETINT:
if ((result = raw_rs232c_setint(args[0], args[1])) == NIL) goto do_ufn;
break;
case miscn_CHATTER: result = chatter(args); break;
#endif /* RS232 */
#ifdef JLISP
case miscn_EJLISP:
#ifndef NOWNN
result = ejlisp(args);
#endif
break;
#endif /* JLISP */
case /* miscn_CALL_C*/ 014:
/* result = call_c_fn(args); */
result = 0;
break;
default: goto do_ufn;
} /* switch end */
/* Setup Global Machine State for a Normal Return */
PC += 3;
CurrentStackPTR = (DLword *)(stk - 1);
TopOfStack = (LispPTR)result;
return (0);
/* A UFN request, so return 1 & don't change the Machine State */
do_ufn:
return (1);
lc_ufn:
if (result == -2) {
return (0); /* have built new stack frame */
} else {
goto do_ufn;
}
} /* OP_miscn */