Artifact 5e81286c94e475cbb8fc5fd4a6e3bc0306c9cc0af0a0795e40c50c20acf7767b:
- Executable file
r38/lisp/csl/cslbase/maple_interface.c
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 3490) [annotate] [blame] [check-ins using] [more...]
/* * 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 */