123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- I have just manufactured a version of CSL that is (perhaps) easy to call
- from other C code. What follows is the main chunk of code that shows
- what the interface is. What this means wrt REDUCE is that I will want to
- manufacture an alternative to (BEGIN) that reads-simplifies-prints just
- one REDUCE expression/command at a time rather than the current single
- function that gobbles things for ever....
- /* Signature: 38b248eb 26-Apr-1996 */
- /*
- * The next fragment of code is to help with the use of CSL (and hence
- * packages written in Lisp and supported under CSL) as OEM products
- * embedded within larger C-coded packages. There is (of course) a
- * significant issue about clashes between the names of external symbols
- * if CSL is to be linked with anything else, but I will not worry about that
- * just yet.
- * The protocol for calling Lisp code from C is as follows:
- *
- * cslstart(argc, argv, writer);allocate memory and Lisp heap etc. Args
- * should be "as if" CSL was being called
- * directly and this was the main entrypoint.
- * The extra arg accepts output from this
- * stage. Use NULL to get standard I/O.
- * execute_lisp_function(fname, reader, writer);
- * fname is a (C) string that names a Lisp
- * function of 0 args. This is called with
- * stdin/stdout access redirected to use the
- * two character-at-a-time functions passed
- * down. [Value returned indicates if
- * the evaluation succeeded?]
- * cslfinish(writer); Tidies up ready to stop.
- */
-
- 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;
- }
- #ifdef SAMPLE_OF_PROCEDURAL_INTERFACE
- static char ibuff[100], obuff[100];
- static int ibufp = 0, obufp = 0;
- static int iget()
- {
- int c = ibuff[ibufp++];
- if (c == 0) return EOF;
- else return c;
- }
- static void iput(int c)
- {
- if (obufp < sizeof(obuff)-1)
- { obuff[obufp++] = c;
- obuff[obufp] = 0;
- }
- }
- #endif
- int MS_CDECL main(int argc, char *argv[])
- {
- cslstart(argc, argv, NULL);
- #ifdef SAMPLE_OF_PROCEDURAL_INTERFACE
- strcpy(ibuff, "(print '(a b c d))");
- execute_lisp_function("oem-supervisor", iget, iput);
- printf("Buffered output is <%s>\n", obuff);
- #else
- cslaction();
- #endif
- my_exit(cslfinish(NULL));
- return 0;
- }
- ...............................end
|