Imported Upstream version 4.5.10
[platform/upstream/findutils.git] / lib / nextelem.c
1 /* Return the next element of a path.
2    Copyright (C) 1992, 2005, 2010 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 #include <config.h>
22
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27
28
29 #include "nextelem.h"
30
31
32 /* Return the next element of a colon-separated path.
33    A null entry in the path is equivalent to "." (the current directory).
34
35    If NEW_PATH is non-NULL, set the path and return NULL.
36    If NEW_PATH is NULL, return the next item in the string, or
37    return NULL if there are no more elements.  */
38
39 char *
40 next_element (const char *new_path, int curdir_ok)
41 {
42   static char *path = NULL;     /* Freshly allocated copy of NEW_PATH.  */
43   static char *end;             /* Start of next element to return.  */
44   static int final_colon;       /* If zero, path didn't end with a colon.  */
45   char *start;                  /* Start of path element to return.  */
46
47   if (new_path)
48     {
49       free (path);
50       end = path = strdup (new_path);
51       final_colon = 0;
52       return NULL;
53     }
54
55   if (*end == '\0')
56     {
57       if (final_colon)
58         {
59           final_colon = 0;
60           return curdir_ok ? "." : "";
61         }
62       return NULL;
63     }
64
65   start = end;
66   final_colon = 1;              /* Maybe there will be one.  */
67
68   end = strchr (start, ':');
69   if (end == start)
70     {
71       /* An empty path element.  */
72       *end++ = '\0';
73       return curdir_ok ? "." : "";
74     }
75   else if (end == NULL)
76     {
77       /* The last path element.  */
78       end = strchr (start, '\0');
79       final_colon = 0;
80     }
81   else
82     *end++ = '\0';
83
84   return start;
85 }