annotate clustalomega/clustal-omega-1.0.2/src/squid/file.c @ 1:bc707542e5de

Uploaded
author clustalomega
date Thu, 21 Jul 2011 13:35:08 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
1 /*****************************************************************
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
2 * SQUID - a library of functions for biological sequence analysis
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
3 * Copyright (C) 1992-2002 Washington University School of Medicine
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
4 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
5 * This source code is freely distributed under the terms of the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
6 * GNU General Public License. See the files COPYRIGHT and LICENSE
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
7 * for details.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
8 *****************************************************************/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
9
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
10
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
11 /* file.c
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
12 * SRE, Wed Jun 19 11:19:22 1996
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
13 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
14 * File operation utilities, dealing with pathnames, directories,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
15 * and environment variables.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
16 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
17 * The goal is to have these be platform-independent but they
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
18 * currently are UNIX-specific: i.e. this file is currently POSIX compliant
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
19 * but it is NOT ANSI C compliant. (The sole offender is getenv().)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
20 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
21 * RCS $Id: file.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: file.c,v 1.8 2002/03/07 03:18:02 eddy Exp)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
22 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
23
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
24 #include <stdio.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
25 #include <stdlib.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
26 #include <string.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
27
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
28 #include "squid.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
29 #include "sqfuncs.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
30
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
31 /*
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
32 * VMS: #define DIRSLASH ']'
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
33 * MacOS: #define DIRSLASH ':'
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
34 * DOS: #define DIRSLASH '\\'
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
35 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
36 * The code assumes that '.' is used for file name extensions,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
37 * such as "foo.bar".
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
38 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
39 #define DIRSLASH '/' /* UNIX directory paths have /foo/bar */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
40
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
41
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
42
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
43 /* Function: FileDirname()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
44 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
45 * Purpose: Returns the path from a filename:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
46 * "/foo/bar/baz" -> "/foo/bar"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
47 * "foo/bar" -> "foo"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
48 * "foo" -> "."
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
49 * "/" -> "/"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
50 * i.e. the string will be non-NULL; it will
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
51 * contain the string up to but not including the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
52 * last '/' character; returns "." if
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
53 * there are no '/' characters, and returns "/"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
54 * if the last slash is the first character.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
55 * Modeled on Tcl's "file dirname" command.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
56 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
57 * Args: file - name of file "/foo/bar/baz".
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
58 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
59 * Return: ptr to malloc'ed string "/foo/bar".
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
60 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
61 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
62 FileDirname(char *file)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
63 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
64 char *dirname;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
65 char *lastslash;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
66 int len;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
67
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
68 lastslash = strrchr(file, DIRSLASH);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
69 len = (lastslash == NULL) ? 0 : (int) (lastslash - file);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
70 dirname = (char *) MallocOrDie (sizeof(char) * (len+2));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
71 if (len > 0) strncpy(dirname, file, len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
72 else if (*file != DIRSLASH) { *dirname = '.'; len = 1; }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
73 else { *dirname = DIRSLASH; len = 1; }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
74 dirname[len] = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
75 return dirname;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
76 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
77
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
78
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
79 /* Function: FileTail()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
80 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
81 * Purpose: Return everything after the DIRSLASH:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
82 * "/foo/bar/baz.1" -> "baz.1"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
83 * "foo/bar" -> "bar"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
84 * "foo" -> "foo"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
85 * "/" -> ""
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
86 * If noextension is TRUE, removes a trailing ".foo" extension
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
87 * too.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
88 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
89 * Args: file - name of file "/foo/bar/baz.1"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
90 * noextension - TRUE to also remove extensions
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
91 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
92 * Return: ptr to malloc'ed string "baz.1"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
93 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
94 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
95 FileTail(char *file, int noextension)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
96 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
97 char *tail;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
98 char *lastslash;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
99 char *lastdot;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
100 /* remove directory prefix */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
101 lastslash = strrchr(file, DIRSLASH);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
102 tail = (char *) MallocOrDie (sizeof(char) * (strlen(file)+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
103 if (lastslash == NULL) strcpy(tail, file);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
104 else strcpy(tail, lastslash+1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
105 /* remove trailing suffix */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
106 if (noextension) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
107 if ((lastdot = strrchr(tail, '.')) != NULL)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
108 *lastdot = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
109 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
110
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
111 return tail;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
112 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
113
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
114
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
115 /* Function: FileSameDirectory()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
116 * Date: SRE, Wed Mar 6 20:03:23 2002 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
117 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
118 * Purpose: Given a path to one file, and the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
119 * name of another file in the same directory,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
120 * concat the path from file1 onto file2, and
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
121 * return the result. Caller must free the ptr
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
122 * that's returned.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
123 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
124 * Written for SSI - SSI indices contain filenames
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
125 * without paths, and we will need to convert that
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
126 * to a full path.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
127 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
128 * Args: file1 - a path to a file, e.g. "/foo/bar/baz.1"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
129 * file2 - a simple filename, e.g. "quux.2"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
130 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
131 * Returns: path to file2: e.g. "/foo/bar/quux.2"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
132 * Returns NULL if file2 already has a path, and the result
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
133 * would be a different place.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
134 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
135 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
136 FileSameDirectory(char *file1, char *file2)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
137 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
138 char *path;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
139 char *tail;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
140 char *result;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
141 int seems_ok = 1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
142
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
143 path = FileDirname(file1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
144 tail = FileTail(file2, FALSE);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
145 if (strcmp(file2, tail) != 0) seems_ok = 0; /* ut-oh, file2 *had* a path */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
146 result = FileConcat(path, tail);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
147 if (! seems_ok && strcmp(result, file2) != 0) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
148 free(result); result = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
149 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
150 free(path);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
151 free(tail);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
152 return result;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
153 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
154
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
155 /* Function: FileConcat()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
156 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
157 * Purpose: Concatenate a directory path and a file name,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
158 * returning a pointer to a malloc'ed string with the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
159 * full filename. This isn't just a string concat,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
160 * because we're careful about the dir slash.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
161 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
162 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
163 FileConcat(char *dir, char *file)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
164 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
165 char *full;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
166
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
167 full = (char *) MallocOrDie (sizeof(char) * (strlen(dir)+strlen(file)+2));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
168 if (*file == DIRSLASH) strcpy(full, file); /* file = "/foo", ignore directory. */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
169 else sprintf(full, "%s%c%s", dir, DIRSLASH, file);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
170 return full;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
171 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
172
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
173
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
174 /* Function: FileAddSuffix()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
175 * Date: SRE, Wed Aug 1 11:19:33 2001 [Pasadena]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
176 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
177 * Purpose: Add a suffix to a filename, return a malloc'ed
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
178 * string containing the new filename.sfx name.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
179 * Example:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
180 * FileAddSuffix("genbank", "ssi")
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
181 * returns "genbank.ssi".
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
182 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
183 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
184 FileAddSuffix(char *filename, char *sfx)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
185 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
186 char *new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
187 new = MallocOrDie(strlen(filename) + strlen(sfx) + 2);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
188 sprintf(new, "%s.%s", filename, sfx);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
189 return new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
190 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
191
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
192 /* Function: EnvFileOpen()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
193 * Date: Sun Feb 12 10:55:29 1995
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
194 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
195 * Purpose: Open a file, given a file name and an environment
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
196 * variable that contains a directory path. Files
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
197 * are opened read-only. Does not look at current directory
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
198 * unless "." is explicitly in the path specified by env.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
199 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
200 * For instance:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
201 * fp = EnvFileOpen("BLOSUM45", "BLASTMAT", NULL);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
202 * or:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
203 * fp = EnvFileOpen("swiss", "BLASTDB", NULL);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
204 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
205 * Environment variables may contain a colon-delimited
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
206 * list of more than one path; e.g.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
207 * setenv BLASTDB /nfs/databases/foo:/nfs/databases/bar
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
208 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
209 * Sometimes a group of files may be found in
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
210 * one directory; for instance, an index file with a
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
211 * database. The caller can EnvFileOpen() the main
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
212 * file, and ask to get the name of the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
213 * directory back in ret_dir, so it can construct
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
214 * the other auxiliary file names and fopen() them. (If it called
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
215 * EnvFileOpen(), it might get confused by
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
216 * file name clashes and open files in different
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
217 * directories.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
218 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
219 * Args: fname - name of file to open
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
220 * env - name of environment variable containing path
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
221 * ret_dir - if non-NULL, RETURN: name of dir that was used.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
222 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
223 * Return: FILE * to open file, or NULL on failure -- same as fopen()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
224 * Caller must free ret_dir if it passed a non-NULL address.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
225 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
226 FILE *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
227 EnvFileOpen(char *fname, char *env, char **ret_dir)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
228 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
229 FILE *fp;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
230 char *path;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
231 char *s; /* ptr to indiv element in env list */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
232 char full[1024]; /* constructed file name */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
233
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
234 if (env == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
235 if ((path = Strdup(getenv(env))) == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
236
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
237 fp = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
238 s = strtok(path, ":");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
239 while (s != NULL)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
240 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
241 if (((int) strlen(fname) + (int) strlen(s) + 2) > 1024)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
242 { free(path); return NULL; }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
243 sprintf(full, "%s%c%s", s, DIRSLASH, fname);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
244 if ((fp = fopen(full, "r")) != NULL) break;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
245 s = strtok(NULL, ":");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
246 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
247
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
248 /* Return the path we used, if caller wants it
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
249 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
250 if (ret_dir != NULL) *ret_dir = Strdup(s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
251 free(path);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
252
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
253 return fp;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
254 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
255
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
256
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
257 /* Function: FileExists()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
258 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
259 * Purpose: Return TRUE if filename exists.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
260 * Testing fopen() is the only possible platform-independent test
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
261 * I'm aware of.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
262 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
263 int
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
264 FileExists(char *filename)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
265 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
266 FILE *fp;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
267 if ((fp = fopen(filename, "r"))) { fclose(fp); return TRUE; }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
268 return FALSE;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
269 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
270
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
271