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