#include <exec/types.h>
#include <intuition/intuitionbase.h>
#include <exec/memory.h>

extern LONG OpenLibrary();
extern void CloseLibrary();

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Window *Window,*Dialog;

int druck=-1; /*Handle für Druckerdatei*/

struct IntuiText text14 =
  {
   0,
   1,                                            /*Menüpunkt quit*/
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Interpreter verlassen",
   NULL
  };

struct MenuItem unter14 =
  {
   NULL,
   0,
   48,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text14,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text13 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Dialog -> PRT:",
   NULL
  };
                                         /*Menüpunkt Ausdruck*/
struct MenuItem unter13 =
  {
   &unter14,
   0,
   36,
   208,
   10,
   ITEMTEXT|ITEMENABLED|CHECKIT|HIGHCOMP,
   0,
   (APTR) &text13,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text12 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Knotenstatistik",
   NULL
  };
                                         /*Menüpunkt Speicherbelegung*/
struct MenuItem unter12 =
  {
   &unter13,
   0,
   24,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text12,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text11 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Lisp-Prg. laden",
   NULL
  };                                  /*Menüpunkt Nachladen*/

struct MenuItem unter11 =
  {
   &unter12,
   0,
   12,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text11,
   NULL,
   0,
   NULL,  /*Untermenüs*/
   0
  };

struct IntuiText text10 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " CLI-Fenster öffnen",
   NULL
  };

struct MenuItem unter10 =     /* Menüpunkt : CLI */
  {
   &unter11,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text10,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text22 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Bindungen löschen",
   NULL
  };

struct MenuItem unter22 =     /* Menüpunkt Speicher-Clear */
  {
   NULL,
   0,
   24,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text22,
   NULL,
   0,
   NULL,
   0
  };
struct IntuiText text21 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Objektliste ansehen",
   NULL
  };

struct MenuItem unter21 =     /* Menüpunkt (objlist) */
  {
   &unter22,
   0,
   12,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text21,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text20 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Symbolliste ansehen",
   NULL
  };

struct MenuItem unter20 =     /* Menüpunkt (varlist) */
  {
   &unter21,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text20,
   NULL,
   0,
   NULL,
   0
  };

struct IntuiText text30 =
  {
   0,
   1,
   JAM1,
   8,
   1,
   NULL,
   (UBYTE *) " Evaluierung abbrechen",
   NULL
  };

struct MenuItem unter30 =     /* Menüpunkt (varlist) */
  {
   NULL,
   0,
   0,
   208,
   10,
   ITEMTEXT|ITEMENABLED|HIGHCOMP,
   0,
   (APTR) &text30,
   NULL,
   0,
   NULL,
   0
  };

struct Menu ober3 =
  {
   NULL,
   400,
   0,
   200,
   10,
   MENUENABLED,
   "Abbruch",
   &unter30
  };

struct Menu ober2 =
  {
   &ober3,
   200,
   0,
   200,
   10,
   MENUENABLED,
   "Variablen",
   &unter20
  };

struct Menu ober1 = /*Anfang der Menü-Struktur*/
  {
   &ober2,
   0,
   0,
   200,
   10,
   MENUENABLED,
   "System",
   &unter10
  };

struct NewWindow NewWindow =
{ 0,200,640,55,0,1,
  MENUPICK,
  ACTIVATE,
  NULL,NULL,
  "Eingabefenster",
  NULL,NULL,
  0,0,0,0,
  WBENCHSCREEN
};

struct NewWindow NewDialog =
{ 0,0,640,201,0,1,
  NULL,
  ACTIVATE,
  NULL,NULL,
  "ALisp -  Dialogfenster",
  NULL,NULL,
  0,0,0,0,
  WBENCHSCREEN
};

struct IntuiMessage *message;
ULONG MessageClass;
USHORT code;
struct RastPort *RPort,*DPort;

struct { char text[234];
         int ende;       }ringliste[8];

struct IntuiText text =  /*Struktur zum Erstellen des Fensterinhaltes*/
  {
   1,
   0,
   JAM2,
   8,
   1,
   NULL,
   "",
   NULL
  };

struct IntuiText dtext =  /*Ausgabe im Dialogfenster*/
  {
   1,
   0,
   JAM1,
   8,
   13,
   NULL,
   "",
   NULL
  };

UWORD  maus2[]= { 0x0000,0x0000,
                  0x03c0,0x0000,
                  0x0ff0,0x0000,
                  0x1ff8,0x0000,
                  0x3ffc,0x0000,
                  0x7ffe,0x0000,
                  0x7ffe,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0xffff,0x0000,
                  0x7ffe,0x0000,
                  0x7ffe,0x0000,
                  0x3ffc,0x0000,
                  0x1ff8,0x0000,
                  0x0ff0,0x0000,
                  0x03c0,0x0000,
                  0x0000,0x0000 };

UWORD  maus1[]= { 0x0000,0x0000,
                  0xff00,0x0000,
                  0xfe00,0x0000,
                  0xfc00,0x0000,
                  0xf800,0x0000,
                  0xfc00,0x0000,
                  0xee00,0x0000,
                  0xc700,0x0000,
                  0x8380,0x0000,
                  0x01c0,0x0000,
                  0x00e0,0x0000,
                  0x0070,0x0000,
                  0x0038,0x0000,
                  0x001c,0x0000,
                  0x000c,0x0000,
                  0x0000,0x0000,
                  0x0000,0x0000,
                  0x0000,0x0000 };

/* nprint ersetzt printf im Dialogfenster*/
void nprint(string)
char *string;
{  static char puffer[80];
   static int x=0,y=0;
   extern struct Window *GWindow1;
   int i=0,breite; /* gibt Breite des Ausgabefensters an.*/
   char *z;
   if(GWindow1)
      breite=24;
   else breite=78;
   if(druck!=-1) /*Text soll auch auf den Drucker*/
   {  z=string;
      while(*z++) i++;        /*Stringlänge ermitteln*/
      i=write(druck,string,i);/*und ausdrucken*/
   }
   while(*string!=0)
   {  if(*string=='\n')
      { y++; if(y>22)
             {  y=22; ScrollRaster(DPort,0,8,4,13,635,197);
             }
        x=0;
        string++;
      }
      else
      {  i=x;z=&puffer[0];
         while((i<breite)&&(*string!='\n')&&(*string!=0))
         {  i++; *z++=*string++; }
         *z=0;
         dtext.IText=&puffer[0];
         PrintIText(DPort,&dtext,x<<3,y<<3);
         x=i;
         if(x>=breite)
         {  y++; if(y>22)
                 {  y=22; ScrollRaster(DPort,0,8,4,12,635,197);
                 }
            x=0;
         }
      }
   }
}

/* rprint gibt die Ausgaben in einer Warnfarbe aus */

void rprint(string)
char *string;
{  dtext.FrontPen=2;
   nprint(string);
   dtext.FrontPen=1;
}

/* Gadgetdefinitionen für Sondereingaben */
struct IntuiText n1text =
  {
   1,3,JAM1,10,-11,0,
   "Dateinamen eingeben:",0
  };
struct IntuiText rqtxt =
  {
   1,3,JAM2,18,5,0,
   "ALisp-Requester",0
  };

UBYTE DefString[40] = "\0";
UBYTE Undo [40];
 
struct StringInfo TextString =  /* Fuer Texte in Text-Gadgets */
{
   DefString,Undo,0,40,0,0,0,0,0,0,NULL,0,NULL
};
 
USHORT Rand[] =
{
   -1,-1,201,-1,201,9,-1,9,-1,-1
};

struct Border StrBorder =
{
   0,0,1,0,JAM1,5,&Rand[0],NULL
};

struct Gadget Text_gad =
{
   NULL,
   10,
   30,
   200,
   18,
   GADGHCOMP|SELECTED,
   STRINGCENTER|RELVERIFY|ENDGADGET|GADGIMMEDIATE,
   STRGADGET|REQGADGET,
   (APTR)&StrBorder,
   0,
   &n1text,
   0,
   (APTR)&TextString,
   0,
   0
};

struct Requester request =
{  NULL,0,0,220,50,0,0,&Text_gad,NULL,&rqtxt,NULL,3,NULL,NULL,NULL,NULL,NULL
};

char *req()
{  BYTE flag=1;
   DefString[0]=0;
   Text_gad.GadgetText=&n1text;
   Text_gad.Activation=STRINGCENTER|RELVERIFY|ENDGADGET|GADGIMMEDIATE;
   /*Den Requester im Dialogfenster darstellen*/
   OffMenu(Window,2);
   ActivateWindow(Dialog);
   ModifyIDCMP(Dialog,REQCLEAR);
   if(!Request(&request,Dialog))
      return(DefString);
   ActivateGadget(&Text_gad,Dialog,&request);
   while(flag)
   {  Wait(1<<Dialog->UserPort->mp_SigBit);
      while(message = (struct IntuiMessage *)GetMsg(Dialog->UserPort))
      {
         MessageClass = message->Class; /* Message retten */
         code = message->Code;
         ReplyMsg(message);    /* Message beantworten */
         if(MessageClass==REQCLEAR)
            flag=0;
      }
   }
   ModifyIDCMP(Dialog,NULL);
   ActivateWindow(Window);
   OnMenu(Window,2);
   return(DefString);
}

ULONG dosbase;

void doscommand()  /*Führt ein dos-Kommando aus*/
{
   if(dosbase=OpenLibrary("dos.library",0))
   {  Execute("NEWCLI CON:400/0/239/201/DOS-Prozeß",0,0);
      CloseLibrary(dosbase);
   }
}

int kopf=0; /*Kopf der Ringliste*/

ULONG DiskfontBase;

UWORD *datas;
extern UWORD *AllocMem();

void coninit()
{  int i;
   struct TextFont *textfont;
   struct TextAttr textattr;
   UWORD *z1,*z2;

   IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",0L);
   GfxBase = (struct GfxBase*)OpenLibrary("graphics.library",0L);

   if(!(Dialog=(struct Window*)OpenWindow(&NewDialog)))
      exit();
   if(!(Window=(struct Window*)OpenWindow(&NewWindow)))
   {  CloseWindow(Dialog);   exit();
   }
   if(datas=AllocMem(160L,3L))
   {  z1=datas;z2=&maus2[0];
      for(i=0;i<36;i++)
        *z1++=*z2++;
      z2=&maus1[0];
      for(i=0;i<36;i++)
        *z1++=*z2++;
   }
   else
   {  CloseWindow(Dialog);CloseWindow(Window);
      exit();
   }
   RPort=Window->RPort;
   DPort=Dialog->RPort;
   if(DiskfontBase=OpenLibrary("diskfont.library",0))
   {  textattr.ta_Name="emerald.font";
      textattr.ta_YSize=20;
      textattr.ta_Style=1;
      textattr.ta_Flags=0;
      if(textfont=(struct TextFont*)OpenDiskFont(&textattr))
      {  text.IText="AmigaLisp";
         text.ITextFont=&textattr;
         PrintIText(DPort,&text,8,16);
         text.ITextFont=NULL;
         CloseFont(textfont);
      }
      else
         nprint("AmigaLisp\n");
      CloseLibrary(DiskfontBase);
   }
   else
      nprint("AmigaLisp\n");
   nprint("\n\n\n\n\n© 1990 Steffen Goebbels\n");
   nprint("       Alte Heerstr. 25 - 4179 Weeze - 02837/1546\n");
   nprint("       Semesteranschrift : Muffeter Weg 39 - 5100 Aachen\n");

   SetMenuStrip(Window,&ober1);
   for(i=0;i<10;i++)
      ringliste[i].text[0]=0; /*Ringliste initialisieren*/
}

struct IntuiText reqe =  /*Struktur zum Erstellen eines Requestertextes*/
  {
   0,
   1,
   JAM1,
   17,
   20,
   NULL,
   "Sind Sie Sich sicher ?",
   NULL
  };

struct IntuiText ja =
  {
   0,
   1,
   JAM2,
   7,
   4,
   NULL,
   "JA",
   NULL
  };

struct IntuiText nein =
  {
   0,
   1,
   JAM2,
   7,
   4,
   NULL,
   "NEIN",
   NULL
  };

void print(zeiger)    /*print gibt die Window-Textstruktur aus*/
char *zeiger;
{  char merke;
   text.IText=zeiger;
   merke=*(zeiger+78);*(zeiger+78)=0;
   PrintIText(RPort,&text,0,16);
   *(zeiger+78)=merke;merke=*(zeiger+156);*(zeiger+156)=0;
   text.IText=zeiger+78;
   PrintIText(RPort,&text,0,26);
   *(zeiger+156)=merke;
   text.IText=zeiger+156;
   PrintIText(RPort,&text,0,36);
}

BYTE menu()
{  if(MENUNUM(code) != MENUNULL)
     switch(MENUNUM(code))
     {  case 0: {  switch(ITEMNUM(code))
                   { case 0: doscommand(); return(1);
                     case 1: return(4);
                     case 2: return(5); /*(free)*/
                     case 3: { if(druck==-1)
                               {  int dummy=0;
                                  unter13.Flags=ITEMTEXT|ITEMENABLED|CHECKIT|CHECKED|HIGHCOMP;
                                  druck=open("PRT:",1,dummy);
                                  if(druck==-1)
                                     unter13.Flags=ITEMTEXT|ITEMENABLED|CHECKIT|HIGHCOMP;
                               }
                               else
                               {  close(druck);
                                  unter13.Flags=ITEMTEXT|ITEMENABLED|CHECKIT|HIGHCOMP;
                                  druck=-1;
                               }
                               return(1);
                             }
                     case 4: if(AutoRequest(NULL,&reqe,&ja,&nein,NULL,NULL,270,70))
                                return((BYTE)ITEMNUM(code)-2);
                             else
                                return(1);
                   }
                }
        case 1: {  switch(ITEMNUM(code))
                   { case 0: return(6);
                     case 1: return(7);
                     case 2: if(AutoRequest(NULL,&reqe,&ja,&nein,NULL,NULL,270,70))
                                return(8);
                             else
                                return(1);
                   }
                }
        case 2: return(1);
     }
   return(1);
}

/*Kleinschrifttabelle :*/
char tabelle1[]="[1234567890ß'\\ 0qwertzuiopü+ 123asdfghjklöä# 456<yxcvbnm,.-  789 ";

/*Großschrifttabelle :*/
char tabelle2[]="]!\"§$%&/()=?`| 0QWERTZUIOPÜ* 123ASDFGHJKLÖÄ^ 456>YXCVBNM;:_  789 ";

/* transform wandelt RAW-Codes in ASCII-Codes um*/
char transform(code)
BYTE code;
{  static BYTE shift=0; /*shift gedrückt : 1 */
   char zeichen=0;
   BYTE los=0;

   if(code&128) {los=1; code&=127; } /*Bit 7 ausmaskieren*/
   if(los)
   {  if((code==96)||(code==97)||(code==98)) /*Shift losgelassen*/
         shift=0;
   }
   else if(code<65)
      if(!shift) zeichen=tabelle1[code];
            else zeichen=tabelle2[code];
   else if((code>75)&&(code<80)) /*Cursortasten*/
        { zeichen=code-48;
          if(shift&&((code==76)||(code==77))) /*Page up-down*/
             zeichen=code-73; /*3:up, 4:down*/
        }
   else if(code==65) /*Backspace*/
      zeichen=9;
   else if(code==70)  /*Vorsicht : Diese Zeichen sind keine ASCII !*/
      zeichen=8;
   else if((code==96)||(code==97)||(code==98)) /*Shift gedrückt*/
      shift=1;
   else if((code==68)||(code==67))
      zeichen=13;
   return zeichen;
}

int x,y; /*Position des Cursors*/

void cursorcontrol(zeichen)
char zeichen;
{  int merke;
   static int xalt,yalt;
   if(x<0) {x=77;y--;}
   else if(x>77) {x=0;y++;}
   if(y<0) {y=0; if(zeichen!=28) x=0;}
   else if(y>2) {y=2; if(zeichen!=29) x=77;}
   merke=yalt*10+26;
   Move(RPort,(xalt<<3)+8,merke);SetAPen(RPort,0);Draw(RPort,(xalt<<3)+15,merke);
   merke=y*10+26;SetAPen(RPort,1);xalt=x;yalt=y;
   Move(RPort,(x<<3)+8,merke);Draw(RPort,(x<<3)+15,merke);
}

/* mit escape wird das Esc-Menu während der Interpretation abgefragt.*/

BYTE escape()
{  BYTE meldung=0;
   while(message=GetMsg(Window->UserPort))
   {  MessageClass=message->Class;
      code=message->Code;
      ReplyMsg(message);
      if(MessageClass==MENUPICK)
         if(MENUNUM(code) == 2)
            meldung=1;
   }
   return(meldung);
}

BYTE menuflag=1;  /*Erlaubt oder verbietet Menüs bei der Eingabe*/

char* newcon()
{  BYTE flag=1;
   static char zeilen[235];
   char zeichen,*z1,*z2;
   int i,j,listpos,merke,ende=0;
   extern struct Screen *GScreen;
   x=0;y=0;listpos=kopf;
   for(j=0;j<234;j++)        /*Eingabefeld zurücksetzen.*/
      ringliste[kopf].text[j]=zeilen[j]=' ';
   zeilen[234]=0; /*Stringende*/
   SetAPen(Window->RPort,0);            /*Fenster löschen*/
   RectFill(Window->RPort,4,12,636,52);
   SetAPen(Window->RPort,1);
   nprint("\n>"); /*Prompt ausgeben*/
   cursorcontrol(0);
   /*hier auch noch Cursor setzen*/
   if(menuflag)
   {  ModifyIDCMP(Window,MENUPICK|RAWKEY);
      {  OnMenu(Window,0); /*und Pulldowns erlauben*/
         if(GScreen)
           unter10.Flags=ITEMTEXT|HIGHCOMP;
         OnMenu(Window,1);
         OffMenu(Window,2);/*break verbieten*/
         unter11.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
         unter12.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
         unter13.Flags|=ITEMENABLED;
         unter14.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
         unter21.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
         unter22.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
      }
   }
   else
   {  OffMenu(Window,2);
      ModifyIDCMP(Window,RAWKEY);
   }
   SetPointer(Window,(datas+36),16,16,-3,-3);
   do
   {  Wait(1<<Window->UserPort->mp_SigBit);
      while((message=GetMsg(Window->UserPort))&&(flag==1))
      {  MessageClass=message->Class;
         code=message->Code;
         ReplyMsg(message);
         if(MessageClass==MENUPICK) flag=menu();
         else
            if(MessageClass==RAWKEY)
            {  zeichen=transform(code);
               if(zeichen==13)
               {  if(ende!=0)
                  { flag=0; /*fertig*/
                    for(i=0;i<234;i++)  /*In die Ringliste einfügen*/
                      ringliste[kopf].text[i]=zeilen[i];
                    ringliste[kopf].ende=ende;
                    kopf=(kopf+1)%8;
                    /*Endzeichen setzen*/
                    if(ende<234)
                    {  zeilen[ende]='þ';
                       print(zeilen);
                    }
                  }
               }
               else
               {  if(((int)zeichen>31)||((int)zeichen<0))
                  /*Zeichen druckbar*/
                  { /*alle Zeichen eins weiterschieben*/
                    if(ende<234) /*Zeichen paßt noch*/
                    {  merke=y*78+x;
                       if(ende>0)
                          z1=&zeilen[ende];z2=&zeilen[ende-1];
                       for(j=ende++;j>merke;j--)
                          *z1--=*z2--;
                       zeilen[merke]=zeichen;
                       x++;
                       if(ende<=merke) ende=merke+1;
                       print(zeilen);
                       cursorcontrol(zeichen);
                    }
                  }
                  else
                  /*Steuercode*/
                  if(zeichen!=0)
                  { switch((int)zeichen)
                    {case  3 : if(listpos==0) listpos=7;
                               else listpos--;
                               if(ringliste[listpos].text[0]==0)
                                  listpos=(listpos+1)%8;
                               else /*Page up*/
                               {  for(i=0;i<234;i++)
                                    zeilen[i]=ringliste[listpos].text[i];
                                  ende=ringliste[listpos].ende;
                               } print(zeilen); break;
                     case  4 : listpos=(listpos+1)%8;
                               if(ringliste[listpos].text[0]==0)
                                  listpos--; /*kein Übertrag möglich*/
                               else /*Page down*/
                               {  for(i=0;i<234;i++)
                                    zeilen[i]=ringliste[listpos].text[i];
                                  ende=ringliste[listpos].ende;
                               } print(zeilen); break;
                     case  8 : if(x<233) x++;
                               else break;
                     case  9 : merke=y*78+x; /*Backspace*/
                               if(merke>0)
                               { z1=&zeilen[merke-1];
                                 z2=&zeilen[merke];
                                 for(j=merke;j<ende;j++)
                                   *z1++=*z2++;
                                 if(ende>=merke)
                                 {  zeilen[--ende]=' ';
                                    print(zeilen);
                                 }
                                 x--;
                               } print(zeilen);break;
                     case 28 : y--;break;
                     case 29 : y++;break;
                     case 30 : x++;break;
                     case 31 : x--;break;
                    }
                    cursorcontrol(zeichen);
                  }
               }
            }
      }
   }while(flag==1);
   ModifyIDCMP(Window,MENUPICK);
   OnMenu(Window,2);    /*break erlauben*/
   SetPointer(Window,datas,16,16,-8,-8);
   if(menuflag)
   {  OffMenu(Window,0);   /*Menüs auf Geisterschrift setzen*/
      OffMenu(Window,1);
      unter11.Flags=ITEMTEXT|HIGHCOMP;
      unter12.Flags=ITEMTEXT|HIGHCOMP;
      unter13.Flags&=(0xffff-ITEMENABLED);
      unter14.Flags=ITEMTEXT|HIGHCOMP;
      unter21.Flags=ITEMTEXT|HIGHCOMP;
      unter22.Flags=ITEMTEXT|HIGHCOMP;
   }
   else menuflag=1;
   switch(flag)
   { case 0 : ende--;
              while((ende>0)&&(zeilen[ende]==' ')) ende--;
              zeilen[ende+1]=0; /*überflüssige Leerzeichen abschneiden*/
              nprint(zeilen); /*ins Dialogfenster schreiben*/
              nprint("\n");
              break;
     case 2 : zeilen[0]=1;zeilen[1]=0; break;
     case 4 : z1=req(); /*Name einlesen*/
              strcpy(zeilen,"(load \"");z2=&zeilen[7];
              while(*z1) *z2++=*z1++; /*Name kopieren*/
              strcpy(z2,"\")");
              nprint(zeilen);nprint("\n");
              break;
     case 5 : strcpy(zeilen,"(free)");
              nprint(zeilen);nprint("\n");
              break;
     case 6 : strcpy(zeilen,"(varlist)");
              nprint(zeilen);nprint("\n");
              break;
     case 7 : strcpy(zeilen,"(objlist)");
              nprint(zeilen);nprint("\n");
              break;
     case 8 : zeilen[0]=2;zeilen[1]=0; break;
   }
   return(&zeilen[0]);
}

void conreinit()
{  ClearMenuStrip(Window);
   FreeMem(datas,160);
   CloseWindow(Window);
   CloseWindow(Dialog);
   CloseLibrary(GfxBase);
   CloseLibrary(IntuitionBase);
   if(druck!=-1)
      close(druck); /*Druckerdatei schließen*/
}


