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

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

                              Programmert av 
                    Ørjan Eriksen og Torstein Pettersen

                          hentlagre.c   leksjon 4 
  
**************************************************************************/

/* ingen forandringe fra lesson 3 til lesson 4 i denne modulen */
/* her er det ingen overflødige kommentarer */

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

#include "base.h"

#ifndef FOREVER
#define FOREVER for( ; ; )
#endif

/* externe variabler og funksjoner */

extern void sett_inn_post(struct Liste **,struct Liste **,struct Liste *);

/* funksjoner tilgjengelig for andre moduler */

void lagre_liste(struct Liste *);
void hent_liste(struct Liste **,struct Liste **);

/* variabler kun for denne modulen */

static char filename[80] = {0,};
static long fd;

#define MakeID(a,b,c,d) ( (long)(a)<<24 | (long)(b)<<16 | (long)(c)<<8 | (d) )
#define DBHD MakeID('D','B','H','D')

/* lagre data på disk */

void lagre_liste(hode)
register struct Liste *hode;
{
	register struct Liste *cr;
	
	printf("\nLagre liste\n");
	printf("\nFilnavn : ");
	gets(filename);	

	if (strlen(filename) == 0)
		return;

	if ((fd = Open(filename,MODE_NEWFILE)) == NULL) {
		goto openerror;
	}

	if (Write(fd,"DBHD",4) != 4)
		goto writeerror;

	cr = hode;

	while (cr) {
		if (Write(fd,(char *)cr,LLENGDE-8) != LLENGDE-8) {
			printf("Feil under skriving!\n");
			goto writeerror;
		}

		cr = cr->neste;
	}

	printf("Lagring ferdig!\n");

writeerror:
	Close(fd);

openerror:
	return;
}

/* hent data fra disk */

void hent_liste(hode,sist)
struct Liste **hode,**sist;
{
	register struct Liste *cr;
	ULONG buff;

	printf("\nHent liste\n");
	printf("\nFilnavn : ");
	gets(filename);	

	if (strlen(filename) == 0)
		return;

	if ((fd = Open(filename,MODE_OLDFILE)) == NULL) {
		printf("Filen kunne ikke åpnes!\n");
		goto openerror;
	}

	if (Read(fd,(char *)&buff,4) != 4) {
		printf("Feil under lesing av filen\n");
		goto readerror;
	}

	if (buff != DBHD) {
		printf("Feil filtype, dette er ikke en DBHD fil!\n");
		goto readerror;
	}

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

	if (cr) {
		FOREVER	{
			if ((Read(fd,(char *)cr,LLENGDE-8) == LLENGDE-8)  && (cr != NULL)) {
				sett_inn_post(hode,sist,cr);
				cr = (struct Liste *)AllocMem(LLENGDE,MEMF_CLEAR);
			}
			else {
				FreeMem(cr,LLENGDE);
				break;
			}
		}
	}

	printf("Innlesning Ferdig!\n");

readerror:
	Close(fd);

openerror:
	return;
}
