/*********************************************************************/
/* TELEFON: Eine Mini-Telefonnummer-Verwaltung zur Demonstration des */
/*          Arrays aus Pointern, der GEPOINTERTEN LISTE              */
/*-------------------------------------------------------------------*/
/*                      (C) by Dirk Owerfeldt '89                    */
/*********************************************************************/


/*----------*/
/* Includes */
/*----------*/

#include <exec/types.h>
#include <stdio.h>

#define REG register
#define BOOLEAN BOOL
#define CHAR char

#define CLS   fputchar ( 0xc )
#define TASTE printf("-- Return --"); gets ( hilf )

/*---------------------------------*/
/* Funktionsprototypen fuer ANSI-C */
/*---------------------------------*/

extern VOID main(VOID);
extern VOID append(VOID);
extern VOID insert(VOID);
extern VOID delete(VOID);
extern VOID search(VOID);
extern VOID list(VOID);

/*-------------------*/
/* Die Datenstruktur */
/*-------------------*/

char hilf[ 50 ];

typedef struct TELEFON
{
   CHAR name   [50];
   CHAR vorname[30];
   CHAR tel    [15];
}TELEFON;


#define MAX 100

TELEFON *daten[MAX];
WORD    pos = 0 ;


/*******************/
/* HILFSFUNKTIONEN */
/*******************/

/*-----------------------*/
/* Zeigen eines Eintrags */
/*-----------------------*/

VOID show_it(tp)
TELEFON *tp;
{
  printf("Name   : %s\n",tp->name);
  printf("Vorname: %s\n",tp->vorname);
  printf("Telefon: %s\n\n",tp->tel);
}

/*-------------------------*/
/* Einlesen eines Eintrags */
/*-------------------------*/

VOID read_it(tp)
TELEFON *tp;
{
  printf("Name   : "); gets(tp->name);
  printf("Vorname: "); gets(tp->vorname);
  printf("Telefon: "); gets(tp->tel);
  printf("\n\n");
} 


/*---------------------------*/
/* Einfügen an der Stelle nr */   
/*---------------------------*/

VOID einfuegen(nr)  
{
  WORD i;

  for(i=pos;i>=nr;i--)
      daten[i]=daten[i-1];

  daten[nr] = (TELEFON *) malloc(sizeof(TELEFON));
  pos++;
}

/*-------------------*/
/* Lösche Eintrag nr */   
/*-------------------*/

VOID loesche(nr)  
{
  WORD i;
 
  free(daten[nr]);

  for(i=nr;i<pos;i++)
      daten[i]=daten[i+1];
  daten[--pos]=NULL;
}


/*---------------------------*/
/* Eine kleine Telefonkartei */
/*---------------------------*/

VOID main()
{
   BOOLEAN  schleife=TRUE;
   REG WORD i;

   /*--------------------*/
   /* Feld intialisieren */
   /*--------------------*/
 
   for(i=0;i<MAX;i++)
            daten[i]=NULL;          

   /*-----------*/
   /* Hauptmenü */
   /*-----------*/

   while(schleife)
   {
      CLS;

      printf("** TELEFON: eine gepointerte Liste **\n");
      printf("**          by Dirk Owerfeldt 1989 **\n\n\n");
      printf("1) Kartei erweitern\n");
      printf("2) Eintrag einfügen\n");
      printf("3) Eintrag löschen\n");
      printf("4) Name suchen\n");
      printf("5) Kartei listen\n");
      printf("9) Ende\n\n");

      printf("Ihre Wahl: ");
      gets(hilf); 

      printf("\n\n\n");

      CLS;
      switch(hilf[ 0 ])
      {
        case '1': append();
                  break;

        case '2': insert();
                  break;

        case '3': delete();
                  break;

        case '4': search();
                  break;

        case '5': list();
                  break;

        case '9': schleife=FALSE;
                  break;
      }
   }
}

/*-----------------------------*/
/* Am Ende der Liste eintragen */ 
/*-----------------------------*/

VOID append()
{
   TELEFON *hp;

   printf("\n\n** Neue Einträge anhängen **\n\n");
   printf("Beenden durch Name = 'Ende'\n\n\n");

   /*--------------------------------------*/
   /* Speicher für neuen Eintrag anfordern */
   /*--------------------------------------*/

   hp = (TELEFON *) malloc(sizeof(TELEFON));   
   read_it(hp);

   while(strcmp(hp->name,"ende"))   
   {
      daten[pos++]=hp;

      hp = (TELEFON *) malloc(sizeof(TELEFON));
      read_it(hp);
   }

   free(hp);  /* Der letzte Eintrag (mit Name='ende') wird nicht  */
              /* in die Liste eingetragen und kann deshalb wieder */
}             /* freigegeben werden                               */


/*-------------------------------*/
/* An bestimmter Stelle einfügen */
/*-------------------------------*/
   
VOID insert()
{ 
   CHAR snr[10];
   WORD nr;

   printf("\n** Einfügen **\n\n\n");

   printf("An welcher Position einfügen (0-%d): ",pos-1);
   gets(snr);
   printf("\n\n");    

   nr = atoi(snr);
   if((nr<0)||(nr>=pos)) printf("\nWert nicht möglich !!!\n\n\n");
   else                 
   {
      einfuegen(nr);
      read_it(daten[nr]);
   }  
}

/*-----------------------*/
/* Einen Eintrag löschen */
/*-----------------------*/

VOID delete()
{
   CHAR snr[10];
   WORD nr;

   printf("** Löschen eines Elementes **\n\n\n");
   printf("Welches Element löschen (0-%d):",pos-1);
   gets(snr);

   nr = atoi(snr);
   if((nr<0)||(nr>=pos))
   {
      printf("\nWert nicht möglich !!!\n\n\n");
      TASTE;
   }
   else                  loesche(nr);
}
 
/*--------------*/
/* Namen suchen */
/*--------------*/

VOID search()
{ 
   WORD i;
   CHAR name[50];

   printf("** Namen suchen **\n\n\n");
   printf("Gesuchter Name: ");
   gets(name);

   for(i=0;i<pos;i++)
	   if(!strcmp(name,daten[i]->name))
       {
          printf("\nName gefunden:\n\n");
          show_it(daten[i]);
          TASTE;
          return;
       }

   printf("\nName konnte nicht gefunden werden !!\n\n");
   TASTE;
}

/*----------------------------*/
/* Die gesamte Liste ausgeben */
/*----------------------------*/
       
VOID list()
{
   WORD i;

   printf("\n** Telefonliste **\n\n\n");

   for (i=0;i<pos;i++)
             show_it(daten[i]);
 
   TASTE;
}

