source: icGREP/icgrep-devel/cudd-2.5.1/util/pathsearch.c @ 5820

Last change on this file since 5820 was 4597, checked in by nmedfort, 4 years ago

Upload of the CUDD library.

File size: 1.8 KB
Line 
1/* LINTLIBRARY */
2
3#include <stdio.h>
4#include "util.h"
5
6static int check_file (char const *, char const *);
7
8char *
9util_path_search(char const *prog)
10{
11#ifdef UNIX
12    return util_file_search(prog, getenv("PATH"), (char *) "x");
13#else
14    return util_file_search(prog, NIL(char), (char *) "x");
15#endif
16}
17
18
19char *
20util_file_search(
21  char const *file,             /* file we're looking for */
22  char *path,                   /* search path, colon separated */
23  char const *mode              /* "r", "w", or "x" */)
24{
25    int quit;
26    char *buffer, *filename, *save_path, *cp;
27
28    if (path == 0 || strcmp(path, "") == 0) {
29        path = (char *) ".";    /* just look in the current directory */
30    }
31
32    save_path = path = strsav(path);
33    quit = 0;
34    do {
35        cp = strchr(path, ':');
36        if (cp != 0) {
37            *cp = '\0';
38        } else {
39            quit = 1;
40        }
41
42        /* cons up the filename out of the path and file name */
43        if (strcmp(path, ".") == 0) {
44            buffer = strsav(file);
45        } else {
46            buffer = ALLOC(char, strlen(path) + strlen(file) + 4);
47            (void) sprintf(buffer, "%s/%s", path, file);
48        }
49        filename = util_tilde_expand(buffer);
50        FREE(buffer);
51
52        /* see if we can access it */
53        if (check_file(filename, mode)) {
54            FREE(save_path);
55            return filename;
56        }
57        FREE(filename);
58        path = ++cp;
59    } while (! quit); 
60
61    FREE(save_path);
62    return 0;
63}
64
65
66static int
67check_file(char const *filename, char const *mode)
68{
69#ifdef UNIX
70    int access_mode = /*F_OK*/ 0;
71
72    if (strcmp(mode, "r") == 0) {
73        access_mode = /*R_OK*/ 4;
74    } else if (strcmp(mode, "w") == 0) {
75        access_mode = /*W_OK*/ 2;
76    } else if (strcmp(mode, "x") == 0) {
77        access_mode = /*X_OK*/ 1;
78    }
79    return access(filename, access_mode) == 0;
80#else
81    FILE *fp;
82    int got_file;
83
84    if (strcmp(mode, "x") == 0) {
85        mode = "r";
86    }
87    fp = fopen(filename, mode);
88    got_file = (fp != 0);
89    if (fp != 0) {
90        (void) fclose(fp);
91    }
92    return got_file;
93#endif
94}
Note: See TracBrowser for help on using the repository browser.