/*
* Code to assist in making CSL startable from within Maple. This
* version of the code is customised to assist with the "tay" package...
* but variations on this code to support interfacing from Maple to
* REDUCE or other Lisp packages could follow the same pattern.
*
* This is NOT production code - it is part of an experiment that
* Codemist was at one stage making.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdarg.h>
/* Signature: 0f7fe05a 27-Jun-2005 */
/*
* As of 17 Sept 2001 when I try to build a DLL for CSL for use with
* Maple I find a moan about atexit() being undefined. Since I do not
* really need a working version of it when CSL is called as a foreign
* function I find the easiest fix is to provide the dummy version here.
* But when the underlying issue is resolved this silly definition will
* need to be removed again.
*/
int atexit(void (*fn)())
{
}
/*
* The sizes of the buffers here are arbitrary and a trap for
* the over-enthusiastic!
*/
static char ibuff[1000], obuff[100000];
static int ibufp = 0, obufp = 0;
static int iget()
{
int c = ibuff[ibufp++];
if (c == 0) return EOF;
else return c;
}
static int iput(int c)
{
if (obufp < sizeof(obuff)-1)
{ obuff[obufp++] = c;
obuff[obufp] = 0;
}
return 0;
}
void start_csl()
{
char *argv[5];
int argc = 0;
argv[argc++] = "/scl/people/guests/norman/rtaylor/tay";
argv[argc++] = "-v";
argv[argc++] = "--";
argv[argc++] = "/scl/people/guests/norman/rtaylor/tay.out";
obufp = 0;
cslstart(argc, argv, iput);
fprintf(stderr, "%s\n", obuff);
}
#include "machine.h"
#include "tags.h"
#include "externs.h"
#include "stream.h"
#include "entries.h"
int execute_lisp_function(char *fname,
character_reader *r, character_writer *w)
{
Lisp_Object nil;
Lisp_Object ff = make_undefined_symbol(fname);
nil = C_nil;
if (exception_pending()) return 1; /* Failed to make the symbol */
procedural_input = r;
procedural_output = w;
Lapply0(nil, ff);
procedural_input = NULL;
procedural_output = NULL;
nil = C_nil;
if (exception_pending()) return 2; /* Failure during evaluation */
return 0;
}
void use_csl(char *s)
{
fprintf(stderr, "calling CSL : <%s>\n", s);
if (strlen(s) >= sizeof(ibuff))
{ fprintf(stderr, "Input string is too long\n");
return;
}
strcpy(ibuff, s);
ibufp = obufp = 0;
execute_lisp_function("read_tay", iget, NULL /*iput*/);
/* fprintf(stderr, "%s\n", obuff); */
}
int execute_lisp_function1(char *fname, Lisp_Object arg,
character_reader *r, character_writer *w)
{
Lisp_Object nil;
Lisp_Object ff = make_undefined_symbol(fname);
nil = C_nil;
if (exception_pending()) return 1; /* Failed to make the symbol */
procedural_input = r;
procedural_output = w;
Lapply1(nil, ff, arg);
procedural_input = NULL;
procedural_output = NULL;
nil = C_nil;
if (exception_pending()) return 2; /* Failure during evaluation */
return 0;
}
void use_csl1(unsigned int s)
{
ibufp = obufp = 0;
execute_lisp_function1("maple_tay", encapsulate_pointer((void *)s),
iget, iput);
fprintf(stderr, "%s\n", obuff);
fflush(stderr);
}
/* end of maple_interface.c */