/**************************************************************************

                         Denne filen er en del av
                           EXEC's store C-kurs

                              Programmert av 
                    Ørjan Eriksen og Torstein Pettersen

                    hentlagre.c   leksjon 2   EXEC 6.89

**************************************************************************/


/* Først gir vi beskjed til kompilatoren om hvilke header-filer som skal
   hentes inn. Disse følger med kompilatoren: */

#include <exec/types.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <string.h>
#include <stdio.h>

/* For å demonstrere bruken av egne header-filer, har vi laget en som heter
   "base.h", og som inneholder et par definisjoner  */

#include "base.h"

/* Her utfører vi en forhåndsdeklarering av funksjonene i programmet */

void les_inn_data(struct Liste *);
struct Liste *finn_post(struct Liste *);
void slett_alt(struct Liste *);
void ny_post(struct Liste **,struct Liste **);
void vent();
void vis_post(struct Liste *);

/* Programmets 'globale' variabler deklareres. Disse er pekere til
   det første og siste 'kortet' i kartoteket vårt  */

struct Liste *lhode = NULL;		/* starten på listen */
struct Liste *lslutt = NULL;	/* siste post i listen */

/****************** her starter koden for funksjonene *******************/


/****************************************************************
  vent() er en rutine som skriver en melding ut på skjermen,
    og deretter venter til brukeren trykker på return-tasten   */


void vent()
{
	printf("\n\n\x1b[33;42m Press RETURN for hovedmeny! \x1b[0m");
	getchar();
}



/*****************************************************************
  slett_alt frigjør minnet for alle poster i listen. Den 
    brukes når programmet avsluttes for å 'rydde opp'.          */


void slett_alt(hode)
register struct Liste *hode;
{
	register struct Liste *lst,*dummy; 

	lst = hode;                     /* peker til første post */

	while (lst) {
		dummy = lst->neste;     /* Ta vare på pekeren til neste */
		FreeMem(lst,LLENGDE);   /* Frigjør minnet               */
		lst = dummy;            /* og sett lst lik neste post   */
	}
}

/******************************************************************
  les_inn_data leser data inn i en post. pst er pekeren til
  denne posten. Vi benytter funksjonen gets() for å lese inn
  teksten i char-variabelen dummy, som maksimalt kan inneholde
  80 tegn. Så koperes teksten over i den variabelen den skal
  være, med funksjonen strcpy(til,fra). Denne funksjonen kopierer
  tegn for tegn helt til den finner en null, så for å få riktig
  lengde på teksten slik at den passer i variabelen den skal til,
  setter vi det siste tegnet som skal kopieres lik null.         */

void les_inn_data(pst)
struct Liste *pst;
{
 	char dummy[80];                 /* en tom tekst */

	printf("\x1b[3;0H\x1b[JSkriv Inn data for en person \n\n");

	printf("Navn......: ");         /* Skriv ut "Navn....:        */
	gets(dummy);                    /* Les inn tekst i 'dummy'    */
	dummy[29] = '\0';               /* Sett tegn nr. 29 lik null  */
	strcpy(pst->Navn,dummy);        /* og kopier teksten over til */
                                        /* feltet 'navn' i posten pst */
	printf("Adresse...: ");         /* Gjør det samme med         */
	gets(dummy);                    /* adressen...                */
	dummy[29] = '\0';
	strcpy(pst->Adresse,dummy);

	printf("Post Nr...: ");         /* ...postnummeret...         */            
	gets(dummy);                    
	dummy[5] = '\0';
	strcpy(pst->PostNr,dummy);

	printf("Post Sted : ");         /* ...poststedet...           */
	gets(dummy);
	dummy[19] = '\0';
	strcpy(pst->PostSted,dummy);

	printf("Telefon Nr: ");         /* ...og telefonnummeret!     */ 
	gets(dummy);
	dummy[9] = '\0';
	strcpy(pst->Telefon,dummy);
}


/*******************************************************************
   vis_post skriver ut innholdet i en post,
   angitt med pekeren "post".                                     */

void vis_post(post)
struct Liste *post;
{
	if (!post)          /* hvis pekeren er lik null...   */
		return;     /* hopper vi ut av funksjonen!   */

	printf("\x1b[3;0H\x1b[J\n\x1b[1mPersondata\x1b[0m\n\n");
	printf("Navn......: %s\n",post->Navn);
	printf("Adresse...: %s\n",post->Adresse);
	printf("Post Nr...: %s\n",post->PostNr);
	printf("Post Sted.: %s\n",post->PostSted);
	printf("Telefon Nr: %s\n",post->Telefon);
}



/****************************************************************
   finn_post leter etter en post i listen                       */


struct Liste *finn_post(lhd)
struct Liste *lhd;
{
	register struct Liste *cr;             /* en peker til en post */
	register char soknavn[80];             /* Her lagrer vi navnet */
	register int i;                        /*                      */ 

	printf("\x1b[2;0HFinn en person\n"); 
	printf("\nNavn (max 30 tegn) :");
	gets(soknavn);                         /* les inn navnet       */
	soknavn[29] = 0;                       /* lengden er lik 29    */
 
	printf("\x1b[2;20HSøker... ");
	
	cr = lhd;                              /* sett cr lik den      */
                                               /* første posten        */
	while (cr){
		if ((i = strcmp(cr->Navn,soknavn)) != 0){
			cr = cr->neste;        
		}                              /* hvis navnene ikke er */
                                               /* like, gå til neste   */

		else                           /* og hvis de er like,  */
			break;                 /* slutt å lete!        */
	}

	if (i == 0) {                          /* Hvis i=0, betyr det  */
		printf("Navn funnet!\n");      /* at navnet er funnet! */
		return(cr);                    /* returner pekeren til */
	}                                      /* denne posten.        */
	else {
		printf("Navn Ikke funnet!\n"); /* i motsatt fall,      */
		return(NULL);                  /* returner null.       */ 
	}
}


/***********************************************************************
  ny_post setter av minne for en ny post og leser inn data             */

void ny_post(hode,slutt)
struct Liste **hode,**slutt;
{
	register struct Liste *p;              /* Peker til post       */
	register int riktig,flere;             /* test-variabler       */
	char dummy;


	do {                                   /* reserver minne til   */
                                               /* en ny post (p)       */

		p = (struct Liste *)AllocMem(LLENGDE,MEMF_CLEAR);

		if (p) {                       /* hvis p ikke er lik 0 */
			riktig = FALSE;        /* les inn data...      */
			while (!riktig) {
				les_inn_data(p);
				vis_post(p);
				printf("\nEr dette riktig ? ");
 
				do {
				  if ((dummy = toupper(getchar())) != '\n')
						getchar();

                                               /* gjenta innlesningen  */
                                               /* til svaret er        */
                                               /* Y eller N...         */

				} while (dummy != 'J' && dummy != 'N');

				if (dummy == 'J')
					riktig = TRUE;
			}

			if (!*hode) {          /* Hvis dette er første */
				*slutt = p;    /* post, settes listens */
				*hode = p;     /* begynnelse (hode) og */
			}                      /* slutt til denne post */

			else {                 /* Hvis ikke, legg den  */
                                               /* inn som siste post   */

				p->forrige = *slutt;
				p->forrige->neste = p;
				*slutt = p;
			}
		}
		else {                         /* Hvis AllocMem ikke   */
                                               /* klarte å finne plass */
                                               /* til den nye posten:  */

			printf("For Lite Minne for ny post!\n");
			return;
		}

		printf("\nVil du legge inn flere ? ");
		flere = FALSE;
                                               /* Vil brukeren legge   */
                                               /* inne flere poster    */
                                               /* før han/hun går til- */
                                               /* bake til hovedmeny?  */
		while (1) {
			if ((dummy = toupper(getchar())) != '\n')
				getchar();
			if (dummy == 'J' || dummy == 'N')
				break;
		}

		if (dummy == 'J')              /* Hvis svaret er 'J',  */
			flere = TRUE;          /* settes "flere" lik   */
		                               /* TRUE, noe som gjør   */
	}while (flere);                        /* at do-while løkken   */
}                                              /* utføres en gang til. */



/************************************************************************
 her vises hovedmenyen og vi venter på et valg                         */

int Vis_meny()
{
	register char v;                       /* v = valget           */
	register int dumm;

	printf("\f\n     H O V E D M E N Y\n");
	printf("\n  1 - Legg inn nytt navn\n");
	printf("\n  2 - Finn navn\n");
	printf("\n  0 - Avslutt\n");           /* dette var menyen...  */

	do {
		printf("\x1b[14;2H Valg :   \b\b");

		while ((v = getchar()) == '\n');
		getchar();
                                               /* les inn et tegn      */
 		if (v > '2' || v < '0')        /* er tegnet større enn */
                                               /* '2' eller mindre enn */
                                               /* '0' - ugyldig valg!  */

			printf("\nUgylding valg\n");

	} while (v > '2' || v < '0');          /* Fortsett helt til    */
                                               /* vi har et tegn i om- */
                                               /* rådet '0' til '2'    */
	dumm = (int)(v - '0');                 /* Regn ut int-verdien  */
	return(dumm);                          /* og returner den      */
}


/************************************************************************
   her starter hovedprogrammet                                         */

void main()
{
	register int valg;

	do {
		valg = Vis_meny();             /* vis hovedmeny og     */
                                               /* returner valget      */

		printf("\f");                  /* slett CLI-vinduet    */

		switch (valg) {                /* Hva ble valgt..?     */
			case 1:                /* legg inn nytt navn   */
				ny_post(&lhode,&lslutt);
				break;

			case 2:                /* finn navn            */
				vis_post(finn_post(lhode));
				vent();
				break;

			case 0:                /* avslutt              */
				break;
		}                              /* gjenta dette mens    */
	} while (valg != 0);                   /* valget er ulik 0     */

	slett_alt(lhode);                      /* slett hele listen    */
                                               /* og avslutt!          */
}

