/*
   ***************************************************************************
   *
   * Datei:
   *      RSysSpecialList.c
   *
   * Inhalt:
   *
   *      --- Globale Routinen ---
   *
   *    void RSysAmigaGuideRefList ( void );
   *    void SysAvailFontsList ( void );
   *    void SysBrokerList ( void );
   *
   *      --- Lokale  Routinen ---
   *
   *
   * Bemerkungen:
   *      Spezielle Listen, die unter keine der anderen Kategorien fallen.
   *
   * Erstellungsdatum:
   *      07-Jul-93     Rolf Böhme
   *
   * Änderungen:
   *      07-Jul-93     Rolf Böhme        Erstellung
   *
   ***************************************************************************
 */

#include "RSys.h"
#include "protos.h"

void
RSysAmigaGuideRefList (void)
{
  LIST listbuff, *list = &listbuff;
  NODE *node;
  XREF *xrefnode;
  LONG key;
  int i;
  UBYTE *fpart, filename[16];
  char *XRefTypes[] =
  {
    "LINK", "FUNC", "COMM", "INCL", "MACR",
    "STRU", "FIEL", "TYPD", "DEFI"
  };

  DPOS;

  HandleHelp (MN_RSysAmigaGuideRefList);

  PrintHeader (AGUIDEXREF, NULL);

  EmptyListView ();

  countentries = 0;

  if (AmigaGuideBase = (AMIGAGUIDEBASE *) OpenLibrary ((STRPTR) "amigaguide.library", 33))
    {
      key = LockAmigaGuideBase (NULL);

      if (GetAmigaGuideAttr (AGA_XRefList, NULL, (ULONG *) & list))
	{
	  countentries = CountNodes (list);

	  if (!NoEntries ())
	    {
	      Entries = AllocScrollEntries (countentries);

	      for (node = list->lh_Head, i = 0; node->ln_Succ && (i < countentries); node = node->ln_Succ, i++)
		{
		  xrefnode = (XREF *) node;

		  fpart = FilePart (xrefnode->xr_File);

		  if (fpart != xrefnode->xr_File)
		    sprintf ((char *) filename, "+%-14s.14s", fpart);
		  else
		    strncpy ((char *) filename, (char *) xrefnode->xr_File, 15);

		  Entries[i].se_obj_id.address = xrefnode;

		  sprintf (Entries[i].se_Entry, EntryAttr[AGUIDEXREF].ea_dataformat,
			   xrefnode,
			   xrefnode->xr_Name, XRefTypes[node->ln_Type],
			   filename, xrefnode->xr_Line);
		}

	      CreateEntryList (SORT, 9);
	    }
	}

      UnlockAmigaGuideBase (key);

      CloseLibrary ((LIBRARY *) AmigaGuideBase);
    }
  else
    ErrorHandle ("amigaguide.library", LIBRARY_ERR, OPEN_FAIL, KILL);

  PrintStatistics ();

  return;
}

void
SysBrokerList (void)
{
  NODE *node, *nodes[MAX_BROKER_ENTRIES], *StartNode, *foundBroker = NULL;
  APTR adr[MAX_BROKER_ENTRIES];
  char name[MAX_BROKER_ENTRIES][22];
  int pri[MAX_BROKER_ENTRIES], i, cnt;

  DPOS;

  HandleHelp (MN_SysBrokerList);

  PrintHeader (COMMODITIES, NULL);

  EmptyListView ();

  /*
   * Analog zu FindName() oder FindPort() kann auch hier ein
   * Schutzprotokoll nötig sein. Da Commodities auch mit Interrupts
   * arbeiten müssen (InputHandler!), sollte gleich mit
   * Disable()/Enable() hingelangt werden!
   */
  Disable ();

  foundBroker = (NODE *) broker;

  for (node = foundBroker; node->ln_Pred; node = node->ln_Pred)
    StartNode = node;

  for (node = StartNode, cnt = 0;
       node->ln_Succ && (cnt < MAX_BROKER_ENTRIES);
       node = node->ln_Succ)
    {
      /*
       * Vitale Daten kopieren; der Type ist unbekannt! Damit
       * dennoch die Namen ausgegeben werden können, übergebe ich
       * einfach den Node-Typen.
       */
      savestrcpy (name[cnt], node, 22, (int) node->ln_Type);
      adr[cnt] = node;
      pri[cnt] = node->ln_Pri;
      nodes[cnt++] = node;
    }

  Enable ();

  countentries = cnt;

  if (NoEntries ())
    return;

  Entries = AllocScrollEntries (countentries);

  for (i = 0; i < cnt; i++)
    {
      Entries[i].se_obj_id.address = adr[i];

      sprintf (Entries[i].se_Entry,
	       EntryAttr[COMMODITIES].ea_dataformat,
	       adr[i], name[i], pri[i]);

      AddNodeToList (i, SORT, 9);
    }

  PrintStatistics ();

  return;
}

 /*
  * SysAvailFontsList() listet alle Fonts im Verzeichnis
  * FONTS: auf
  */
void
SysAvailFontsList (void)
{
  char Style[MAXSHOW];
  char *Type[5] =
  {
    "-", "ROM", "DISK", "-", "SCAL"
  };
  AVAILFONTSHEADER *afh;
  AVAILFONTS *AF;
  int extrabytes, initialsize = sizeof (AVAILFONTSHEADER), i;

  DPOS;

  HandleHelp (MN_SysAvailFontsList);

  PrintHeader (ALLFONTS, NULL);

  EmptyListView ();

  PrintInfo ("Read all Fonts", NO_SPEAK, 0);

  do
    {
      afh = (AVAILFONTSHEADER *) MyAllocVec (initialsize, MEMF_CLEAR | MEMF_ANY, KILL);

      if (afh)
	{
	  extrabytes = AvailFonts ((STRPTR) afh, initialsize, AFF_DISK);
	  if (extrabytes)
	    {
	      MyFreeVec (afh);
	      initialsize += extrabytes;
	    }
	}
    }
  while (extrabytes);

  countentries = afh->afh_NumEntries;

  if (NoEntries ())
    return;

  Entries = AllocScrollEntries (countentries);

  AF = (AVAILFONTS *) & (afh[1]);

  for (i = 0; i < countentries; i++)
    {
      strcpy (Style, "       ");

      if (!(AF[i].af_Attr.ta_Style & FS_NORMAL))
	Style[0] = 'N';

      if (AF[i].af_Attr.ta_Style & FSF_UNDERLINED)
	Style[1] = 'U';

      if (AF[i].af_Attr.ta_Style & FSF_BOLD)
	Style[2] = 'B';

      if (AF[i].af_Attr.ta_Style & FSF_ITALIC)
	Style[3] = 'I';

      if (AF[i].af_Attr.ta_Style & FSF_EXTENDED)
	Style[4] = 'E';

      if (AF[i].af_Attr.ta_Style & FSF_COLORFONT)
	Style[5] = 'C';

      if (AF[i].af_Attr.ta_Style & FSF_TAGGED)
	Style[6] = 'T';

      Style[7] = STRINGEND;

      Entries[i].se_obj_id.address = &AF[i];
      sprintf (Entries[i].se_Entry, EntryAttr[ALLFONTS].ea_dataformat,
	       AF[i].af_Attr.ta_Name,
	       Type[AF[i].af_Type],
	       AF[i].af_Attr.ta_YSize,
	       Style);

      AddNodeToList (i, SORT, 0);
    }

  MyFreeVec (afh);

  PrintStatistics ();

  return;
}
