"Fossies" - the Fresh Open Source Software Archive 
Member "libtimidity-0.2.7/src/common.c" (17 Mar 2021, 3665 Bytes) of package /linux/privat/libtimidity-0.2.7.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 /* libTiMidity is licensed under the terms of the GNU Lesser General
2 * Public License: see COPYING for details.
3 *
4 * Note that the included TiMidity source, based on timidity-0.2i, was
5 * originally licensed under the GPL, but the author extended it so it
6 * can also be used separately under the GNU LGPL or the Perl Artistic
7 * License: see the notice by Tuukka Toivonen as it appears on the web
8 * at http://ieee.uwaterloo.ca/sca/www.cgs.fi/tt/timidity/ .
9 */
10
11 /*
12 * TiMidity -- Experimental MIDI to WAVE converter
13 * Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or (at
18 * your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23 *
24 * See the GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License along
27 * with this program; if not, write to the Free Software Foundation, Inc.,
28 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 */
30
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34
35 #ifdef HAVE_SYS_PARAM_H
36 #include <sys/param.h>
37 #endif
38
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42
43 /* I guess "rb" should be right for any libc */
44 #define OPEN_MODE "rb"
45
46 #include "timidity_internal.h"
47 #include "common.h"
48 #include "ospaths.h"
49
50 /* The paths in this list will be tried by timi_openfile() */
51 struct _PathList {
52 char *path;
53 struct _PathList *next;
54 };
55
56 static PathList *pathlist = NULL;
57
58 /* This is meant to find and open files for reading */
59 FILE *timi_openfile(const char *name)
60 {
61 FILE *fp;
62
63 if (!name || !(*name))
64 {
65 DEBUG_MSG("Attempted to open nameless file.\n");
66 return NULL;
67 }
68
69 /* First try the given name */
70 DEBUG_MSG("Trying to open %s\n", name);
71 if ((fp = fopen(name, OPEN_MODE)) != NULL)
72 return fp;
73
74 if (!is_abspath(name))
75 {
76 char current_filename[TIM_MAXPATH];
77 PathList *plp = pathlist;
78 int l;
79
80 while (plp) { /* Try along the path then */
81 *current_filename = 0;
82 l = strlen(plp->path);
83 if(l)
84 {
85 strcpy(current_filename, plp->path);
86 if (!is_dirsep(current_filename[l - 1]))
87 {
88 current_filename[l] = CHAR_DIRSEP;
89 current_filename[l + 1] = '\0';
90 }
91 }
92 strcat(current_filename, name);
93 DEBUG_MSG("Trying to open %s\n", current_filename);
94 if ((fp = fopen(current_filename, OPEN_MODE)) != NULL)
95 return fp;
96 plp = plp->next;
97 }
98 }
99
100 /* Nothing could be opened. */
101 DEBUG_MSG("Could not open %s\n", name);
102 return NULL;
103 }
104
105 /* This allocates memory and clears it. */
106 void *timi_calloc(size_t count)
107 {
108 void *p = timi_malloc(count);
109 if (p == NULL) {
110 DEBUG_MSG("malloc() failed for %lu bytes.\n", (unsigned long)count);
111 return NULL;
112 }
113 memset(p, 0, count);
114 return p;
115 }
116
117 /* This adds a directory to the path list */
118 int timi_add_pathlist(const char *s, size_t l)
119 {
120 PathList *plp = (PathList *) timi_malloc(sizeof(PathList));
121 if (!plp) return -2;
122 plp->path = (char *) timi_malloc(l + 1);
123 if (!plp->path) {
124 timi_free (plp);
125 return -2;
126 }
127 plp->next = pathlist;
128 pathlist = plp;
129 memcpy(plp->path, s, l);
130 plp->path[l] = 0;
131 return 0;
132 }
133
134 void timi_free_pathlist(void)
135 {
136 PathList *plp = pathlist;
137 PathList *next;
138
139 while (plp) {
140 next = plp->next;
141 timi_free(plp->path);
142 timi_free(plp);
143 plp = next;
144 }
145 pathlist = NULL;
146 }