home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / xfitsvew.zip / XFITSview / fitssubs / infolist.c < prev    next >
C/C++ Source or Header  |  1998-04-02  |  6KB  |  156 lines

  1. /* InfoList Class implementation  */ 
  2. /*  An InfoList is a linked list of arbitrary pieces of information. 
  3.     Elements of the list are objects of type InfoElement.
  4.     Data array pointers must be cast to type char */ 
  5. /*-----------------------------------------------------------------------
  6. *  Copyright (C) 1996,1998
  7. *  Associated Universities, Inc. Washington DC, USA.
  8. *  This program is free software; you can redistribute it and/or
  9. *  modify it under the terms of the GNU General Public License as
  10. *  published by the Free Software Foundation; either version 2 of
  11. *  the License, or (at your option) any later version.
  12. *
  13. *  This program is distributed in the hope that it will be useful,
  14. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. *  GNU General Public License for more details.
  17. *-----------------------------------------------------------------------*/
  18. #include "infolist.h" 
  19.   
  20. /* Constructor  */ 
  21. InfoList* MakeInfoList () 
  22.   InfoList *temp = (InfoList *) malloc (sizeof(InfoList)); 
  23.   temp->first = NULL; temp->last = NULL; 
  24.   return temp; 
  25. } /* end MakeInfoList */ 
  26.   
  27. /* Destructor  */ 
  28. void KillInfoList(InfoList *me) 
  29.   InfoElement *p, *pnext; 
  30.   if (!me) return; /* anybody home? */ 
  31.   p = me->first; 
  32.   if ((me->first == NULL) || (me->last == NULL)) {free(me); return; }
  33.  /*  Delete from start of list  */ 
  34.  while (p) 
  35.      {pnext = p->inext; KillInfoElement(p); p = pnext;} 
  36.  free(me); 
  37. }/* end of KillInfoList  */ 
  38.   
  39. /* clear list  */ 
  40. void ClearInfoList(InfoList *me) 
  41.  InfoElement *p, *pnext; 
  42.  if (!me) return; /* validity check */
  43.  p = me->first; 
  44.  if ((me->first == 0) || (me->last == 0)) return; 
  45.  /*  Delete from start of list  */ 
  46.  while (p) 
  47.      {pnext = p->inext; KillInfoElement(p); p = pnext;} 
  48.  me->first = NULL; me->last = NULL; 
  49. } /* end of clear  */ 
  50.   
  51. /* Delete a member of an InfoList.  */ 
  52. void InfoZap(InfoList *me, char *label) 
  53. {InfoElement *el, *pe, *ie; 
  54.  if (!me) return; /* validity check */
  55.  if (!label) return; /* validity check */
  56.  el = InfoFind(me, label); 
  57.  if (el==0) return;  /*  Not found  */ 
  58.  if (el==me->first)      /*  Delete first element of Info List?  */ 
  59.      me->first = el->inext; 
  60.  else 
  61.      {pe = me->first; ie = me->first; 
  62.       if (el==me->last)             /*  Last element?  */ 
  63.       {while (ie != el)           /*  Find previous element  */ 
  64.            {pe = ie; ie = ie->inext;} 
  65.        me->last = pe;           /*  Reset last element pointer  */ 
  66.        InfoAddLink(pe, NULL);}    /*  last element gets 0 link  */ 
  67.       else                            /*  Element not at either end  */ 
  68.       {while (ie != el)           /*  Find previous element  */ 
  69.            {pe = ie; ie = ie->inext;} 
  70.        ie = ie->inext; 
  71.        InfoAddLink(pe, ie);}       /*  reset previous link  */ 
  72.   } 
  73.  KillInfoElement(el);                  /*  Delete element  */ 
  74. } /* end InfoZap */ 
  75.   
  76. /* Checks of an element of a given label is in the list,  */ 
  77. /* returns pointer to InfoElement; 0=> not found.  */ 
  78. InfoElement* InfoFind(InfoList *me, char *label) 
  79.   InfoElement *current; 
  80.  if (!me) return NULL; /* validity check */
  81.  if (!label) return NULL; /* validity check */
  82.   if (me->first)       /* Don't search empty list  */ 
  83.     {current = me->first; 
  84.      while (current) 
  85.        {if (InfoTestName(current, label)) return current; 
  86.     current = current->inext;}} 
  87.   return 0;   /* Didn;t find  */ 
  88. } /* end InfoFind */ 
  89.   
  90. /* Finds type of element, returns 0 if element found  */ 
  91. Integer  InfoFindType(InfoList *me, char *label, Integer *type, 
  92.                    Integer *ndim, Integer *dim) 
  93. {InfoElement *el; 
  94.  Integer i, rc = 0; 
  95.  if (!me) return -1; /* validity check */
  96.  if (!label) return -1; /* validity check */
  97.  if (!type) return -1; /* validity check */
  98.  if (!ndim) return -1; /* validity check */
  99.  if (!dim) return -1; /* validity check */
  100.  el = InfoFind(me, label); 
  101.  if (el)                                 /*  Entry found?  */ 
  102.      {*type = el->itype; 
  103.       *ndim = el->indim; 
  104.       for (i=0; i<*ndim; i++) dim[i] = el->idim[i];} 
  105.  else 
  106.      rc = -1; 
  107.  return rc; 
  108. } /* end InfoFindType */ 
  109.   
  110. /* Store data for an element. Returns 0 if successful.  */ 
  111. Integer InfoStore(InfoList *me, char *label, Integer type, Integer ndim, 
  112.           Integer *dim,  char *data) 
  113. {InfoElement *el, *next; 
  114.  Integer rc = 0; 
  115.  if (!me) return -1; /* validity check */
  116.  if (!label) return -1; /* validity check */
  117.  if (!dim) return -1; /* validity check */
  118.  if (!data) return -1; /* validity check */
  119.  el = InfoFind(me, label); 
  120.  if (el) 
  121.      rc = InfoUpdate(el, type, ndim, dim, data);  /*  existing entry. */ 
  122.  else   /*  Create new InfoElement and link in.  */ 
  123.      {next = MakeInfoElement(label, type, ndim, dim, data); 
  124.       /*   See if there are already any entries:  */ 
  125.       if (me->first == 0) {me->first = next; me->last = next;} 
  126.       else 
  127.       InfoAddLink(me->last, next); /*Add link to previous last element*/ 
  128.       me->last = next;}                   /* Save new last element  */ 
  129.  return rc; 
  130. } /* end InfoStore */ 
  131.   
  132. /* Find element and return its contents, returns 0 if successful.  */ 
  133. Integer InfoLookup  (InfoList *me, char *label, Integer *type, Integer *ndim, 
  134.              Integer *dim, char *data) 
  135. {InfoElement *el; 
  136.  Integer i, rc = 0;
  137.  if (!me) return -1; /* validity check */
  138.  if (!label) return -1; /* validity check */
  139.  if (!type) return -1; /* validity check */
  140.  if (!dim) return -1; /* validity check */
  141.  if (!data) return -1; /* validity check */
  142.  el  = InfoFind(me, label); 
  143.  if (el)  /*  Does it exist?  */ 
  144.      {*type = el->itype; 
  145.       *ndim = el->indim; 
  146.       for (i=0;i<*ndim;i++) dim[i] = el->idim[i]; 
  147.       rc = InfoGet(el, data);} /*  Copy data  */ 
  148.  else   /*  Doesn't exist  */ 
  149.      {rc = 1; ndim = 0;} 
  150.  return rc;}  /*  End of InfoLookup  */ 
  151.   
  152.