2017-04-25 14:41:48 +02:00
|
|
|
/*************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* lispMain.c --
|
|
|
|
|
*
|
|
|
|
|
* This module contains the mini-scheme interpreter interface.
|
|
|
|
|
*
|
|
|
|
|
* (c) 1996 California Institute of Technology
|
|
|
|
|
* Department of Computer Science
|
|
|
|
|
* Pasadena, CA 91125.
|
|
|
|
|
*
|
|
|
|
|
* Permission to use, copy, modify, and distribute this software
|
|
|
|
|
* and its documentation for any purpose and without fee is hereby
|
|
|
|
|
* granted, provided that the above copyright notice appear in all
|
|
|
|
|
* copies. The California Institute of Technology makes no representations
|
|
|
|
|
* about the suitability of this software for any purpose. It is
|
|
|
|
|
* provided "as is" without express or implied warranty. Export of this
|
|
|
|
|
* software outside of the United States of America may require an
|
|
|
|
|
* export license.
|
|
|
|
|
*
|
2020-05-23 01:10:54 +02:00
|
|
|
* $Id$
|
2017-04-25 14:41:48 +02:00
|
|
|
*
|
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
#include "lisp/lisp.h"
|
|
|
|
|
#include "lispInt.h"
|
|
|
|
|
#include "textio/textio.h"
|
|
|
|
|
#include "utils/signals.h"
|
|
|
|
|
#include "utils/malloc.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int lispInFile; /* global variable used within the lisp
|
|
|
|
|
module used to figure out whether we're
|
|
|
|
|
in a file */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LispEvaluate --
|
|
|
|
|
*
|
|
|
|
|
* Evaluate the command-line as a lisp expression, and generate
|
|
|
|
|
* a list of commands in a local Cmd queue.
|
|
|
|
|
*
|
|
|
|
|
* Results:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
* Side effects:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
*------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
LispEvaluate (argc, argv, inFile)
|
|
|
|
|
int argc;
|
|
|
|
|
char **argv;
|
|
|
|
|
int inFile;
|
|
|
|
|
{
|
|
|
|
|
extern Sexp *LispMainFrame;
|
|
|
|
|
extern LispObj *LispMainFrameObj;
|
|
|
|
|
LispObj *l, *res;
|
|
|
|
|
char output_buf[LISP_MAX_LEN];
|
|
|
|
|
int i,j,k;
|
|
|
|
|
static int my_depth = 0;
|
|
|
|
|
int old_infile;
|
|
|
|
|
|
|
|
|
|
old_infile = lispInFile;
|
|
|
|
|
lispInFile = inFile;
|
|
|
|
|
my_depth ++;
|
|
|
|
|
/*
|
|
|
|
|
* convert input string into a lisp line.
|
|
|
|
|
*/
|
|
|
|
|
k=0;
|
|
|
|
|
output_buf[k++] = '(';
|
|
|
|
|
for (i=0; i < argc; i++) {
|
|
|
|
|
for (j=0; argv[i][j]; j++) {
|
|
|
|
|
if (argv[i][j] < 32)
|
|
|
|
|
output_buf[k++] = '\\';
|
|
|
|
|
output_buf[k++] = argv[i][j];
|
|
|
|
|
}
|
|
|
|
|
output_buf[k++] = ' ';
|
|
|
|
|
}
|
|
|
|
|
output_buf[k++] = ')';
|
|
|
|
|
output_buf[k] = '\0';
|
|
|
|
|
|
|
|
|
|
if (my_depth == 1)
|
|
|
|
|
LispCollectAllocQ = 1;
|
|
|
|
|
|
|
|
|
|
l = LispFrameLookup (LispNewString ("scm-echo-parser-input"),
|
|
|
|
|
LispMainFrame);
|
|
|
|
|
if (l && LTYPE(l) == S_BOOL && LBOOL(l))
|
|
|
|
|
TxPrintf (" [ %s ]\n", output_buf);
|
|
|
|
|
l = LispParseString (output_buf);
|
|
|
|
|
res = LispFrameLookup (LispNewString ("scm-echo-parser-output"),
|
|
|
|
|
LispMainFrame);
|
|
|
|
|
if (l) {
|
|
|
|
|
if (res && LTYPE(res) == S_BOOL && LBOOL(res)) {
|
|
|
|
|
TxPrintf (" >> ");
|
|
|
|
|
LispPrint (stdout, l);
|
|
|
|
|
TxPrintf ("\n\n");
|
|
|
|
|
}
|
|
|
|
|
if (SigInterruptOnSigIO >= 0) SigInterruptOnSigIO = 0;
|
|
|
|
|
SigInterruptPending = FALSE;
|
|
|
|
|
res = LispEval(l,LispMainFrame);
|
|
|
|
|
}
|
|
|
|
|
if (l && res) {
|
|
|
|
|
l = LispFrameLookup (LispNewString ("scm-echo-result"),LispMainFrame);
|
|
|
|
|
if (l && LTYPE(l) == S_BOOL && LBOOL(l)) {
|
|
|
|
|
LispPrint (stdout, res);
|
|
|
|
|
TxPrintf ("\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (SigInterruptPending)
|
|
|
|
|
TxPrintf ("[Evaluation Interrupted]\n");
|
|
|
|
|
}
|
|
|
|
|
/* collect garbage */
|
|
|
|
|
if (my_depth == 1)
|
|
|
|
|
LispGC (LispMainFrameObj);
|
|
|
|
|
my_depth--;
|
|
|
|
|
lispInFile = old_infile;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LispInit --
|
|
|
|
|
*
|
|
|
|
|
* Initialize lisp builtins.
|
|
|
|
|
*
|
|
|
|
|
* Results:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
* Side effects:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
*------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
LispInit ()
|
|
|
|
|
{
|
|
|
|
|
extern LispObj *LispMainFrameObj;
|
|
|
|
|
|
|
|
|
|
LispMainFrameObj = LispNewObj ();
|
|
|
|
|
LTYPE(LispMainFrameObj) = S_LIST;
|
|
|
|
|
LLIST(LispMainFrameObj) = NULL;
|
|
|
|
|
|
|
|
|
|
LispFnInit ();
|
|
|
|
|
LispFrameInit ();
|
|
|
|
|
LispGCHasWork = 0;
|
|
|
|
|
LispCollectAllocQ = 0;
|
|
|
|
|
LispGC (LispMainFrameObj);
|
|
|
|
|
|
|
|
|
|
LispSetEdit ("*unknown*");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LispSetTech --
|
|
|
|
|
*
|
|
|
|
|
* Sets the scheme variable "technology" to the technology name.
|
|
|
|
|
*
|
|
|
|
|
* Results:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
* Side effects:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
*------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
LispSetTech (s)
|
|
|
|
|
char *s;
|
|
|
|
|
{
|
|
|
|
|
extern Sexp *LispMainFrame;
|
|
|
|
|
extern LispObj *LispMainFrameObj;
|
|
|
|
|
LispObj *l, *m;
|
|
|
|
|
|
|
|
|
|
m = LispNewObj ();
|
|
|
|
|
LTYPE(m) = S_SYM;
|
|
|
|
|
LSYM(m) = LispNewString ("technology");
|
|
|
|
|
l = LispNewObj ();
|
|
|
|
|
LTYPE(l) = S_STRING;
|
|
|
|
|
LSTR(l) = (char *) mallocMagic((unsigned) (strlen(s)+1));
|
|
|
|
|
strcpy (LSTR(l),s);
|
|
|
|
|
LispAddBinding (m, l, LispMainFrame);
|
|
|
|
|
LispCollectAllocQ = 0;
|
|
|
|
|
LispGC (LispMainFrameObj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LispSetEdit --
|
|
|
|
|
*
|
|
|
|
|
* Sets the edit cell name
|
|
|
|
|
*
|
|
|
|
|
* Results:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
* Side effects:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
*------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
LispSetEdit (s)
|
|
|
|
|
char *s;
|
|
|
|
|
{
|
|
|
|
|
extern Sexp *LispMainFrame;
|
|
|
|
|
extern LispObj *LispMainFrameObj;
|
|
|
|
|
LispObj *l, *m;
|
|
|
|
|
|
|
|
|
|
m = LispNewObj ();
|
|
|
|
|
LTYPE(m) = S_SYM;
|
|
|
|
|
LSYM(m) = LispNewString ("edit-cell");
|
|
|
|
|
l = LispNewObj ();
|
|
|
|
|
LTYPE(l) = S_STRING;
|
|
|
|
|
LSTR(l) = (char *) mallocMagic((unsigned) (strlen(s)+1));
|
|
|
|
|
strcpy (LSTR(l),s);
|
|
|
|
|
LispAddBinding (m, l, LispMainFrame);
|
|
|
|
|
LispCollectAllocQ = 0;
|
|
|
|
|
LispGC (LispMainFrameObj);
|
|
|
|
|
}
|