/*
 *
 *	Wo1.0e.c
 *
 *		Aztec C V3.4:
 *		cc (+Irad:inlcude.pre) +C +D +L -E140 wo.c
 *		ln wo.o -lml32 -lcl32
 *
 */


/*
 *	inlcudes and defines
 */

/* I compile with pre-compiled include-files !
#include <stdio.h>
#include <ctype.h>
#include <functions.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <devices/timer.h>
#include <time.h>
#include <devices/input.h>
#include <libraries/dos.h>
#include <graphics/gfxmacros.h>
*/

#define ABOUT " Wo 1.0e  © Heinzel 2.3.90 "

#define MX  IntuitionBase->ActiveScreen->MouseX
#define MY  IntuitionBase->ActiveScreen->MouseY
#define a_w IntuitionBase->ActiveWindow
#define MAXLEN 255 
#define KEYS sizeof(key)/sizeof(UBYTE)   /* for codiere()/decodiere() */
#define MAXI 500   	/* maximal number of records (can be modified, of course) */


/*
 *	declarations
 */

UBYTE key[] = {0,1,2,3,4,5,6,7,8,9,};  /* for password */

struct Daten
{
 char such_begriff[32];		
 char name[32];
 char strasse[32];
 char ort[32];
 char tel[32];
};

struct Daten *person[MAXI];
int zaehler = 0;   /* for person[zaehler]  */

int vergleich();   /* for QuickSort()  */

FILE *faus, *fopen();
struct FileHandle *fein;
struct FileLock *lock;
struct FileInfoBlock *eintrag;
char *platz;

struct IntuitionBase *IntuitionBase;  
struct GfxBase *GfxBase;
long DosBase=0, j, k;
long i=0;

BOOL anderung = FALSE;
	/* has actual file been changed and must be saved ? */

struct IntuiMessage *message;
ULONG class; USHORT code;

struct MsgPort *timerport = NULL;  /* for timer-clock */
long openerror = 1;
struct timerequest timereq;
ULONG zmem, tt =0;
long diff = 0;


struct Preferences prefs;   /* for movemouse() */
struct RastPort *rp;
struct Screen *screen;
struct Window *w, *offne_win, *list_win, *input_win, *sesam_win;

char liste[MAXI][33];  /* for list() */
char Date_Buffer[10] ;    

UBYTE DefString[30];
UBYTE Undo [30];
struct StringInfo TexString =  /* for text in text-gadgets */
 {DefString,Undo,0,30,0,0,0,0, 0,0, NULL, 0, NULL};
 
UBYTE DefString2[30] = ":wo/wo.file";   /* in offne_file-window */
UBYTE Undo2[30];
struct StringInfo TexString2 =
 {DefString2,Undo2,0,30,0,0,0,0, 0,0, NULL, 0, NULL};

UBYTE DefString3[30];   /* in input-window */
UBYTE Undo3[30];
struct StringInfo Input_TexString =
 {DefString3,Undo3,0,30,0,0,0,0, 0,0, NULL, 0, NULL};

UBYTE DefString4[70];   /*  in sesam-window  */
UBYTE Undo4[70];
struct StringInfo sesam_TexString =
 {DefString4,Undo4,0,70,0,0,0,0, 0,0, NULL, 0, NULL};

char alert1[] = {"\0\170\26  W r o n g    P a s s w o r d  ,     S u c k e r  !\0\0"};

/*
 *	Borders
 */

SHORT Pairs1[] =        /* from Text Gadget Border  */
 {38,36, 250,36, 250,51, 38,51, 38,36 };
SHORT Pairs3[] =        /* ... in offne_file  */
 {21,5, 231,5, 231,21, 21,21, 21,5 };
SHORT Pairs4[] =        /* ... in input_window  */
 {38,16, 250,16, 250,31, 38,31, 38,16 };

struct Border StrBorder5 =
 {-17,-11, 1,0,JAM1, 5, Pairs4, NULL };
struct Border StrBorder4 =
 {0,0, 1,0,JAM1, 5, Pairs4, NULL };
struct Border StrBorder3 =
 {0,0, 1,0,JAM1, 5, Pairs3, NULL };
struct Border StrBorder =
 {0,0, 1,0,JAM1, 5, Pairs1, NULL };


/*
 *	IntuiTexts
 */

BOOL ergebnis = FALSE;

struct IntuiText postext1 =
 {0,1,JAM2,9,4,NULL,(UBYTE *)"Yo ",NULL };
struct IntuiText negtext1 = 
 {0,1,JAM2,9,4,NULL,(UBYTE *)" NO !",NULL };
struct IntuiText text=
 {0,1,JAM1,9,6,NULL,(UBYTE *)" No reords ! "};  
struct IntuiText text2=
 {0,1,JAM1,9,6,NULL,(UBYTE *)NULL};
struct IntuiText text3=
 {0,1,JAM1,6,6,NULL,(UBYTE *)" No current record !"};
struct IntuiText text4=
 {0,1,JAM1,9,6,NULL,(UBYTE *)" DELETE records ?"};
struct IntuiText text5=
 {0,1,JAM1,9,6,NULL,(UBYTE *)" Save modified file ?"};

struct IntuiText yo_str =
 {1,0,JAM2,49,2,NULL,(UBYTE *)"Yo !",NULL };

struct IntuiText del_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" Del ",0};
struct IntuiText neu_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" New ",0};
struct IntuiText print_str =
 {3,0,JAM2,1,0,0,(UBYTE *)"  Print  ",0};
struct IntuiText abbruch_str =
 {1,0,JAM1,25,2,0,(UBYTE *)"CANCEL",0};
struct IntuiText list_str =
 {3,0,JAM2,1,0,0,(UBYTE *)"  List ",0};
struct IntuiText input_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" Input ",0};
struct IntuiText speicher_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" Save ",0};
struct IntuiText lade_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" Open ",0};
struct IntuiText edit_str =
 {3,0,JAM2,1,0,0,(UBYTE *)" Edit ",0};

struct IntuiText yes_str =
 {1,0,JAM1,14,2,0,NULL,0};
struct IntuiText no_str =
 {1,0,JAM1,25,2,0,(UBYTE *)"Cancel",0};


struct IntuiText vor_str =
 {1,0,JAM1,4,0,0,(UBYTE *)"--->>>",0};
struct IntuiText zurueck_str =
 {1,0,JAM1,4,0,0,(UBYTE *)"<<<---",0};
struct IntuiText namen_str[13] =
{
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0},
 {1,0,JAM2,3,1,0,NULL,0}
};

/*
 *	Gadgets
 */

struct Gadget yo_gad =
 {NULL, 66,25,120,12, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&yo_str,0,0, 2, 0}; 
struct Gadget sesam_gad =
 {&yo_gad, 26,9,200,12, GADGHCOMP, RELVERIFY, STRGADGET,
   NULL, 0, NULL, 0, (APTR)&sesam_TexString, 1,0};

struct Gadget input_tex_gad =
 {NULL, 45,20,200,12, GADGHCOMP, STRINGCENTER|RELVERIFY, STRGADGET,
   NULL, 0, NULL, 0, (APTR)&Input_TexString, 1,0};

struct Gadget zurueck_gad =
 {NULL, 74,170,54,8, GADGHBOX|GADGDISABLED,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&zurueck_str,0,0, 21, 0}; 
struct Gadget vor_gad =
 {&zurueck_gad, 6,170,54,8, GADGHBOX|GADGDISABLED,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&vor_str,0,0, 20, 0}; 

struct Gadget namen_gad[13] =
{
{&vor_gad,      10, 12,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[0], 0,0,0, 0}, 
{&namen_gad[0], 10, 22,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[1], 0,0,1, 0}, 
{&namen_gad[1], 10, 32,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[2], 0,0,2, 0}, 
{&namen_gad[2], 10, 42,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[3], 0,0,3, 0}, 
{&namen_gad[3], 10, 52,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[4], 0,0,4, 0}, 
{&namen_gad[4], 10, 62,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[5], 0,0,5, 0}, 
{&namen_gad[5], 10, 72,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[6], 0,0,6, 0}, 
{&namen_gad[6], 10, 82,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[7], 0,0,7, 0}, 
{&namen_gad[7], 10, 92,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[8], 0,0,8, 0}, 
{&namen_gad[8], 10,102,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[9], 0,0,9, 0}, 
{&namen_gad[9], 10,112,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[10],0,0,10,0}, 
{&namen_gad[10],10,122,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[11],0,0,11,0}, 
{&namen_gad[11],10,132,110,10, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,NULL,0,&namen_str[12],0,0,12,0}
};


struct Gadget no_gad =		/* in offne_file-window */
 {NULL, 20,27,100,12, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&no_str,0,0, 3, 0}; 
struct Gadget yes_gad =
 {&no_gad, 140,27,100,12, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&yes_str,0,0, 2, 0}; 
struct Gadget file_gad =
 {&yes_gad, 26,9,200,12, GADGHCOMP, STRINGCENTER|RELVERIFY, STRGADGET,
   NULL, 0, NULL, 0, (APTR)&TexString2, 1,0};

struct Gadget del_gad =
 {NULL, 119,140,42,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&del_str,0,0, 10, 0}; 
struct Gadget neu_gad =
 {&del_gad, 161,140,42,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&neu_str,0,0, 9, 0}; 
struct Gadget edit_gad =
 {&neu_gad, 127,126,50,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&edit_str,0,0, 8, 0}; 
struct Gadget lade_gad =
 {&edit_gad, 177,126,50,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&lade_str,0,0, 7, 0}; 
struct Gadget speicher_gad =
 {&lade_gad, 227,126,50,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&speicher_str,0,0, 6, 0}; 
struct Gadget input_gad =
 {&speicher_gad, 69,126,58,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&input_str,0,0, 5, 0}; 
struct Gadget list_gad =
 {&input_gad, 11,126,58,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&list_str,0,0, 4, 0}; 
struct Gadget abbruch_gad =
 {&list_gad, 12,140,99,12, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&abbruch_str,0,0, 3, 0}; 
struct Gadget print_gad =
 {&abbruch_gad, 203,140,74,8, GADGHBOX,GADGIMMEDIATE|RELVERIFY, BOOLGADGET,
   NULL,0,&print_str,0,0, 2, 0}; 
struct Gadget tex_gad =
 {&print_gad, 45,40,200,12, GADGHCOMP, STRINGCENTER|RELVERIFY, STRGADGET,
   NULL, 0, NULL, 0, (APTR)&TexString, 1,0};

struct Requester request =    /* look at function schein-request() */
{NULL,-1,-1,1,1,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL};


/*
 *	Windows
 */

struct NewWindow nw =
  {
   40,20,291,176, 0,1,
   MOUSEBUTTONS|GADGETDOWN|GADGETUP|RAWKEY|CLOSEWINDOW,
   ACTIVATE|RMBTRAP|GIMMEZEROZERO|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE,
   &tex_gad,
   NULL,
   (UBYTE *) ABOUT,
   NULL,
   NULL,
   0,0,0,0, 
   WBENCHSCREEN 
  };

struct NewWindow nw3 =		/* name-window  */
  {
   345,20,260,55, 0,1,
   GADGETDOWN|GADGETUP,
   ACTIVATE|RMBTRAP|GIMMEZEROZERO|WINDOWDRAG|WINDOWDEPTH,
   &file_gad,
   NULL,
   NULL,
   NULL,
   NULL,
   0,0,0,0, 
   WBENCHSCREEN 
  };

struct NewWindow nw4 =		/* list-window */
  {
   345,5,145,194, 0,1,
   GADGETDOWN|GADGETUP|CLOSEWINDOW|MOUSEBUTTONS,
   ACTIVATE|RMBTRAP|GIMMEZEROZERO|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE,
   &namen_gad[12],
   NULL,
   (UBYTE *) " List  ",
   NULL,
   NULL,
   0,0,0,0, 
   WBENCHSCREEN 
  };

struct NewWindow nw5 =		/* input-window */
  {
   345,20,291,50, 0,1,
   GADGETDOWN|GADGETUP|CLOSEWINDOW,
   ACTIVATE|RMBTRAP|GIMMEZEROZERO|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE,
   &input_tex_gad,  /*  Gad */
   NULL,
   NULL,
   NULL,
   NULL,
   0,0,0,0, 
   WBENCHSCREEN 
  };

struct NewWindow nw6 =		/* sesam-window */
  {
   345,80,260,55, 0,1,
   GADGETUP|GADGETDOWN,
   ACTIVATE|RMBTRAP|GIMMEZEROZERO|WINDOWDRAG|WINDOWDEPTH,
   &sesam_gad,
   NULL,
   (UBYTE *) " password: ",
   NULL,
   NULL,
   0,0,0,0, 
   WBENCHSCREEN 
  };

struct NewWindow new_inf_win =		/* info_window */
 {0,90,640,28, 1,2, NULL, ACTIVATE,
   NULL,NULL,NULL, NULL,
   NULL, 20,20,640,256, WBENCHSCREEN
 };


/*
 *	master control program
 */

main(argc,argv)
short argc;
char *argv[];
{
if( IntuitionBase->ActiveScreen->Width<639 ) ende(7);

if(!(DosBase=(long)OpenLibrary("dos.library",0))) ende(1);
if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0))) ende(2);
if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0))) ende(3);

GetPrefs(&prefs,(long)sizeof(struct Preferences));

if(!(timerport = CreatePort("Timer Port",0L))) ende(4);
if((openerror = OpenDevice(TIMERNAME,UNIT_VBLANK,(char *)&timereq,0L))!=0) ende(4);

if(argc>1)  strcpy(DefString2,argv[1]); 

draw();

start_timer();
 zmem = time(tt)-diff;
print_time(diff);

for(i=0;i<MAXI;i++) person[i] = 0;

offne_file(0);
s();

loop();   /* THE main-loop */
}  /*  End main()  */

loop()
{
  for(;;)
   {
    Wait((1<<w->UserPort->mp_SigBit) | (1<<timerport->mp_SigBit));

     while(message = (struct IntuiMessage *)GetMsg(w->UserPort))
     {
      class = message->Class;
      code = message->Code;
      ReplyMsg(message);
      switch (class)
       {
	case CLOSEWINDOW:  ende(0);
	case GADGETUP:     do_gadget_text(message, w);  break;
        case GADGETDOWN:   do_gadgets_bool(message, w); break;	
	case RAWKEY:	   if(code==80) ActivateGadget(&tex_gad,w,NULL); break;
       }   /*  End switch  */
     }     /*  End while1  */

     while(GetMsg(timerport))
      {start_timer();
       diff=time(tt)-zmem;
       print_time(diff);
      }  /* end while2 */

   }  /*  end for  */
}  /* End schleife()  */

do_gadget_text (mes, win)       /* execute text-gadget */
struct IntuiMessage *mes;
struct Window *win;
{
  struct Gadget *igad;
  int gadgid;
 
  igad = (struct Gadget *) mes->IAddress;
  gadgid = igad->GadgetID;
    switch(gadgid)
     {                              
	case 1: suchen(DefString); break;
     };
}

do_gadgets_bool (mes, win)       /* execute BOOL-gadgets */
struct IntuiMessage *mes;
struct Window *win;
{
  struct Gadget *igad;
  int gadgid;
 
  igad = (struct Gadget *) mes->IAddress;
  gadgid = igad->GadgetID;
    switch(gadgid)
     {                              
	case 2: drucke(DefString); break;
	case 3: ende(0);
	case 4: list(); break;
	case 5: input(0); break;  /* = new input */
	case 7: if((anderung==TRUE)&&(zaehler>0)) /*load*/
		{movemouse(190,38);
		ergebnis = AutoRequest(NULL,&text5,&postext1,&negtext1,NULL,NULL,260,50);
		  if(ergebnis==TRUE) offne_file(1); 
			/* if file has been saved: Request: Save ? */
		}
		offne_file(0); break;
	case 6: if(zaehler==0)
		 {movemouse(150,33);
		  ergebnis = AutoRequest(NULL,&text,&postext1,&postext1,NULL,NULL,200,50);
		  movemouse(w->LeftEdge+150,w->TopEdge+130); break;}
		offne_file(1); break; /*save*/
	case 8: input(1); break;      /* = edit record */
	case 9: neu(); break;
	case 10: del(); break;
     };
}
 

/*
 *	the functions
 */

status(was)  /* shows status */
char *was;
{
Move(rp,16,25); Text(rp,was,25);
}

s()
{status("Click gadget ...         ");}

de()
{Delay(50L); s();}

schein_request(an)  /* Requester: mouse-clicks won't be buffered ! */
int an;   /* 1 = onn, 0 = off */
{
if(an==1)
 {InitRequester(&request);
  Request(&request,w);}
else
 EndRequest(&request,w);
}

draw()	/* Opening the main-window */
{
 if(!(w = (struct Window *)OpenWindow(&nw))) ende(5);

    rp = w->RPort;
SetRast(rp,2);

SetAPen(rp,2);SetBPen(rp,1);Move(rp,16,12); Text(rp,"Status:",7);

 SetAPen(rp,0);
    RectFill(rp,12,140,110,151);     /* blue background at CANCEL-gadget */

SetAPen(rp,3);SetBPen(rp,1);
Move(rp,16,68); Text(rp," Number of records: ",20);
Move(rp,16,85); Text(rp,"  Name:",7);
Move(rp,16,95); Text(rp,"Street:",7);
Move(rp,16,105);Text(rp,"  Town:",7);
Move(rp,16,115);Text(rp," Phone:",7);


 SetAPen(rp,1);SetBPen(rp,2);
DrawBorder(rp,&StrBorder,0,0);
RefreshGadgets(&tex_gad,w,NULL);     /* draw gadgets */  
print_anzahl();
}

drucke(wen)	/* print address */
char *wen;
{
char john[30];
UBYTE *reg2 = 12570624;
UBYTE a;
a = *reg2&1; 

if(zaehler==0)   {movemouse(150,33);
		  ergebnis = AutoRequest(NULL,&text,&postext1,&postext1,NULL,NULL,200,50);
		  goto close_it;}

for(i=0;i<zaehler;i++)
{ if( my_strcmp(wen,person[i]->such_begriff)==NULL)
	{
	strcpy(john," Print <");
	strcat(john,person[i]->such_begriff);
	strcat(john,"> ? ");
	(UBYTE *) text2.IText = (UBYTE *)john;
		movemouse((strlen(john)*10)-50,38);
	ergebnis = AutoRequest(NULL,&text2,&postext1,&negtext1,NULL,NULL,strlen(john)*10+5,50);
	 if(ergebnis == FALSE) goto close_it;

	if(a==1) {status("Printer  off_line !      "); de(); goto close_it; }
	if((faus=fopen("par:","w"))==NULL)
     		 {status("No parallel.device !     "); de(); return(0);}
	status("Printing address.        ");
	fputs(person[i]->name,faus);
	  fputs("\n",faus);
	fputs(person[i]->strasse,faus);
	  fputs("\n",faus);
	fputs(person[i]->ort,faus);
	  fputs("\n",faus);
	fputs(person[i]->tel,faus);
	  fputs("\n\n",faus);
	 if(faus) fclose(faus);
	  s();
 	return(1);
	}
}

	movemouse(150,33);
ergebnis = AutoRequest(NULL,&text3,&postext1,&postext1,NULL,NULL,200,50);

close_it: movemouse(w->LeftEdge+150,w->TopEdge+130); return(0);

}  /*  end drucke() */


open_file(welches)	/* read data-file into memory */
UBYTE welches[30];
{
register char *z, *hilf;
long number;

status("Opening File !           ");     
if((eintrag = AllocMem(sizeof(struct FileInfoBlock),0L))==NULL) ende(6);
if(( lock = (struct FileLock *) Lock(welches,ACCESS_READ))==NULL) 
	{kein_wofile(); return(0);}
if(Examine(lock,eintrag)==NULL)
	{kein_wofile(); return(0);}
 UnLock(lock);

if((platz = AllocMem(eintrag->fib_Size,0L))==NULL) 
	{kein_wofile(); ende(6);}
if((fein=Open(welches,MODE_OLDFILE))==NULL)
	{kein_wofile(); return(0);}

number = Read(fein,platz,eintrag->fib_Size);
if(fein) Close(fein);

get_sesam();
if(DefString4[0]!=0) {compute(DefString4); 
		      decodiere(platz,number);
		      strcpy(DefString4,"\0"); } 

SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);

  strcpy(DefString,"\0"); 
RefreshGadgets(&tex_gad,w,NULL);

if(zaehler>0)
	{ for(i=0;i<zaehler;i++)
	     { if(person[i]) FreeMem(person[i],sizeof(struct Daten));
	       person[i] = 0; 
	     }
	}
for(i=0;i<MAXI;i++) person[i] = 0;
zaehler = 0;

/*  scan and modify in memory  */

z = platz;   /* = begin of data in memory */

if(*z!='{')  mach_reset();

for(;;)
{
for(;*z!='~' && *z!='{';z++) ;
if(*z=='~') break;		/* end of list -> break */

if((person[zaehler] = AllocMem(sizeof(struct Daten),0L))==NULL) break;
z+=1;
hilf = z;
for(;*z!='[';z++) ;
  *(z-1) = '\0';
strcpy(person[zaehler]->such_begriff,hilf);
z+=1;
hilf = z;
for(;*z!='[';z++) ;
  *(z-1) = '\0';
strcpy(person[zaehler]->name,hilf);
z+=1;
hilf = z;
for(;*z!='[';z++) ;
  *(z-1) = '\0';
strcpy(person[zaehler]->strasse,hilf);
z+=1;
hilf = z;
for(;*z!='[';z++) ;
  *(z-1) = '\0';
strcpy(person[zaehler]->ort,hilf);
z+=1;
hilf = z;
for(;*z!=']';z++) ;
  *(z) = '\0';
strcpy(person[zaehler]->tel,hilf);

zaehler += 1;
}   

anderung = FALSE;
if(eintrag)   FreeMem(eintrag,sizeof(struct FileInfoBlock));
if(platz)     FreeMem(platz,eintrag->fib_Size);

print_anzahl();

  RefreshGadgets(&tex_gad,w,NULL);

 s();
}  /* End open_file()  */

kein_wofile()	/* error during read-in data into memory */
{
if(lock) {UnLock(lock); lock = NULL;}
if(platz)   {FreeMem(platz,eintrag->fib_Size); platz = NULL;}
if(eintrag) {FreeMem(eintrag,sizeof(struct FileInfoBlock)); eintrag=NULL;}
status("File - Error !           "); Delay(50L);
status("Load - Mode ...          ");
}

mach_reset()	/* wrong password: Good By ! */
{
SetTaskPri(FindTask(0),127);
DisplayAlert(RECOVERY_ALERT,&alert1[0],50);
Forbid(); Disable();
sys_info(3,"Reset your system !!!",200);
 reset();
}

reset()	 /* wrong password: reset ! */
{
#asm
	move $0,34
#endasm
}

my_strcmp(t1,t2)
char *t1,*t2;
{
register unsigned char c1, c2;
register COUNT count;
for(count=0; count<=strlen(t1); count++)
 {
  c1=t1[count];
  c2=t2[count];
	  if(c1>180) c1=c1-131;
	  if(c2>180) c2=c2-131;
  if(c2>=65 && c2<=90) c2 +=32;
  if(c1>=65 && c1<=90) c1 +=32;
  if(c1<c2) return(-1);
  if(c1>c2) return(1);
 }
 return(0);
}

suchen(wen)	/* searches for term and and gives you suitable address */
char *wen;
{
for(i=0;i<zaehler;i++)
{ if( my_strcmp(wen,person[i]->such_begriff)==NULL)
	{ SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);

	  Move(rp,80,85);  Text(rp,person[i]->name,strlen(person[i]->name));
	  Move(rp,80,95);  Text(rp,person[i]->strasse,strlen(person[i]->strasse));
	  Move(rp,80,105); Text(rp,person[i]->ort,strlen(person[i]->ort));
	  Move(rp,80,115); Text(rp,person[i]->tel,strlen(person[i]->tel));
	  return(1);}
}
  status("No matching record !     "); de(); return(0);
}  /* end suchen()  */

start_timer()	/* initializing of timer-clock */
{
timereq.tr_time.tv_secs = 0;
timereq.tr_time.tv_micro = 999500;
timereq.tr_node.io_Command = TR_ADDREQUEST;
timereq.tr_node.io_Flags = 0;
timereq.tr_node.io_Error = 0;
timereq.tr_node.io_Message.mn_ReplyPort = timerport;

SendIO((char *) &timereq.tr_node);
}

print_time(diff)	/* prints time on screen */
long diff;
{
char s[8];
long h,m;
h=diff/3600;
diff -=h*3600;
m=diff/60;
diff -=m*60;

if(h<10)
  {s[0] = '0'; s[1] = '0'+h;}
 else {s[0] = '0'+(h/10); s[1] = '0'+(h-((h/10)*10));}

s[2] = ':';

if(m<10)
  {s[3] = '0'; s[4] = '0'+m;}
 else {s[3] = '0'+(m/10); s[4] = '0'+(m-((m/10)*10));}

s[5] = ':';

if(diff<10)
  {s[6] = '0'; s[7] = '0'+diff;}
 else {s[6] = '0'+(diff/10); s[7] = '0'+(diff-((diff/10)*10));}

s[8] = '\0';

 Move(rp,210,12);
 Text(rp,&s,8L);
}

offne_file(knoff)	/* load/save a file */
short knoff;
{
struct RastPort *rp_name;
struct IntuiMessage *message2;
ULONG class2; USHORT code2;
  struct Gadget *igad2;
  int gadgid2;

schein_request(1); /*an*/

if(knoff==1) {  status("Save - Mode ...          ");
		nw3.Title = (UBYTE *)" File-Name  (Save)";
		yes_str.IText = (UBYTE *)"  Save";}
if(knoff==0) {  status("Load - Mode ...          ");
		nw3.Title = (UBYTE *)" File-Name  (Load)";
		yes_str.IText = (UBYTE *)"  Load";}

if(!(offne_win = (struct Window *)OpenWindow(&nw3))) {sys_info(3,"No  List-WINDOW !",0); return(0);}
   rp_name = offne_win->RPort;
SetRast(rp_name,2);
SetAPen(rp_name,0);
	movemouse(a_w->LeftEdge+230,a_w->TopEdge+42);

RectFill(rp_name,20,27,119,38);
RectFill(rp_name,140,27,239,38);
RefreshGadgets(&file_gad,offne_win,NULL);
DrawBorder(rp_name,&StrBorder3,0,0);
ActivateGadget(&file_gad,offne_win,NULL);

for(;;)
{
Wait(1<<offne_win->UserPort->mp_SigBit);
    while(message2 = (struct IntuiMessage *)GetMsg(offne_win->UserPort))
    {
     class2 = message2->Class;
     code2 = message2->Code;
     ReplyMsg(message2);
	  igad2 = (struct Gadget *) message2->IAddress;
	  gadgid2 = igad2->GadgetID;
     switch (class2)
      {
       case GADGETDOWN:
	    switch(gadgid2)
	     {                              
		case 2: if(knoff==0) {if(open_file(DefString2)!=0) goto sense; }   /*yes */
			if(knoff==1) {if(speichern(DefString2)!=0) goto sense; }
			ActivateGadget(&file_gad,offne_win,NULL); break;
		case 3: goto sense; break;	/* no */
	     };
       case GADGETUP: 
	    switch(gadgid2)
 	     {case 1:	if(knoff==0) {if(open_file(DefString2)!=0) goto sense; }   /*yes */
			if(knoff==1) {if(speichern(DefString2)!=0) goto sense; }
			ActivateGadget(&file_gad,offne_win,NULL); break;
	     };
      };
    } /*  end while  */
}   /*  end for  */

sense:
schein_request(0); /*off*/
if(offne_win)  {CloseWindow(offne_win); offne_win=NULL;
s();
movemouse(w->LeftEdge+150,w->TopEdge+130);
}
}   /*  End offne_file()  */

int vergleich(a,b)    /* for quicksort()  */
char *a, *b;
{
return(my_strcmp(a,b));
}

list()	/* shows you list of terms (alphabetical), click them ! */
{
struct RastPort *rp_list;
struct IntuiMessage *message2;
ULONG class2; USHORT code2;
  struct Gadget *igad2;
  int gadgid2;
register int j=0, akt=0;

schein_request(1); /*an*/
status("List - Mode ...          ");

for(i=0;i<MAXI;i++) strcpy(liste[i],"\0");

if(zaehler==0)   {movemouse(150,33);
		  ergebnis = AutoRequest(NULL,&text,&postext1,&postext1,NULL,NULL,200,50);
		  goto close_it_2;}

 if(!(list_win = (struct Window *)OpenWindow(&nw4))) {sys_info(3,"No  List-WINDOW !",0); return(0);}
    rp_list = list_win->RPort;
      SetRast(rp_list,2);
      SetAPen(rp_list,3); SetBPen(rp_list,1); SetDrMd(rp_list,JAM2);
	movemouse(a_w->LeftEdge+30,a_w->TopEdge+187);

for(i=0;i<zaehler;i++)
     	strcpy(liste[i],person[i]->such_begriff);

qsort(liste,zaehler,33,vergleich);

     j = ((zaehler-1)/13);  /* how many whole pages ? (13 records/page possible) */

if(zaehler<=13)
	 {   for(i=0;i<zaehler;i++)  (char *)namen_str[i].IText = liste[i];
	     Move(rp_list,6,156); Text(rp_list,"(end) ",6);
	     for(i=12;i>=zaehler;i--) namen_gad[i].Flags |= GADGDISABLED;
	 }
   else  {for(i=0;i<13;i++) (char *)namen_str[i].IText = liste[i];
	  OnGadget(&vor_gad,list_win,NULL); akt=0;
	  Move(rp_list,6,156); Text(rp_list,"(more)",6);}

col(akt,-2);
sprintf(Date_Buffer,"%d/%d",akt+1,j+1); Move(rp_list,a_w->Width-14-(strlen(Date_Buffer)*7),156); Text(rp_list,Date_Buffer,strlen(Date_Buffer));

for(;;)
{
Wait(1<<list_win->UserPort->mp_SigBit);
  while(message2 = (struct IntuiMessage *)GetMsg(list_win->UserPort))
    {
      class2 = message2->Class;
      code2  = message2->Code; 	
      ReplyMsg(message2);
	  igad2 = (struct Gadget *) message2->IAddress;
	  gadgid2 = igad2->GadgetID;
      switch (class2)
       {
	case MOUSEBUTTONS: if(code2==MENUDOWN) goto close_it_1; break; 
	case CLOSEWINDOW: goto close_it_1;
	case GADGETDOWN:
		if(gadgid2>=0 && gadgid2<=12) {such(gadgid2);col(akt,gadgid2);} break;
        case GADGETUP:
		if(gadgid2>=0 && gadgid2<=12) {RefreshGadgets(&namen_gad[12],list_win,NULL);}
		if(gadgid2==20) /*go on*/
		 	 {akt = akt+1; 
			  for(i=0;i<13;i++) (char *)namen_str[i].IText = liste[(akt*13)+i];
			     SetRast(rp_list,2);
			  OnGadget(&zurueck_gad,list_win,NULL);
			  if(akt==j) { for(i=12;i>=zaehler-(j*13);i--) namen_gad[i].Flags |= GADGDISABLED; 
				       vor_gad.Flags |= GADGDISABLED; 
				       Move(rp_list,6,156); Text(rp_list,"(end) ",6);}
				 else {Move(rp_list,6,156); Text(rp_list,"(more)",6);} 
			 sprintf(Date_Buffer,"%d/%d",akt+1,j+1); Move(rp_list,a_w->Width-14-(strlen(Date_Buffer)*7),156); Text(rp_list,Date_Buffer,strlen(Date_Buffer));
			  col(akt,-1);
			 }
		if(gadgid2==21) /*go back*/
			 {   for(i=12;i>=zaehler-(j*13);i--) namen_gad[i].Flags &= ~GADGDISABLED; 
	 		 akt = akt-1; 
			 for(i=0;i<13;i++) (char *)namen_str[i].IText = liste[(akt*13)+i];
			    SetRast(rp_list,2);
			 OnGadget(&vor_gad,list_win,NULL);
			      Move(rp_list,6,156); Text(rp_list,"(more)",6);
			 if(akt==0) zurueck_gad.Flags |= GADGDISABLED;
			sprintf(Date_Buffer,"%d/%d",akt+1,j+1); Move(rp_list,a_w->Width-14-(strlen(Date_Buffer)*7),156); Text(rp_list,Date_Buffer,strlen(Date_Buffer));
			 col(akt,-1);
		 	}
       };/* switch class2 */
      } /*  end while  */
 }   /*  end for  */

close_it_1:
for(i=12;i>=zaehler-(j*13);i--) namen_gad[i].Flags &= ~GADGDISABLED; 
zurueck_gad.Flags |= GADGDISABLED; 
vor_gad.Flags |= GADGDISABLED;
if(list_win) {CloseWindow(list_win); list_win=NULL;}

close_it_2: 
schein_request(0); /*aus*/
s();
movemouse(w->LeftEdge+150,w->TopEdge+130);
} /* end list()  */

such(a)
short a;
{
strcpy(DefString,(char *)namen_str[a].IText);
	RefreshGadgets(&tex_gad,w,NULL);
suchen((char *)namen_str[a].IText);
}

col(page,num)	/* changes color of activated tracing term */
short page;
short num;
{
static short st_page=-1;
static short st_num=-1;
short i;

if(num==-2)
  { for(i=0;i<=12;i++) {namen_str[i].FrontPen=1; namen_str[i].BackPen=2;}
    st_page=-1; st_num=-1; }
if(num==-1)
  { if(st_page==page) {namen_str[st_num].FrontPen=2; namen_str[st_num].BackPen=1;}
    else for(i=0;i<=12;i++) {namen_str[i].FrontPen=1; namen_str[i].BackPen=2;} }
if(num<0) RefreshGadgets(&namen_gad[12],list_win,NULL);

if(num>=0)
  { st_page=page; st_num=num;
    for(i=0;i<=12;i++) {namen_str[i].FrontPen=1; namen_str[i].BackPen=2;}
    namen_str[st_num].FrontPen=2; namen_str[st_num].BackPen=1; }
} /* end col() */

input(edit)	/* new input (edit=0), modify record (edit=1) */ 
short edit;
{
struct RastPort *rp_input;
struct IntuiMessage *message2;
ULONG class2; USHORT code2;
  struct Gadget *igad2;
  int gadgid2;
short what = 1;

schein_request(1); /*an*/

if(edit==1)
{
status("Edit - Mode ...          ");
 for(i=0;i<zaehler;i++) 
	if( my_strcmp(DefString,person[i]->such_begriff)==NULL) 
		{strcpy(DefString3,person[i]->such_begriff); 
		nw5.Title = (UBYTE *)" Edit "; goto weiter;}
	movemouse(150,33);
     ergebnis = AutoRequest(NULL,&text3,&postext1,&postext1,NULL,NULL,200,50);
     goto close_in;
}

if(edit==0) {nw5.Title = (UBYTE *)" Input ";
	     status("Input - Mode ...         ");}
weiter:
 if(!(input_win = (struct Window *)OpenWindow(&nw5))) { sys_info(3,"No Input/Edit-WINDOW !",0); return(0);}
    rp_input = input_win->RPort;

    SetRast(rp_input,2); movemouse(a_w->LeftEdge+10,a_w->TopEdge+5);

    DrawBorder(rp_input,&StrBorder4,0,0);
    SetAPen(rp_input,1); SetBPen(rp_input,2); SetDrMd(rp_input,JAM2);
    Move(rp_input,5,10); Text(rp_input,"Tracing term:   ",16);

if(edit==0) {strcpy(DefString,"\0"); RefreshGadgets(&tex_gad,w,NULL);
		strcpy(DefString3,"\0");
		SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);}


for(;;)
{
RefreshGadgets(&input_tex_gad,input_win,NULL);
ActivateGadget(&input_tex_gad,input_win,NULL);

Wait(1<<input_win->UserPort->mp_SigBit);

  while(message2 = (struct IntuiMessage *)GetMsg(input_win->UserPort))
    {
      class2 = message2->Class;
      code2  = message2->Code; 	
      ReplyMsg(message2);
	  igad2 = (struct Gadget *) message2->IAddress;
	  gadgid2 = igad2->GadgetID;
      switch (class2)
       {
	case CLOSEWINDOW: goto close_in;
        case GADGETDOWN:
	    switch(gadgid2)
	     {case 1: break;                              
	     };
        case GADGETUP:
	    switch(gadgid2)
	     {                              
case 1:

if(what==1)
{

 if(edit==0)
 {if((person[zaehler] = AllocMem(sizeof(struct Daten),0L))==NULL) return(0);
  strcpy(person[zaehler]->such_begriff,DefString3);
  strcpy(DefString,DefString3); 
  strcpy(DefString3,"\0"); 
 }

 if(edit==1)
 {
  strcpy(person[i]->such_begriff,DefString3);
  strcpy(DefString,DefString3); 
  strcpy(DefString3,person[i]->name);
 }

 RefreshGadgets(&tex_gad,w,NULL);
Move(rp_input,5,10); Text(rp_input,"Name/First-Name:",16);
what = 2;
break;
}

if(what==2)
{
Move(rp,80,85);  Text(rp,DefString3,strlen(DefString3));

if(edit==0) {strcpy(person[zaehler]->name,DefString3); strcpy(DefString3,"\0");} 

if(edit==1) 
{strcpy(person[i]->name,DefString3); strcpy(DefString3,person[i]->strasse);
 suchen((char *)DefString);}

    Move(rp_input,5,10); Text(rp_input,"Street:         ",16);

what = 3;
break;
}

if(what==3)
{
Move(rp,80,95);  Text(rp,DefString3,strlen(DefString3));

if(edit==0) {strcpy(person[zaehler]->strasse,DefString3); strcpy(DefString3,"\0");}
if(edit==1) 
{strcpy(person[i]->strasse,DefString3); strcpy(DefString3,person[i]->ort);
 suchen((char *)DefString);}


    Move(rp_input,5,10); Text(rp_input,"Town:           ",16);

what = 4;
break;
}

if(what==4)
{
Move(rp,80,105);  Text(rp,DefString3,strlen(DefString3));

if(edit==0) {strcpy(person[zaehler]->ort,DefString3); strcpy(DefString3,"\0");}
if(edit==1) 
{strcpy(person[i]->ort,DefString3); strcpy(DefString3,person[i]->tel);
 suchen((char *)DefString);}

    Move(rp_input,5,10); Text(rp_input,"Phone-Nr.:      ",16);

what = 5;
break;
}

if(what==5)
{
Move(rp,80,115);  Text(rp,DefString3,strlen(DefString3));

if(edit==0) {strcpy(person[zaehler]->tel,DefString3);
             strcpy(DefString3,"\0");
	    Move(rp_input,5,10); Text(rp_input,"Tracing term:",13);
	SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);
	   strcpy(DefString,"\0"); 
	RefreshGadgets(&tex_gad,w,NULL);
	zaehler +=1;
	print_anzahl();
	what = 1; }
if(edit==1) {strcpy(person[i]->tel,DefString3);
		 suchen((char *)DefString);
		 goto close_in;}
break;
}
	     };/*switch gadgid*/ break;

       };/*switch messageclass*/
      } /*  end while  */
 }   /*  end for  */

close_in:
anderung = TRUE;
if(input_win) {CloseWindow(input_win); input_win=NULL;} 
if(edit==0){SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);
	    strcpy(DefString,"\0"); 
	    RefreshGadgets(&tex_gad,w,NULL);}
schein_request(0); /*aus*/
s();
  movemouse(w->LeftEdge+150,w->TopEdge+130);
} /* end input()  */


speichern(speicher_string)	/* the saving */
UBYTE speicher_string[30];
{
char *hilf;
LONG anzahl = 0;
int handle;

status("Saving file ...          ");

if((handle=creat(speicher_string,0))==-1)
    {status("Saving-Error !!!         "); de(); return(0);}

for(i=0;i<zaehler;i++)
{
anzahl = anzahl + strlen(person[i]->such_begriff)
		+ strlen(person[i]->name)
		+ strlen(person[i]->strasse)
		+ strlen(person[i]->ort)
		+ strlen(person[i]->tel)
		+ 10;   /* die Klammern */
}
anzahl += 2;   /* for ~ und \0 */

if((platz = AllocMem(anzahl,0L))==NULL) 
   {status("Saving-Error !!!         "); de(); return(0);}

hilf = platz;

for(i=0;i<zaehler;i++)
{
strcpy(hilf,"{");
 hilf+=1;

strcat(hilf,person[i]->such_begriff);
  hilf+=strlen(person[i]->such_begriff);
 strcat(hilf,"}[");
  hilf+=2;

strcat(hilf,person[i]->name);
 hilf+=strlen(person[i]->name);
 strcat(hilf,"][");
  hilf+=2;

strcat(hilf,person[i]->strasse);
 hilf+=strlen(person[i]->strasse);
 strcat(hilf,"][");
  hilf+=2;

strcat(hilf,person[i]->ort);
 hilf+=strlen(person[i]->ort);
 strcat(hilf,"][");
  hilf+=2;

strcat(hilf,person[i]->tel);
 hilf+=strlen(person[i]->tel);
 strcat(hilf,"]");
  hilf+=1;
}

strcat(hilf,"~\0");

get_sesam();
if(DefString4[0]!=0) {compute(DefString4); 
                      codiere(platz,anzahl);
		      strcpy(DefString4,"\0"); } 

write(handle,platz,anzahl);
close(handle);
if(platz)     FreeMem(platz,anzahl);

anderung = FALSE; movemouse(w->LeftEdge+150,w->TopEdge+130);

DisplayBeep(NULL);
s();
return(1);
}  /* end speichern()  */


neu()	/* delete all records */
{

if(zaehler==0) goto aff;

	movemouse(150,33);
ergebnis = AutoRequest(NULL,&text4,&postext1,&negtext1,NULL,NULL,200,50);
	if(ergebnis==FALSE) goto aff;

 for(i=0;i<zaehler;i++)
	     { if(person[i]) FreeMem(person[i],sizeof(struct Daten));
	       person[i] = 0; 
	     }
for(i=0;i<MAXI;i++) person[i] = 0;
zaehler = 0;
print_anzahl();
strcpy(DefString,"\0"); RefreshGadgets(&tex_gad,w,NULL);
SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);
anderung = TRUE;

aff: movemouse(w->LeftEdge+150,w->TopEdge+130);
}  /*  end neu() */


del()	/* delete actual record */
{
char john[30];
short a;

if(zaehler==0)   {movemouse(150,33);
		  ergebnis = AutoRequest(NULL,&text,&postext1,&postext1,NULL,NULL,200,50);
		  goto close_neu;}

for(i=0;i<zaehler;i++)
{ if( my_strcmp(DefString,person[i]->such_begriff)==NULL)
	{
	strcpy(john," Delete <");
	strcat(john,person[i]->such_begriff);
	strcat(john,"> ? ");
	(UBYTE *) text2.IText = (UBYTE *)john;

		movemouse((strlen(john)*10)-50,38);
	ergebnis = AutoRequest(NULL,&text2,&postext1,&negtext1,NULL,NULL,strlen(john)*10+5,50);
		movemouse(w->LeftEdge+150,w->TopEdge+130);
	  if(ergebnis == FALSE) goto close_neu;


	if(person[i]) FreeMem(person[i],sizeof(struct Daten));
	for(a=i;a<zaehler;a++) person[a] = person[a+1];
	zaehler -=1; person[zaehler] = 0; /* last record = 0 */

	print_anzahl();
	strcpy(DefString,"\0"); RefreshGadgets(&tex_gad,w,NULL);
	SetAPen(rp,2); RectFill(rp,77,78,285,120); SetAPen(rp,1);

        status("Record deleted.           "); de();
	anderung = TRUE; return(1);
	}
}

	movemouse(130,33);
ergebnis = AutoRequest(NULL,&text3,&postext1,&postext1,NULL,NULL,200,50);

close_neu: 
movemouse(w->LeftEdge+150,w->TopEdge+130);
return(0);
}  /*  end del() */

movemouse (ziel_x, ziel_y)	/* moves mouse-cursor to a given position; */
int ziel_x;			/* needs preferences (look at main() */
int ziel_y;
{
struct InputEvent	mouse;
struct IOStdReq *ioreq;
struct MsgPort *ioport;

int pos_x = IntuitionBase->ActiveScreen->MouseX;
int pos_y = IntuitionBase->ActiveScreen->MouseY;
int dx = ziel_x - pos_x;
int dy = ziel_y - pos_y;

if (!(ioport = CreatePort (NULL, NULL))) goto weg;
if(!(ioreq = CreateStdIO(ioport))) goto weg;
if (OpenDevice ("input.device", 0L, ioreq, 0L)) {
		ioreq -> io_Device = 0; goto weg;}

	ioreq -> io_Command = IND_WRITEEVENT;
	ioreq -> io_Flags = 0;
	ioreq -> io_Length = sizeof (struct InputEvent);
	ioreq -> io_Data = (APTR) &mouse;

	mouse.ie_NextEvent = 0;
	mouse.ie_Class = IECLASS_RAWMOUSE;
	mouse.ie_TimeStamp.tv_secs = mouse.ie_TimeStamp.tv_micro = 0;
	mouse.ie_Code = IECODE_NOBUTTON;
	mouse.ie_Qualifier = IEQUALIFIER_RELATIVEMOUSE;
	mouse.ie_X = prefs.PointerTicks * dx;
	mouse.ie_Y = prefs.PointerTicks * (dy+dy);  /* because HiRes ! */
	if(DoIO (ioreq)) goto weg;

weg:
if (ioreq)  {
	if(ioreq->io_Device) CloseDevice(ioreq);
	DeleteStdIO (ioreq);
	    }
if (ioport) DeletePort (ioport);
} /* end movemouse() */


print_anzahl()	/* shows number of records */
{
	SetAPen(rp,2); RectFill(rp,192,60,285,72); SetAPen(rp,1);
sprintf(Date_Buffer,"%d",zaehler); Move(rp,193,68); Text(rp,Date_Buffer,strlen(Date_Buffer));
}

decodiere(reihe,number)
UBYTE reihe[];
LONG number;
{
;
}  /* end decodiere()  */


codiere(reihe,number)
UBYTE reihe[];
LONG number;
{
;
}  /* end codiere()  */

compute(sesam)
UBYTE sesam[];
{
;
}  /* end compute()  */


get_sesam()	/* enter the password */
{
struct RastPort *rp_sesam;
struct IntuiMessage *message2;
ULONG class2; USHORT code2;
  struct Gadget *igad2;
  int gadgid2;

 if(!(sesam_win = (struct Window *)OpenWindow(&nw6))) { sys_info(3,"No Sesam-WINDOW !",0); return(0);}
    rp_sesam = sesam_win->RPort;

    SetRast(rp_sesam,2);
	 SetAPen(rp_sesam,0);
	 RectFill(rp_sesam,66,25,185,36);

    DrawBorder(rp_sesam,&StrBorder5,0,0);
RefreshGadgets(&sesam_gad,sesam_win,NULL); 
    ActivateGadget(&sesam_gad,sesam_win,NULL);

movemouse(a_w->LeftEdge+170,a_w->TopEdge+38);

for(;;)
{
Wait((1<<sesam_win->UserPort->mp_SigBit));
    while(message2 = (struct IntuiMessage *)GetMsg(sesam_win->UserPort))
    {
     class2 = message2->Class;
     code2 = message2->Code;
     ReplyMsg(message2);
	  igad2 = (struct Gadget *) message2->IAddress;
	  gadgid2 = igad2->GadgetID;
     switch (class2)
      {
	case GADGETDOWN:
	    switch(gadgid2)
	     {                              
		case 2: goto jesus; break; 
	     };
	case GADGETUP: goto jesus; break;
      };
    } /*  end while  */
}  /* end for */

jesus:
if(sesam_win) {CloseWindow(sesam_win); sesam_win=NULL;}
return(1);
}

sys_info(a_pen,text,dauer)   /* a_pen: Color of Text; */
 int dauer;		/* if dauer==0 : then depending on the length of text */
 short a_pen;
 char *text;
{
struct Window *inf_win;
struct RastPort *inf_rp;

  if((new_inf_win.Width = (strlen(text)*8)+10)<190) new_inf_win.Width=190;
  new_inf_win.LeftEdge = (640-new_inf_win.Width)/2;
  new_inf_win.Title = (UBYTE *)"(Wo) User-Information: ";
if((inf_win =(struct Window *)OpenWindow(&new_inf_win)) == NULL) return(0);
  inf_rp = inf_win->RPort;

	SetAPen(inf_rp,1);
  RectFill(inf_rp,2,10,new_inf_win.Width-3,26);
	SetAPen(inf_rp,a_pen); SetBPen(inf_rp,1); SetDrMd(inf_rp,JAM2);
  Move(inf_rp,5,21);
Text(inf_rp,text,strlen(text));

switch(dauer)
{  case 0:  Delay(strlen(text)*7); break; /*von Anzahl der Buchstaben abhängig */
  default:  Delay(dauer); break;  /* so lang wie dauer */
};

if(inf_win) CloseWindow(inf_win);
}

ende(error_nr)  /* it's never to late ... */
short error_nr;
{
if((anderung==TRUE)&&(zaehler>0))
{
	movemouse(190,38);
ergebnis = AutoRequest(NULL,&text5,&postext1,&negtext1,NULL,NULL,260,50);
	if(ergebnis==TRUE) offne_file(1); 
	/* if file has been changed: save it ? */
}

AbortIO((char *) &timereq.tr_node);
if(openerror==0) CloseDevice(&timereq);
if(timerport) DeletePort(timerport);


if(zaehler>0)
{for(i=0;i<zaehler;i++)
 { if(person[i]) FreeMem(person[i],sizeof(struct Daten));}
}

  if(w) CloseWindow(w);

switch(error_nr)
{case 0: sys_info(2,"  User Abort.  ",0); break;
 case 1: sys_info(3,"No  DOS.library !",0); break; 
 case 2: sys_info(3,"No  GFX.library !",0); break;
 case 3: sys_info(3,"No  INTUITION.library !",0); break;
 case 4: sys_info(3,"No  TIMER-Port/Devive !",0); break;
 case 5: sys_info(3,"No  Main-WINDOW !",0); break;
 case 6: sys_info(3,"MEMORY-Allocation problem !",0); break;
 case 7: sys_info(3,"No HiRes-Screen-Resolution !",0); break;
}; 

if(DosBase) CloseLibrary(DosBase);
  if(GfxBase) CloseLibrary(GfxBase);
  if(IntuitionBase) CloseLibrary(IntuitionBase);

exit(1);
}  /* end ende()  */
