source: trunk/third/findutils/lib/nextelem.c @ 18890

Revision 18890, 2.5 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18889, which included commits to RCS files with non-trunk default branches.
Line 
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#if defined(STDC_HEADERS)
35#include <stdlib.h>
36#endif
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
45char *
46next_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
96int
97main ()
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 */
Note: See TracBrowser for help on using the repository browser.