/*****************************/
/** LISTER                  **/
/** (C) Dirk Holtwick, 1996 **/
/*****************************/

/*

	This is a small demonstration to show you how easy
	it is to use the DITO vocabulary files. You may use
	this program to build your own DITO supporting tools.
	
	You may write for example a 
		* print tool
		* dictionary tool
		* spell checker
		* new learning tool
		* etc.

*/
 

#include <exec/types.h>
#include <pragma/dos_lib.h>
#include <libraries/asl.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define REST 10									// only for internal reasons

// DON'T WASTE MEMORY
struct BitFields {
	BOOL		lrnd:1;								// word known trough learning
	BOOL		tag:1;								// tagged
	UBYTE		imp:2;								// importance 0..2
	UBYTE		type:4;								// part of speech (noun, verb, etc.)
};

// VOCABULARY STRUCTURE
struct VocData {
	struct	VocData *succ, *pred;			// for list structure
	UWORD		size;									// size of the whole structure (is variable)
	UBYTE		dnum;									// number of grammar strings
	struct	BitFields bf;						// bitfield with flags
	UBYTE		v[4]; 								// for grammar values
	UWORD		ger, note, phon, snd;			// standard strings
	UWORD		data[1];								// variable number of grammar strings and data
};


// SOME USEFULL DEFINITIONS
#define	LATEIN(d)	(char *)((ULONG)&d->data + (d->dnum*2))
#define	DEUTSCH(d)	(char *)((ULONG)&d->data + d->ger)
#define	NOTIZ(d)		(char *)((ULONG)&d->data + d->note)
#define	PHONEM(d)	(char *)((ULONG)&d->data + d->phon)
#define	TON(d)		(char *)((ULONG)&d->data + d->snd)
#define	GR(d,n)		(char *)((ULONG)&d->data + d->data[n])
#define  VAL(d,n)		d->v[n]
#define  IMP(d)		d->bf.imp
#define	LRND(d)		d->bf.lrnd
#define	TAG(d)		d->bf.tag
#define	TYPE(d)		d->bf.type


// LOADING ROUTINE
void loadthem(char *name){
	char		str[8];										// für die kennungen
	struct 	VocData *act;								// zum anhängen der datensätze
	UWORD		size;											// datensatzlaenge
	FILE		*in;											// filehandle
	BOOL		go=TRUE, care=FALSE;						// für die while-schleife

	if (in=fopen(name,"rb")) {							// datei oeffnen
		fread(str,4,1,in);
		if(!strncmp(str, "DITO",4)){					// ueberhaupt eine dito datei?
			fread(str,4,1,in);

			fread(&size,sizeof(UWORD),1,in);			// datensatzlaenge lesen
			while(!feof(in) && go){						// datei zu ende

				act = malloc(size+REST);				// speicher allozieren
				act->size=size+REST;

				fread(&act->dnum,size,1,in);			// daten einlesen

			/***** OUTPUT *****/

				printf("\033[1m%s\033[0m\n  %s\n",
					LATEIN(act),
					DEUTSCH(act));

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

				free (act);									// speicher wieder freigeben

				fread(&size,sizeof(UWORD),1,in);		// naechste datensatzlaenge lesen
			}
	
		}else puts("No DITO file");
		fclose (in);		
	}else puts("Couldn't open file");
}

// MAIN PART
void main(int argc, char *argv[]){
	FILE	*f;
	char	id[6];

	if(argc>=2){
		puts("\033[1mLIST OF DITO VOCABULARIES\033[0m\n");
		loadthem(argv[1]);
	}else{
		puts("DEMO SOURCE FOR DITO\n"
			  "(C) Dirk Holtwick, 1996\n\n"
			  "USAGE: Lister [ditofile] >destination"
		);
	}
}
