home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / A / FIND / FINDUTIL.1 / FINDUTIL / findutils-4.1 / lib / nextelem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-27  |  2.5 KB  |  107 lines

  1. /* Return the next element of a path.
  2.    Copyright (C) 1992 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. /* Written by David MacKenzie <djm@gnu.ai.mit.edu>,
  19.    inspired by John P. Rouillard <rouilj@cs.umb.edu>.  */
  20.  
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24.  
  25. #include <stdio.h>
  26. #if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
  27. #include <string.h>
  28. #else
  29. #include <strings.h>
  30. #ifndef strchr
  31. #define strchr index
  32. #endif
  33. #endif
  34.  
  35. char *strdup ();
  36. void free ();
  37.  
  38. /* Return the next element of a colon-separated path.
  39.    A null entry in the path is equivalent to "." (the current directory).
  40.  
  41.    If NEW_PATH is non-NULL, set the path and return NULL.
  42.    If NEW_PATH is NULL, return the next item in the string, or
  43.    return NULL if there are no more elements.  */
  44.  
  45. char *
  46. next_element (new_path)
  47.      char *new_path;
  48. {
  49.   static char *path = NULL;    /* Freshly allocated copy of NEW_PATH.  */
  50.   static char *end;        /* Start of next element to return.  */
  51.   static int final_colon;    /* If zero, path didn't end with a colon.  */
  52.   char *start;            /* Start of path element to return.  */
  53.  
  54.   if (new_path)
  55.     {
  56.       if (path)
  57.     free (path);
  58.       end = path = strdup (new_path);
  59.       final_colon = 0;
  60.       return NULL;
  61.     }
  62.  
  63.   if (*end == '\0')
  64.     {
  65.       if (final_colon)
  66.     {
  67.       final_colon = 0;
  68.       return ".";
  69.     }
  70.       return NULL;
  71.     }
  72.  
  73.   start = end;
  74.   final_colon = 1;        /* Maybe there will be one.  */
  75.  
  76.   end = strchr (start, ':');
  77.   if (end == start)
  78.     {
  79.       /* An empty path element.  */
  80.       *end++ = '\0';
  81.       return ".";
  82.     }
  83.   else if (end == NULL)
  84.     {
  85.       /* The last path element.  */
  86.       end = strchr (start, '\0');
  87.       final_colon = 0;
  88.     }
  89.   else
  90.     *end++ = '\0';
  91.  
  92.   return start;
  93. }
  94.  
  95. #ifdef TEST
  96. int
  97. main ()
  98. {
  99.   char *p;
  100.  
  101.   next_element (getenv ("PATH"));
  102.   while (p = next_element (NULL))
  103.     puts (p);
  104.   exit (0);
  105. }
  106. #endif /* TEST */
  107.