home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2785 / node.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-20  |  2.3 KB  |  128 lines

  1. /*
  2. **    n o d e . c
  3. **
  4. **    functions for building and maintaining
  5. **    the two-way circular linked list of nodes
  6. **
  7. **    Arthur W. Neilson III
  8. **    art@bohtsg.pegasus.com
  9. **    Feb 7, 1991
  10. **
  11. */
  12.  
  13. #include "main.h"
  14. #include "node.h"
  15.  
  16. /*
  17. **    m k l i s t
  18. **
  19. **    build linked list of structures,
  20. **    linking nodes backward thru list.
  21. **    filenames are retrieved via opendir.
  22. **
  23. */
  24. Node   *
  25. mklist(dir)
  26. char   *dir;
  27. {
  28.     DIR    *dirp;
  29.     struct dirent *dp;
  30.     Node   *mknode(), *node;
  31.  
  32.     tail = NULL;
  33.  
  34.     total = bytes = 0;
  35.  
  36.     dirp = opendir(dir);
  37.     while ((dp = readdir(dirp)) != NULL)
  38.         if (strncmp(PREFIX, dp->d_name, PREFIX_LEN) == 0) {
  39.             node = mknode(dp->d_name);
  40.             bytes += node->st->st_size;
  41.             ++total;
  42.         }
  43.     closedir(dirp);
  44.     if (total == 0)
  45.         quit(1);
  46.     return (node);
  47. }
  48.  
  49. /*
  50. **    t h r e a d
  51. **
  52. **    traverse linked list in reverse,
  53. **    threading nodes forward thru list.
  54. **
  55. */
  56. Node   *
  57. thread(tail)
  58. Node   *tail;
  59. {
  60.     Node   *node, *head = NULL;
  61.  
  62.     /* traverse linked list backwards */
  63.     for (node = tail; node != NULL; node = node->prev) {
  64.         node->next = head;    /* link forward to next node */
  65.         head = node;    /* save pointer for next link */
  66.     }
  67.     head->prev = tail;    /* link head to tail */
  68.     tail->next = head;    /* and tail to head */
  69.  
  70.     return (head);
  71. }
  72.  
  73. /*
  74. **    m k n o d e
  75. **
  76. **    install node in linked list
  77. **
  78. */
  79. Node   *
  80. mknode(name)
  81. char   *name;
  82. {
  83.     Node   *node;
  84.     char   *emalloc();
  85.     Job    *jobinfo();
  86.     VOID    estat();
  87.  
  88.     /* allocate storage areas */
  89.     node = (Node *) emalloc(sizeof(Node));
  90.     node->st = (Stat *) emalloc(sizeof(Stat));
  91.     node->job = (Job *) emalloc(sizeof(Job));
  92.  
  93.     strcpy(node->name, name);    /* copy name into node */
  94.     estat(node->name, node->st);    /* get file statistics */
  95.     jobinfo(node->name, node->job);    /* get job information */
  96.     node->flags = 0;    /* set flag states to off */
  97.     node->prev = tail;    /* link back to previous node */
  98.     tail = node;        /* and save pointer for next link */
  99.  
  100.     return (node);
  101. }
  102.  
  103. /*
  104. **    r m n o d e
  105. **
  106. **    remove node from linked list
  107. **
  108. */
  109. Node   *
  110. rmnode(node)
  111. Node   *node;
  112. {
  113.     Node   *next;
  114.  
  115.     node->prev->next = node->next;    /* link previous node forward to next */
  116.     node->next->prev = node->prev;    /* and next node backward to previous */
  117.     if (node == head)
  118.         head = node->next;    /* adjust head pointer */
  119.     else if (node == tail)
  120.         tail = node->prev;    /* and tail pointer */
  121.     next = node->next;
  122.     free(node->st);
  123.     free(node->job);
  124.     free(node);
  125.  
  126.     return (next);
  127. }
  128.