
/**
 **	Programm:  ListFonts.c
 **
 **	(C)Copyright 1989 by MAXON Computer GmbH, KICKSTART --
 **
 **	Autor:	   Dietmar Till
 **
 **	Compiler:  Aztec 3.4a -keine besonderen Optionen-
 **		   (diskfont.library muß auf Disk sein!!)
 **
 **	Aufgabe:   Das Programm listet alle im Speicher und auf der
 **		   jeweiligen Disk (i.d Regel das Verzeichnis FONTS:)
 **		   vorhandenen Fonts mit allen Eigenschaften auf.
 **
 **	Aufruf:    (vom CLI)  ListFonts [?]
 **			 -- bei '?' erhält der Benutzer eine
 **			    zusätzliche Erklärung --
 **	10/11-Feb-89 V1.0
 **/

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/diskfont.h>
#include <graphics/text.h>

#define FLAGS5 "-----"
#define FLAGS8 "--------"

struct FontBase *DiskfontBase=NULL;
struct Library	*OpenLibrary();
VOID		CloseLibrary();
UBYTE		*buffer=NULL;
ULONG		buffer_len=0;

main(argc, argv)
    UBYTE argc;
    STRPTR argv[];
{
    VOID CloseThings();
    UBYTE *AllocMem(), Style, Flags,
	  FlagsFlags[9], StyleFlags[6];
    UWORD NumEntries, Type, Size, count;
    STRPTR FontName;

    printf("\033[1m\033[33mListFonts V1.0\033[0m");
    printf(" by Dietmar Till Copyright © KICKSTART ");
    printf("11-Feb-89\n\033[3mwritten in Aztec C 3.4a");
    printf("(It works!) Greetings:T.A.L\033[0m\n");

    if(argc == 2 && *argv[1] =='?')  /* "HILFE-Funktion ... */
    {
	puts("\n\033[4mStyle-Flags:                 Flags-Flags:\033[0m");
	puts(" n: normal                    r: romfont");
	puts(" e: extended                  d: diskfont");
	puts(" i: italic                    r: revpath");
	puts(" b: bold                      t: talldot");
	puts(" u: underlined                w: widedot");
	puts("                              p: proportional");
	puts("                              d: designed");
	puts("                              r: removed");
	exit(TRUE);
    }
    else if(argc == 2)  /* Unerlaubte Option */
    {
	puts("Not a valid option! USAGE: ListFonts [?]");
	exit(FALSE);
    }

    if((DiskfontBase = (struct FontBase *)   /* Diskfont-Lib öffnen */
	    OpenLibrary("diskfont.library",0L)) == NULL)
    {
	puts("Couldn´t open diskfont.library");
	exit(FALSE);
    }

    /* erster Aufruf von AvailFonts: "Dummy-Aufruf" */
    /* (Benötigter Speicherplatz ermitteln)         */

    buffer_len=(ULONG)AvailFonts(buffer, 0L, AFF_MEMORY|AFF_DISK);

    /* Dürfte eigetlich nie passieren, aber sicher ist sicher */
    /* ein Guru wäre unweigerlich die Folge !! */

    if(!buffer_len) /* ist sicher FALSE (??) */
    {
	puts("ERROR: buffer_len == 0");
	CloseThings();
	exit(FALSE);
    }

    /* Speicherplatz reservieren */

    buffer = (UBYTE *)AllocMem(buffer_len, MEMF_CHIP|MEMF_PUBLIC);

    if(buffer == NULL) /* Nicht genügend Speicherplatz ? */
    {
	puts("ERROR: Can´t allocate enough memory.");
	CloseThings();
	exit(FALSE);
    }

    /* Zweiter Aufruf von AvailFonts: Die gewünschten Daten */
    /* werden jetzt eingelesen */

    AvailFonts(buffer, buffer_len, AFF_MEMORY|AFF_DISK);

    NumEntries = *(UWORD *)buffer;  /* entspricht afh_NumEntries   */
				    /* in struct AvailFontsHeader: */
				    /* Anzahl der Fonts 	   */

    printf("\nI found %d Fonts on your Amiga.\n\n",NumEntries);
    printf("\033[4m%3c %20s %6s %7s %10s    Available: \n\033[0m",
	    '#',"FontName","Size","Styles","Flags");

    for(count=0;count<NumEntries;count++)
    {
	strcpy(StyleFlags,FLAGS5);
	strcpy(FlagsFlags,FLAGS8);

	/* Strukturen auslesen :*/
	/* struct AvailFonts: "libraries/diskfont.h" */

	Type	 = *(UWORD *)(buffer+ 2+10*count);  /* af_Type  */

	/* jetzt Komponente struct TextAttr af_Attr auslesen */
	/* definiert in "graphics/text.h"                    */

	FontName = (STRPTR)* (buffer+ 4+10*count);  /* ta_Name  */
	Size	 = *(UWORD *)(buffer+ 8+10*count);  /* ta_YSize */
	Style	 = *(UBYTE *)(buffer+10+10*count);  /* ta_Style */
	Flags	 = *(UBYTE *)(buffer+11+10*count);  /* ta_Flags */

	/* StyleFlags ... (ta_Style) siehe "graphics/text.h" */

	if(Style & FS_NORMAL)      StyleFlags[0] = 'n';
	if(Style & FSF_EXTENDED)   StyleFlags[1] = 'e';
	if(Style & FSF_ITALIC)     StyleFlags[2] = 'i';
	if(Style & FSF_BOLD)       StyleFlags[3] = 'b';
	if(Style & FSF_UNDERLINED) StyleFlags[4] = 'u';

	/* FlagsFlags ... (ta_Flags) siehe "graphics/text.h" */

	if(Flags & FPF_ROMFONT)    FlagsFlags[0] = 'r';
	if(Flags & FPF_DISKFONT)   FlagsFlags[1] = 'd';
	if(Flags & FPF_REVPATH)    FlagsFlags[2] = 'r';
	if(Flags & FPF_TALLDOT)    FlagsFlags[3] = 't';
	if(Flags & FPF_WIDEDOT)    FlagsFlags[4] = 'w';
	if(Flags & FPF_PROPORTIONAL)   FlagsFlags[5] = 'p';
	if(Flags & FPF_DESIGNED)   FlagsFlags[6] = 'd';
	if(Flags & FPF_REMOVED)    FlagsFlags[7] = 'r';

	printf("%3d %20s %6d %7s %10s    ",
	    count+1,FontName, Size, StyleFlags,FlagsFlags);

	if(Type == AFF_MEMORY) puts("IN MEMORY");  /* af_Type */
	if(Type == AFF_DISK)   puts("ON DISK");

    }
    CloseThings();
    exit(TRUE);
}


/* CloseThings() schließt Library und gibt Speicherplatz frei */
/* wenn nötig & möglich */

void CloseThings()
{
    if (buffer) FreeMem((ULONG *)buffer, buffer_len);
    if (DiskfontBase) CloseLibrary(DiskfontBase);
}


/* ===== Ende von "ListFonst.c" ====== */




