(* ---------------------------------------------------------------------------- * $Id: MAS.mi,v 1.11 1995/11/05 09:01:14 kredel Exp $ * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * Copyright (c) 1989 - 1992 Universitaet Passau * ---------------------------------------------------------------------------- * $Log: MAS.mi,v $ * Revision 1.11 1995/11/05 09:01:14 kredel * Support for small letter exit. * * Revision 1.10 1995/10/13 16:03:00 pesch * *** empty log message *** * * Revision 1.9 1995/03/24 15:36:32 pesch * Changed inital message. * * Revision 1.8 1995/03/23 17:44:22 pesch * Added new options -E (exit on error) and -c (command). * * Revision 1.7 1995/03/23 16:09:52 pesch * Added support for -e and -o option. * * Revision 1.6 1995/03/06 16:44:36 pesch * Modified to load two files at startup: InitName (which is ~/.masrc * (MAS.INI without kpathsea) or set by the -f option) * and FileName (given as argument to mas). * * Revision 1.5 1993/03/22 10:23:51 kredel * Copyright for 1993 * * Revision 1.4 1992/10/15 16:30:31 kredel * Changed rcsid variable * * Revision 1.3 1992/02/12 17:32:47 pesch * Moved CONST definition to the right place * * Revision 1.2 1992/01/30 13:52:12 kredel * Resolved name clash: copyright -> copyrightc * * Revision 1.1 1992/01/22 15:12:03 kredel * Initial revision * * ---------------------------------------------------------------------------- *) MODULE MAS; (* MAS Implementation Module. *) (* Import lists and declarations. *) FROM MASCONF IMPORT ExitAfterFiles, FileName, InitName, InitialCommand, OutFileName; FROM MASSTOR IMPORT ADV, COMP, LIST, LIST1, SIL, TAU, TIME; FROM MASERR IMPORT DebugProcessor, ErrorHandler; FROM MASBIOS IMPORT BLINES, CUNIT, CWRITE, CWRITE, CloseBIOS, GWRITE, LISTS, SIUNIT, SOUNIT, SWRITE; FROM MASSYM IMPORT UREAD, UWRITE; FROM MASLISP IMPORT ENV, SCHLUSS, schluss; FROM MASSPEC IMPORT EVALUATE; FROM MASLOAD IMPORT InitExternals; FROM MASU IMPORT Debug, DoParse, DoWrite, InitExternalsU, Time; (* CONST banner = "Modula-2 Algebra System, Version 0.7"; copyrightc = "(c)"; copyright0 = "Copyrights: "; copyright1 = " 1989 - 1993, MAS: H. Kredel, Uni Passau."; copyright2 = " 1982, SAC-2: G. E. Collins, Uni Ohio,"; copyright3 = " R. Loos, Uni Tuebingen."; public = "(non-profit redistribution is permitted)"; *) CONST rcsidi = "$Id: MAS.mi,v 1.11 1995/11/05 09:01:14 kredel Exp $"; CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau"; PROCEDURE CLTIS1(A: LIST); (*Character list to input stream. A is an SAC-2 character list. *) VAR AP, k, b: LIST; BEGIN (*1*) k:=CUNIT("RAM:internal1"); k:=SOUNIT("RAM:internal1"); (*2*) (*write out characters. *) AP:=A; WHILE AP <> SIL DO ADV(AP,b,AP); CWRITE(b) END; (*3*) k:=CUNIT("RAM:internal1"); k:=SIUNIT("RAM:internal1"); (*3*) END CLTIS1; PROCEDURE CLTIS2(A: LIST); (*Character list to input stream. A is an SAC-2 character list. *) VAR AP, k, b: LIST; BEGIN (*1*) k:=CUNIT("RAM:internal2"); k:=SOUNIT("RAM:internal2"); (*2*) (*write out characters. *) AP:=A; WHILE AP <> SIL DO ADV(AP,b,AP); CWRITE(b) END; (*3*) k:=CUNIT("RAM:internal2"); k:=SIUNIT("RAM:internal2"); (*3*) END CLTIS2; PROCEDURE INTERPRETE; (*Lisp interpreter. *) VAR f: LIST; BEGIN (*1*) (*initialize*) InitExternals; InitExternalsU; (*write to outfile*) IF OutFileName[0] <> CHR(0) THEN f:=SOUNIT(OutFileName); END; (*2*) (*read startup file*) IF ExitAfterFiles THEN CLTIS1(LISTS(".EXIT.")); END; IF FileName[0] <> CHR(0) THEN f:=SIUNIT(FileName); END; IF InitialCommand[0] <> CHR(0) THEN CLTIS2(LISTS(InitialCommand)); END; IF InitName[0] <> CHR(0) THEN f:=SIUNIT(InitName); END; (*3*) (*read, eval, print - loop*) f:=ErrorHandler(REP); (*4*) END INTERPRETE; PROCEDURE REP; (*Read, Eval, Print - loop*) VAR S, Y, Z, T, r, e, p, t, c: LIST; time: BOOLEAN; BEGIN (*1*) (*reset some flags*) T:=TIME(); r:=T; e:=T; p:=T; c:=0; (*2*) (*actual loop*) REPEAT time:=Time; IF time THEN r:=TIME(); c:=TAU END; Y:=DoParse(); IF time THEN e:=TIME(); r:=e-r; END; Z:=EVALUATE(Y,ENV); BLINES(0); IF time THEN p:=TIME(); e:=p-e; END; DoWrite(Z); IF time THEN T:=TIME(); p:=T-p; c:=TAU-c; SWRITE("Time: read = "); GWRITE(r); SWRITE(", eval = "); GWRITE(e); SWRITE(", print = "); GWRITE(p); SWRITE(", gc = "); GWRITE(c); SWRITE("."); BLINES(0) END; UNTIL (Z = SCHLUSS) OR (Z = schluss); (*3*) END REP; PROCEDURE REPdebug; (*Read, Eval, Print - loop for debuging only *) VAR Y, Z, f: LIST; BEGIN (*1*) (*communicate via terminal*) f:=SOUNIT("CON:debugO"); f:=SIUNIT("CON:debugI"); (*2*) (*actual loop*) LOOP SWRITE("DEBUG: "); Y:=UREAD(); Z:=EVALUATE(Y,ENV); BLINES(0); SWRITE("**ANS: "); UWRITE(Z); BLINES(1); IF (Z = SCHLUSS) OR (Z = schluss) THEN EXIT END; END; (*3*) (*resume communication*) f:=CUNIT("CON:debugO"); f:=CUNIT("CON:debugI"); (*4*) END REPdebug; (* Execution part. *) BEGIN BLINES(1); (* BLINES(1); SWRITE(banner); BLINES(1); SWRITE(copyright0); BLINES(0); SWRITE(copyrightc); SWRITE(copyright1); BLINES(0); SWRITE(copyrightc); SWRITE(copyright2); SWRITE(copyright3); BLINES(1); SWRITE(public); BLINES(1); *) DebugProcessor:=REPdebug; (* install debug aid *) INTERPRETE; CloseBIOS; (*StorSummary;*) END MAS. (* -EOF- *)