/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/************************************************************************
 * File:	pathsearch.c						*
 *									*
 * Description:	This file contains the function definitions for		*
 *		searching a path for a file.				*
 ************************************************************************/

# include <stdio.h>
# include <string.h>
# include <unistd.h>
# include <pwd.h>
# include "allocate.h"
# include "our-stdlib.h"
# include "pathsearch.h"


/************************************************************************
 * Function:	pathsearch						*
 *									*
 * Description:	Searches a colon separated path of directories for the	*
 *		specified file, without and then with a specified	*
 *		suffix.  If a readable file is found, then the path is	*
 *		returned.  Otherwise, the file name or NULL is returned	*
 *		as desired.  If the file name starts with a "/" then	*
 *		the path is ignored.  If the file name starts with a	*
 *		"~" then a lookup of the user name is performed.	*
 ************************************************************************/

char *pathsearch (path, file, suffix, def_flag)
    char *path;
    char *file;
    char *suffix;
    int   def_flag;
{
    char	   old;
    char	  *ptr;
    char	  *name;
    char	  *suff;
    char	  *copy;
    int		   length;
    static int	   buf_length;
    static char	  *buffer;
    struct passwd *entry;


    if (!strncmp (file, "~/", 2)) {
	path = getenv ("HOME");
	file += 2;
    } else if (!strcmp (file, "~")) {
	path = getenv ("HOME");
	file ++;
    } else if (file [0] == '~') {
	ptr = file;
	while (*ptr && *ptr != '/')
	    ptr ++;

	old = *ptr;
	*ptr = 0;
	if ((entry = getpwnam (file + 1))) {
	    path = entry -> pw_dir;
	    file = ptr + 1;
	}
	*ptr = old;

    } else if (file [0] == '/')
	path = "/";


    if (!path)
	path = "./";


    ptr = path;
    length = strlen (path) + strlen (file) + strlen (suffix) + 2;

    if (buf_length < length)
	Reallocate (buffer, char, length);

    while (*ptr) {
	name = file;
	suff = suffix;
	copy = buffer;

	while (*ptr && *ptr != ':')
	    *copy ++ = *ptr ++;

	if (copy == buffer)
	    *copy ++ = '.';

	if (copy [-1] != '/')
	    *copy ++ = '/';

	while ((*copy ++ = *name ++));

	if (access (buffer, R_OK) != -1)
	    return buffer;

	copy --;
	while ((*copy ++ = *suff ++));

	if (access (buffer, R_OK) != -1)
	    return buffer;

	if (*ptr)
	    ptr ++;
    }

    return def_flag ? file : NULL;
}


syntax highlighted by Code2HTML, v. 0.9.1