//
//  $Log: stuff.c,v $
//  Revision 1.10  1994/02/21  20:18:01  hakan
//  68040 wird wieder als 68040 + 68882 angezeigt.
//  Services und Entities werden korrekt abgespeichert.
//  -.
//
//  Revision 1.9  1993/12/11  23:13:45  hakan
//  ChipRevBitsValid eingepopelt
//
//  Revision 1.8  1993/11/30  20:01:57  hakan
//  Releaseversionen entfernt
//
//  Revision 1.7  1993/10/17  22:17:06  hakan
//  releaseversionen korrigiert
//
//  Revision 1.6  1993/10/04  22:11:01  hakan
//  DecodeATTNFlags, DecodeNIPCVersion und DecodeChipRevBits extern verfügbar
//
//  Revision 1.5  1993/10/04  21:08:59  hakan
//  foo->NIPCVersion erkennt auch 1.138
//
//  Revision 1.4  1993/09/26  20:57:39  hakan
//  Entites und Services werden mit richtigen Namen eingetragen
//
//  Revision 1.3  1993/09/05  00:09:07  hakan
//  ListView-Problem gelöst
//
//  Revision 1.2  1993/09/04  23:30:14  hakan
//  Erster Anlauf
//
//  Revision 1.1  1993/09/04  21:28:00  hakan
//  Initial revision
//
//


//
//  DecodeATTNFlags needs this
//
#include <exec/execbase.h>

//
//  DecodeChipRevBits needs this
//
#include <graphics/gfxbase.h>



#define KILOBYTE    (1024)
#define MEGABYTE    (KILOBYTE * KILOBYTE)


#include <config.h>
#include <machine.h>
#include <protoypes.h>



char* DecodeATTNFlags (ULONG ATTNFlags)
{
    static char buf [100];
    char* p;
    char* f;


    if (ATTNFlags & AFF_68040)
        p = "68040";
    else if (ATTNFlags & AFF_68030)
        p = "68030";
    else if (ATTNFlags & AFF_68020)
        p = "68020";
    else if (ATTNFlags & AFF_68010)
        p = "68010";
    else
        p = "68000";


    if (ATTNFlags & AFF_68882)
        f = ", 68882";
    else if (ATTNFlags & AFF_68881)
        f = ", 68881";
    else
        f = "\0";


    sprintf (buf, "%s%s", p, f);


    return (buf);
}




char* DecodeChipRevBits (ULONG ChipRevBits)
{
    static char* c;


    ChipRevBits &= SETCHIPREV_AA;

    if ((ChipRevBits & SETCHIPREV_AA) == SETCHIPREV_AA)
        c = "Advanced Amiga";
    else if ((ChipRevBits & SETCHIPREV_ECS) == SETCHIPREV_ECS)
        c = "Extended Chip Set";
    else if ((ChipRevBits & SETCHIPREV_A) == SETCHIPREV_A)
        c = "Fat Agnus";
    else
        c = "Classic Chipset";


    return (c);
}



void SaveList (char* pathname)
{
    FILE*           outf;
    struct Node*    work;
    struct List*    list;
    struct Node*    innerWork;
    struct List*    innerList;


    outf = fopen (pathname, "w");

    if (!!outf)
    {
        list = getRealmList ();
        if (!(IsListEmpty(list)))
        {
            fprintf (outf, "Realms:\n");

            for (work = list->lh_Head; work->ln_Succ; work = work->ln_Succ)
            {
                fprintf (outf, "    %s\n", work->ln_Name);
            }

            fprintf (outf, "\n");
        }

        list = getHostList ();
        if (!(IsListEmpty(list)))
        {
            fprintf (outf, "Hosts:\n");

            for (work = list->lh_Head; work->ln_Succ; work = work->ln_Succ)
            {
                Host* h = (Host*) work;

                if (h->HostName)
                    fprintf (outf, "    Hostname:     %s\n", h->HostName);

                if (h->Owner)
                    fprintf (outf, "    Owner:        %s\n", h->Owner);

                if (h->IPAddr)
                    fprintf (outf, "    IP-Address:   %ld.%ld.%ld.%ld\n", ((h->IPAddr >> 24) & 0xff), ((h->IPAddr >> 16) & 0xff), ((h->IPAddr >> 8) & 0xff), (h->IPAddr & 0xff));

                if (h->KickVersion)
                    fprintf (outf, "    Kickstart:    %ld.%ld\n", ((h->KickVersion >> 16) & 0xffff), (h->KickVersion & 0xffff));

                if (h->WBVersion)
                    fprintf (outf, "    Workbench:    %ld.%ld\n", ((h->WBVersion >> 16) & 0xffff), (h->WBVersion & 0xffff));

                if (h->MaxFastMem)
                    fprintf (outf, "    Memory:       %ld K Fast,  %ld K Chip\n", (h->MaxFastMem) / 1024, (h->MaxChipMem) / 1024);

                if (h->NIPCVersion)
                    fprintf (outf, "    NIPC Version: %ld.%ld\n", ((h->NIPCVersion >> 16) & 0xff), (h->NIPCVersion & 0xff));

                if (h->ATTNFlags)
                    fprintf (outf, "    Processor:    %s\n", DecodeATTNFlags (h->ATTNFlags));

                if (h->ChipRevBits)
                    fprintf (outf, "    Custom Chips: %s\n", DecodeChipRevBits (h->ChipRevBits));

                innerList = &(h->Services);
                if (!(IsListEmpty(innerList)))
                {
                    long num = 0;

                    for (innerWork = innerList->lh_Head; innerWork->ln_Succ; innerWork = innerWork->ln_Succ)
                    {
                        fprintf (outf, "%s%s\n", (num++) ? "                  " : "    Services:     ", innerWork->ln_Name);
                    }
                }

                innerList = &(h->Entities);
                if (!(IsListEmpty(innerList)))
                {
                    long num = 0;

                    for (innerWork = innerList->lh_Head; innerWork->ln_Succ; innerWork = innerWork->ln_Succ)
                    {
                        fprintf (outf, "%s%s\n", (num++) ? "                  " : "    Entities:     ", innerWork->ln_Name);
                    }
                }

                fprintf (outf, "\n");
            }
        }

        fclose (outf);
    }
}
