home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-src.tgz / tar.out / contrib / ncftp / LineList.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  107 lines

  1. /* LineList.c */
  2.  
  3. #include "Sys.h"
  4. #include "LineList.h"
  5.  
  6.  
  7. /* Dynamically make a copy of a string. */
  8. char *StrDup(char *buf)
  9. {
  10.     char *cp;
  11.     
  12.     cp = (char *) malloc(strlen(buf) + 1);
  13.     if (cp != NULL)
  14.         strcpy(cp, buf);
  15.     return (cp);
  16. }    /* StrDup */
  17.  
  18.  
  19.  
  20.  
  21. /* Disposes each node of a LineList.  Does a few extra things
  22.  * so the disposed memory won't be very useful after it is freed.
  23.  */
  24. void DisposeLineListContents(LineListPtr list)
  25. {
  26.     LinePtr lp, lp2;
  27.     
  28.     for (lp = list->first; lp != NULL; ) {
  29.         lp2 = lp;
  30.         lp = lp->next;
  31.         lp2->line[0] = '\0';
  32.         free(lp2->line);
  33.         free(lp2);
  34.     }
  35.     /* Same as InitLineList. */
  36.     PTRZERO(list, sizeof(LineList));
  37. }    /* DisposeLineListContents */
  38.  
  39.  
  40.  
  41.  
  42. void InitLineList(LineListPtr list)
  43. {
  44.     PTRZERO(list, sizeof(LineList));
  45. }    /* InitLineList */
  46.  
  47.  
  48.  
  49.  
  50. LinePtr RemoveLine(LineListPtr list, LinePtr killMe)
  51. {
  52.     LinePtr nextLine, prevLine;
  53.     
  54.     nextLine = killMe->next;    
  55.     prevLine = killMe->prev;    
  56.     killMe->line[0] = '\0';        /* Make it useless just in case. */
  57.     
  58.     if (list->first == killMe)
  59.         list->first = nextLine;
  60.     if (list->last == killMe)
  61.         list->last = prevLine;
  62.  
  63.     if (nextLine != NULL)
  64.         nextLine->prev = prevLine;
  65.     if (prevLine != NULL)
  66.         prevLine->next = nextLine;
  67.  
  68.     free(killMe->line);
  69.     free(killMe);    
  70.     list->nLines--;
  71.     return (nextLine);
  72. }    /* RemoveLine */
  73.  
  74.  
  75.  
  76.  
  77. /* Adds a string to the LineList specified. */
  78. LinePtr AddLine(LineListPtr list, char *buf)
  79. {
  80.     LinePtr lp;
  81.     
  82.     lp = (LinePtr) malloc(sizeof(Line));
  83.     if (lp != NULL) {
  84.         buf = StrDup(buf);
  85.         if (buf == NULL) {
  86.             free(lp);
  87.             lp = NULL;
  88.         } else {
  89.             lp->line = buf;
  90.             lp->next = NULL;
  91.             if (list->first == NULL) {
  92.                 list->first = list->last = lp;
  93.                 lp->prev = NULL;
  94.                 list->nLines = 1;
  95.             } else {
  96.                 lp->prev = list->last;
  97.                 list->last->next = lp;
  98.                 list->last = lp;
  99.                 list->nLines++;
  100.             }
  101.         }
  102.     }
  103.     return lp;
  104. }    /* AddLine */
  105.  
  106. /* eof LineList.c */
  107.