1/* Return the next element of a path.
2   Copyright (C) 1992, 2003, 2004, 2005 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 3 of the License, or
7   (at your option) 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, see <http://www.gnu.org/licenses/>.
16*/
17
18/* Written by David MacKenzie <djm@gnu.org>,
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#if defined(STDC_HEADERS)
35#include <stdlib.h>
36#endif
37
38#include "nextelem.h"
39
40
41/* Return the next element of a colon-separated path.
42   A null entry in the path is equivalent to "." (the current directory).
43
44   If NEW_PATH is non-NULL, set the path and return NULL.
45   If NEW_PATH is NULL, return the next item in the string, or
46   return NULL if there are no more elements.  */
47
48char *
49next_element (const char *new_path, int curdir_ok)
50{
51  static char *path = NULL;	/* Freshly allocated copy of NEW_PATH.  */
52  static char *end;		/* Start of next element to return.  */
53  static int final_colon;	/* If zero, path didn't end with a colon.  */
54  char *start;			/* Start of path element to return.  */
55
56  if (new_path)
57    {
58      if (path)
59	free (path);
60      end = path = strdup (new_path);
61      final_colon = 0;
62      return NULL;
63    }
64
65  if (*end == '\0')
66    {
67      if (final_colon)
68	{
69	  final_colon = 0;
70	  return curdir_ok ? "." : "";
71	}
72      return NULL;
73    }
74
75  start = end;
76  final_colon = 1;		/* Maybe there will be one.  */
77
78  end = strchr (start, ':');
79  if (end == start)
80    {
81      /* An empty path element.  */
82      *end++ = '\0';
83      return curdir_ok ? "." : "";
84    }
85  else if (end == NULL)
86    {
87      /* The last path element.  */
88      end = strchr (start, '\0');
89      final_colon = 0;
90    }
91  else
92    *end++ = '\0';
93
94  return start;
95}
96
97#ifdef TEST
98int
99main ()
100{
101  char *p;
102
103  next_element (getenv ("PATH"));
104  while (p = next_element (NULL))
105    puts (p);
106  exit (0);
107}
108#endif /* TEST */
109