3 Ann Hell Ex Machina - Music Software
4 Copyright (C) 2003/2005 Angel Ortega <angel@triptico.com>
6 support.c - Miscellaneous support functions
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 http://www.triptico.com
38 static char ** library_path
=NULL
;
39 static int n_library_paths
=0;
41 static char located_file
[2048];
43 /* global debugging flag */
46 /* global tracing flag */
54 * add_to_library_path - Adds a directory path to the search path
55 * @path: the directory path
56 * @strip: flag to strip the upper level
58 * Adds @path to the list of searchable paths for path_fopen(),
59 * optionally stripping the upper level if @strip is set.
60 * The last part of the path is stripped before being stored,
61 * and duplication is avoided.
63 void add_to_library_path(char * path
, int strip
)
68 /* if path starts with ~, pre-prend $HOME */
74 if((home
=getenv("HOME")) == NULL
)
77 if((new=malloc(strlen(home
) + strlen(path
) + 2)) == NULL
)
82 strcat(new, path
+ 1);
92 /* if no directory path remains, abort */
93 if((ptr
=strrchr(path
, '/')) == NULL
)
99 /* strip the filename part */
102 /* now try to find if that path is already stored */
103 for(n
=0;n
< n_library_paths
;n
++)
105 if(strcmp(path
, library_path
[n
]) == 0)
107 /* found; free and return */
113 /* add room for the new path */
115 library_path
=(char **)realloc(library_path
,
116 n_library_paths
* sizeof(char *));
119 library_path
[n_library_paths
- 1]=path
;
124 * path_fopen - Opens a file, optionally searching in a path list
125 * @filename: the file name
126 * @mode: the file mode
128 * Opens a file. If the file is found as is, it's opened;
129 * otherwise, the full list of directory paths maintained by
130 * add_to_library_path() is searched until it's found or the
131 * end of the list is reached. Whenever a file
132 * is successfully opened, its path is also stored.
134 FILE * path_fopen(char * filename
, char * mode
)
140 if((f
=fopen(filename
, mode
)) != NULL
)
142 strncpy(located_file
, filename
, sizeof(located_file
));
143 located_file
[sizeof(located_file
) - 1]='\0';
145 add_to_library_path(filename
, 1);
149 /* couldn't open; try concatenating all stored paths */
150 for(n
=n_library_paths
- 1;n
>= 0;n
--)
152 snprintf(located_file
, sizeof(located_file
), "%s/%s",
153 library_path
[n
], filename
);
154 located_file
[sizeof(located_file
) - 1]='\0';
156 if((f
=fopen(located_file
, mode
)) != NULL
)
158 add_to_library_path(located_file
, 1);
168 * locate_file - Locates a file inside the path
169 * @filename: the file to be located
171 * Locates a file inside the library path maintained by path_fopen()
172 * and add_library_path(). If the file is found, a pointer to a static
173 * buffer containing the real path of the file is returned, or
176 char * locate_file(char * filename
)
180 if((f
=path_fopen(filename
, "r")) == NULL
)
184 return(located_file
);