(* ----------------------------------------------------------------------------
 * $Id: MASmtc.mip,v 1.1 1995/03/06 16:48:45 pesch Exp $
 * ----------------------------------------------------------------------------
 * This file is part of MAS.
 * ----------------------------------------------------------------------------
 * Copyright (c) 1989 - 1992 Universitaet Passau
 * ----------------------------------------------------------------------------
 * $Log: MASmtc.mip,v $
 * Revision 1.1  1995/03/06  16:48:45  pesch
 * Replaced MASmtc.mi by MASmtc.mip.
 * Will now work with both (old and new) reuse libraries.
 *
 * Revision 1.4  1992/10/16  13:47:56  kredel
 * Errors found by Mocka
 *
 * Revision 1.3  1992/10/15  16:25:00  kredel
 * Changed rcsid variable
 *
 * Revision 1.2  1992/02/12  17:31:59  pesch
 * Moved CONST definition to the right place
 *
 * Revision 1.1  1992/01/22  15:10:42  kredel
 * Initial revision
 *
 * ----------------------------------------------------------------------------
 *)

IMPLEMENTATION MODULE MASmtc;

(* MAS mtc [Modula-2 to C] Implementation Module. *)



(* Import lists and declarations. *)

FROM SYSTEM IMPORT ADDRESS, ADR;

#ifdef OLD_MTC
FROM SysCalls IMPORT GetArgCount, GetArgument, GetVariable, System; 
#else
FROM System IMPORT GetArgCount, GetArgument, GetVariable, System; 
#endif

FROM Strings IMPORT AssignEmpty, tString, ArrayToString, StringToArray,
                    Concatenate; 
(*
FROM StdIO  IMPORT WriteS, WriteNl, WriteFlush;
*)

CONST rcsidi = "$Id: MASmtc.mip,v 1.1 1995/03/06 16:48:45 pesch Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau";


(* stackoff depends on register architecture of maschine *)
(* and on procedure calling sequence. *)

#ifdef __AIX__
CONST stackoff = 80;  
#else
#ifdef __NeXT__
CONST stackoff = 12;
#else
CONST stackoff = 0;
#endif
#endif


VAR parmpos: CARDINAL;
    toc: INTEGER; 
   
    ArgCount: CARDINAL;

 
PROCEDURE getstck(): ADDRESS;
(*Get contents of stack register. *)
VAR   stck: INTEGER;
      a: ADDRESS;
BEGIN
(*1*) stck:=0; a:=ADR(stck)+stackoff; stck:=1; RETURN(a); 
(*9*) END getstck;
 

PROCEDURE gettoc(): ADDRESS;
(*Get contents of toc register. *)
VAR   a: ADDRESS;
BEGIN
(*1*) toc:=0; a:=ADR(toc); toc:=1; RETURN(a); 
(*9*) END gettoc;


PROCEDURE parameter;
(*setup parameter processing. *)
BEGIN 
(*1*) ArgCount:=GetArgCount(); parmpos:=0; 
(*9*) END parameter;


PROCEDURE NextParm(VAR s: ARRAY OF CHAR): BOOLEAN;
(*Next Parameter. The next parameter from the Unix environement is
placed in string s. If no parameter was found, FALSE is returned
and s is undefined, else TRUE is returned. The separator for the 
parameters is the blank character. *)
BEGIN
(*1*) IF parmpos < ArgCount-1 THEN parmpos:=parmpos+1;
         GetArgument(parmpos,s);
	 RETURN(TRUE) END; 
      RETURN(FALSE);
(*9*) END NextParm;


PROCEDURE DOS(s: ARRAY OF CHAR): INTEGER;
(*Call DOS/UNIX program. *)
VAR   i: INTEGER;
BEGIN
(*2*) (*load and execute program. *)
      i:=System(s);
      RETURN(i)
(*9*) END DOS;


PROCEDURE EDIT(s: ARRAY OF CHAR): INTEGER;
(*Edit file with name s. *)
VAR   ep, sp: tString;
      e: ARRAY [0..250] OF CHAR;
      i: INTEGER;
BEGIN
(*1*) (*prepare parameters. *)
      (*GetVariable("EDITOR",e); geht nicht *)
      ArrayToString(EditPrg,ep); ArrayToString(EditPrm,sp); 
      Concatenate(ep,sp); ArrayToString(s,sp);
      Concatenate(ep,sp); StringToArray(ep,e);  
(*2*) (*load and execute program. *)
      i:=System(e);
      RETURN(i)
(*9*) END EDIT;


BEGIN

parameter;

EditPrg:="/public/gnu/bin/emacs"; EditPrm:="  "; 

END MASmtc.

(* -EOF- *)