home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / new / disk / cdrom / amicdrom / path.c < prev    next >
C/C++ Source or Header  |  1994-05-23  |  2KB  |  107 lines

  1. /* path.c:
  2.  *
  3.  * Path lists.
  4.  *
  5.  * ----------------------------------------------------------------------
  6.  * This code is (C) Copyright 1993,1994 by Frank Munkert.
  7.  * All rights reserved.
  8.  * This software may be freely distributed and redistributed for
  9.  * non-commercial purposes, provided this notice is included.
  10.  */
  11.  
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include <exec/memory.h>
  16. #include <clib/exec_protos.h>
  17. #include <pragmas/exec_pragmas.h>
  18.  
  19. #include "generic.h"
  20.  
  21. typedef struct path_node {
  22.   unsigned long references;
  23.   char *name;
  24.   struct path_node *next;
  25. } t_path_node;
  26.  
  27. /* Append p_name to path list: */
  28.  
  29. t_path_list Append_Path_List (t_path_list p_list, char *p_name)
  30. {
  31.   t_path_node *node;
  32.  
  33.   if (!(node = AllocMem (sizeof (*node), MEMF_PUBLIC)))
  34.     return NULL;
  35.  
  36.   node->references = 1;
  37.   if (!(node->name = AllocMem (strlen (p_name) + 1, MEMF_PUBLIC))) {
  38.     FreeMem (node, sizeof (*node));
  39.     return NULL;
  40.   }
  41.  
  42.   strcpy (node->name, p_name);
  43.   node->next = Copy_Path_List (p_list, FALSE);
  44.   
  45.   return node;
  46. }
  47.  
  48. t_path_list Copy_Path_List (t_path_list p_src, int p_strip)
  49. {
  50.   t_path_node *node, *start;
  51.  
  52.   if (!p_src)
  53.     return NULL;
  54.  
  55.   start = p_strip ? p_src->next : p_src;
  56.  
  57.   for (node = start; node; node = node->next) {
  58.     node->references++;
  59.   }
  60.   
  61.   return start;
  62. }
  63.  
  64. void Free_Path_List (t_path_list p_list)
  65. {
  66.   t_path_node *node, *next;
  67.  
  68.   if (!p_list)
  69.     return;
  70.  
  71.   for (node = p_list; node; node = next) {
  72.     next = node->next;
  73.     if (--node->references == 0) {
  74.       FreeMem (node->name, strlen (node->name) + 1);
  75.       FreeMem (node, sizeof (*node));
  76.     }
  77.   }
  78. }
  79.  
  80. t_bool Path_Name_From_Path_List (t_path_list p_list, char *p_buffer,
  81.                      int p_buffer_length)
  82. {
  83.   int len;
  84.   t_path_node *node;
  85.  
  86.   if (!p_list) {
  87.     strcpy (p_buffer, ":");
  88.     return TRUE;
  89.   }
  90.   
  91.   /* calculate length: */
  92.   for (len=1, node=p_list; node; node = node->next)
  93.     len += strlen (node->name) + 1;
  94.  
  95.   if (len > p_buffer_length)
  96.     return FALSE;
  97.  
  98.   for (node=p_list; node; node = node->next) {
  99.     memcpy (p_buffer + len - strlen (node->name) - 1,
  100.             node->name, strlen (node->name));
  101.     p_buffer[len-1] = (node == p_list) ? 0 : '/';
  102.     len -= strlen (node->name) + 1;
  103.   }
  104.   p_buffer[0] = ':';
  105.   return TRUE;
  106. }
  107.