home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 074.lha / Exec / ListDevs.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  3KB  |  142 lines

  1. /*
  2.  *    ListDevs.c
  3.  *
  4.  *    This program produces a list of devices on it's standard.
  5.  *    output.
  6.  *
  7.  *    Program        Date        Action
  8.  *    D. Thomas    24 April 1987    v1.0 Initial Coding.
  9.  *
  10.  */
  11.  
  12. #include "exec/execbase.h"
  13. #include "exec/devices.h
  14. #include "exec/memory.h"
  15. #include "functions.h"
  16.  
  17. extern struct ExecBase *SysBase;    /* Exec's base ptr */
  18.  
  19. main ()
  20.  
  21. {
  22.  
  23.   register struct Device *t;       /* ptr to lib list */
  24.   register struct List     head;    /* for my copy of the lib list */
  25.   char                    *flag;
  26.  
  27.   NewList (&head);
  28.  
  29.   Disable ();
  30.  
  31.   if (getlist (&SysBase->DeviceList, &head))
  32.     cleanup (&head);
  33.  
  34.   Enable ();
  35.  
  36.   puts ("Flags   NegS PosS Version Revision OpenCnt Name");
  37.  
  38.   while (t = (struct Device *) RemHead (&head)) {
  39.  
  40.     if (t->dd_Library.lib_Flags & LIBF_SUMMING)
  41.       flag = "Summing";
  42.     else if (t->dd_Library.lib_Flags & LIBF_CHANGED)
  43.       flag = "Changed";
  44.     else if (t->dd_Library.lib_Flags & LIBF_SUMUSED)
  45.       flag = "Sumused";
  46.     else if (t->dd_Library.lib_Flags & LIBF_DELEXP)
  47.       flag = "Expunge";
  48.     else
  49.       flag = "";
  50.  
  51.     printf ("%-7.7s ", flag);
  52.     printf ("%4x %4x %7u %8u %7u %s\n",
  53.       t->dd_Library.lib_NegSize, t->dd_Library.lib_PosSize,
  54.       t->dd_Library.lib_Version, t->dd_Library.lib_Revision,
  55.       t->dd_Library.lib_OpenCnt, 
  56.       (t->dd_Library.lib_Node.ln_Name ? t->dd_Library.lib_Node.ln_Name : "<unset>"));
  57.     
  58.     if (t->dd_Library.lib_Node.ln_Name)
  59.       FreeMem (t->dd_Library.lib_Node.ln_Name, (long) strlen (t->dd_Library.lib_Node.ln_Name) + 1);
  60.     FreeMem (t, (long) sizeof *t);
  61.  
  62.   }
  63.  
  64.   exit (0);
  65.  
  66. }
  67.  
  68. freelist (l)
  69.  
  70. struct List *l;
  71.  
  72. {
  73.  
  74.   struct Device *t;
  75.  
  76.   while (t = (struct Device *) RemHead (l)) {
  77.     if (t->dd_Library.lib_Node.ln_Name)
  78.       FreeMem (t->dd_Library.lib_Node.ln_Name, (long) strlen (t->dd_Library.lib_Node.ln_Name) + 1);
  79.     FreeMem (t, (long) sizeof *t);
  80.   }
  81.  
  82. }
  83.  
  84. cleanup (l)
  85.  
  86. struct List *l;
  87.  
  88. {
  89.  
  90.   Enable ();
  91.   freelist (l);
  92.   puts ("Out of Memory!");
  93.   exit (0);
  94.  
  95. }
  96.  
  97. getlist (tl, l)
  98.  
  99. struct List *tl;
  100. struct List *l;
  101.  
  102. {
  103.  
  104.   register struct Device *t;
  105.  
  106.   for (t = (struct Device *) tl->lh_Head;
  107.        t->dd_Library.lib_Node.ln_Succ;
  108.        t = (struct Device *) t->dd_Library.lib_Node.ln_Succ)
  109.     if (onenode (t, l))
  110.       return TRUE;
  111.  
  112.   return FALSE;
  113.  
  114. }
  115.  
  116. onenode (t, l)
  117.  
  118. struct Device *t;
  119. struct List    *l;
  120.  
  121. {
  122.  
  123.   register struct Device *tc;
  124.  
  125.   if (!(tc = (struct Device *) AllocMem ((long) sizeof *t, MEMF_CLEAR)))
  126.       return TRUE;
  127.   *tc = *t;
  128.  
  129.   if (t->dd_Library.lib_Node.ln_Name) {
  130.     if (!(tc->dd_Library.lib_Node.ln_Name = (char *) AllocMem ((long) strlen (t->dd_Library.lib_Node.ln_Name) + 1, 0L))) {
  131.       FreeMem (tc, (long) sizeof *tc);
  132.       return TRUE;
  133.     }
  134.     strcpy (tc->dd_Library.lib_Node.ln_Name, t->dd_Library.lib_Node.ln_Name);
  135.   }
  136.  
  137.   AddTail (l, tc);
  138.  
  139.   return FALSE;
  140.  
  141. }
  142.