home *** CD-ROM | disk | FTP | other *** search
- /*
- ** n o d e . c
- **
- ** functions for building and maintaining
- ** the two-way circular linked list of nodes
- **
- ** Arthur W. Neilson III
- ** art@bohtsg.pegasus.com
- ** Feb 7, 1991
- **
- */
-
- #include "main.h"
- #include "node.h"
-
- /*
- ** m k l i s t
- **
- ** build linked list of structures,
- ** linking nodes backward thru list.
- ** filenames are retrieved via opendir.
- **
- */
- Node *
- mklist(dir)
- char *dir;
- {
- DIR *dirp;
- struct dirent *dp;
- Node *mknode(), *node;
-
- tail = NULL;
-
- total = bytes = 0;
-
- dirp = opendir(dir);
- while ((dp = readdir(dirp)) != NULL)
- if (strncmp(PREFIX, dp->d_name, PREFIX_LEN) == 0) {
- node = mknode(dp->d_name);
- bytes += node->st->st_size;
- ++total;
- }
- closedir(dirp);
- if (total == 0)
- quit(1);
- return (node);
- }
-
- /*
- ** t h r e a d
- **
- ** traverse linked list in reverse,
- ** threading nodes forward thru list.
- **
- */
- Node *
- thread(tail)
- Node *tail;
- {
- Node *node, *head = NULL;
-
- /* traverse linked list backwards */
- for (node = tail; node != NULL; node = node->prev) {
- node->next = head; /* link forward to next node */
- head = node; /* save pointer for next link */
- }
- head->prev = tail; /* link head to tail */
- tail->next = head; /* and tail to head */
-
- return (head);
- }
-
- /*
- ** m k n o d e
- **
- ** install node in linked list
- **
- */
- Node *
- mknode(name)
- char *name;
- {
- Node *node;
- char *emalloc();
- Job *jobinfo();
- VOID estat();
-
- /* allocate storage areas */
- node = (Node *) emalloc(sizeof(Node));
- node->st = (Stat *) emalloc(sizeof(Stat));
- node->job = (Job *) emalloc(sizeof(Job));
-
- strcpy(node->name, name); /* copy name into node */
- estat(node->name, node->st); /* get file statistics */
- jobinfo(node->name, node->job); /* get job information */
- node->flags = 0; /* set flag states to off */
- node->prev = tail; /* link back to previous node */
- tail = node; /* and save pointer for next link */
-
- return (node);
- }
-
- /*
- ** r m n o d e
- **
- ** remove node from linked list
- **
- */
- Node *
- rmnode(node)
- Node *node;
- {
- Node *next;
-
- node->prev->next = node->next; /* link previous node forward to next */
- node->next->prev = node->prev; /* and next node backward to previous */
- if (node == head)
- head = node->next; /* adjust head pointer */
- else if (node == tail)
- tail = node->prev; /* and tail pointer */
- next = node->next;
- free(node->st);
- free(node->job);
- free(node);
-
- return (next);
- }
-