Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from DynamicPath. */
2 : : /* DynamicPath.mod implements a path for DynamicStrings.
3 : :
4 : : Copyright (C) 2001-2024 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : Under Section 7 of GPL version 3, you are granted additional
20 : : permissions described in the GCC Runtime Library Exception, version
21 : : 3.1, as published by the Free Software Foundation.
22 : :
23 : : You should have received a copy of the GNU General Public License and
24 : : a copy of the GCC Runtime Library Exception along with this program;
25 : : see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
26 : : <http://www.gnu.org/licenses/>. */
27 : :
28 : : #include "config.h"
29 : : #include "system.h"
30 : : #include <stdbool.h>
31 : : # if !defined (PROC_D)
32 : : # define PROC_D
33 : : typedef void (*PROC_t) (void);
34 : : typedef struct { PROC_t proc; } PROC;
35 : : # endif
36 : :
37 : : # if !defined (FALSE)
38 : : # define FALSE (1==0)
39 : : # endif
40 : :
41 : : # include "GStorage.h"
42 : : #if defined(__cplusplus)
43 : : # undef NULL
44 : : # define NULL 0
45 : : #endif
46 : : #define _DynamicPath_C
47 : :
48 : : #include "GDynamicPath.h"
49 : : # include "GStorage.h"
50 : : # include "GDynamicStrings.h"
51 : : # include "GSFIO.h"
52 : : # include "GFIO.h"
53 : : # include "GM2Printf.h"
54 : :
55 : : # define Directory '/'
56 : : # define Debugging false
57 : : typedef struct DynamicPath__T1_r DynamicPath__T1;
58 : :
59 : : typedef DynamicPath__T1 *DynamicPath_PathList__opaque;
60 : :
61 : : struct DynamicPath__T1_r {
62 : : DynamicPath_PathList__opaque tail;
63 : : DynamicPath_PathList__opaque next;
64 : : DynamicStrings_String entry;
65 : : };
66 : :
67 : : static DynamicPath_PathList__opaque FreeList;
68 : :
69 : : /*
70 : : InitPathList - creates a new empty path list.
71 : : It takes a copy of the string.
72 : : */
73 : :
74 : : extern "C" DynamicPath_PathList DynamicPath_InitPathList (DynamicStrings_String str);
75 : :
76 : : /*
77 : : KillPathList - places list pl onto the freelist.
78 : : Postcondition: pl will be NIL.
79 : : */
80 : :
81 : : extern "C" void DynamicPath_KillPathList (DynamicPath_PathList *pl);
82 : :
83 : : /*
84 : : Cons - appends str to the end of a path list.
85 : : If pl is NIL a new list is created and returned
86 : : containing str.
87 : : */
88 : :
89 : : extern "C" DynamicPath_PathList DynamicPath_Cons (DynamicPath_PathList pl, DynamicStrings_String str);
90 : :
91 : : /*
92 : : ConsList - concatenates path list left and right together.
93 : : */
94 : :
95 : : extern "C" DynamicPath_PathList DynamicPath_ConsList (DynamicPath_PathList left, DynamicPath_PathList right);
96 : :
97 : : /*
98 : : Stash - returns pl before setting pl to NIL.
99 : : */
100 : :
101 : : extern "C" DynamicPath_PathList DynamicPath_Stash (DynamicPath_PathList *pl);
102 : :
103 : : /*
104 : : FindFileName - returns NIL if a file cannot be found otherwise
105 : : it returns the path including the filename.
106 : : */
107 : :
108 : : extern "C" DynamicStrings_String DynamicPath_FindFileName (DynamicStrings_String filename, DynamicPath_PathList pl);
109 : :
110 : : /*
111 : : DumpPath - debugging dump of the pathlist.
112 : : */
113 : :
114 : : extern "C" void DynamicPath_DumpPath (DynamicStrings_String name, DynamicPath_PathList pl);
115 : :
116 : : /*
117 : : AddDir - if str is not empty and does not end with / then add
118 : : a directory.
119 : : Postcondition: str is returned (with a '/' at the end)
120 : : or is empty.
121 : : */
122 : :
123 : : static DynamicStrings_String AddDir (DynamicStrings_String str);
124 : :
125 : :
126 : : /*
127 : : AddDir - if str is not empty and does not end with / then add
128 : : a directory.
129 : : Postcondition: str is returned (with a '/' at the end)
130 : : or is empty.
131 : : */
132 : :
133 : 1314481 : static DynamicStrings_String AddDir (DynamicStrings_String str)
134 : : {
135 : 1314481 : if ((DynamicStrings_Length (str)) > 0)
136 : : {
137 : 1314481 : if ((DynamicStrings_char (str, -1)) != Directory)
138 : : {
139 : 1290773 : str = DynamicStrings_ConCatChar (str, Directory);
140 : : }
141 : : }
142 : 1314481 : return str;
143 : : /* static analysis guarentees a RETURN statement will be used before here. */
144 : : __builtin_unreachable ();
145 : : }
146 : :
147 : :
148 : : /*
149 : : InitPathList - creates a new empty path list.
150 : : It takes a copy of the string.
151 : : */
152 : :
153 : 232986 : extern "C" DynamicPath_PathList DynamicPath_InitPathList (DynamicStrings_String str)
154 : : {
155 : 232986 : DynamicPath_PathList__opaque pl;
156 : :
157 : 232986 : Storage_ALLOCATE ((void **) &pl, sizeof (DynamicPath__T1));
158 : 232986 : pl->tail = pl;
159 : 232986 : pl->next = static_cast<DynamicPath_PathList__opaque> (NULL);
160 : 232986 : pl->entry = DynamicStrings_Dup (str);
161 : 232986 : return static_cast<DynamicPath_PathList> (pl);
162 : : /* static analysis guarentees a RETURN statement will be used before here. */
163 : : __builtin_unreachable ();
164 : : }
165 : :
166 : :
167 : : /*
168 : : KillPathList - places list pl onto the freelist.
169 : : Postcondition: pl will be NIL.
170 : : */
171 : :
172 : 0 : extern "C" void DynamicPath_KillPathList (DynamicPath_PathList *pl)
173 : : {
174 : 0 : if ((*pl) != NULL)
175 : : {
176 : 0 : static_cast<DynamicPath_PathList__opaque> ((*pl))->tail->next = FreeList;
177 : 0 : FreeList = static_cast<DynamicPath_PathList__opaque> ((*pl));
178 : 0 : (*pl) = static_cast<DynamicPath_PathList> (NULL);
179 : : }
180 : 0 : }
181 : :
182 : :
183 : : /*
184 : : Cons - appends str to the end of a path list.
185 : : If pl is NIL a new list is created and returned
186 : : containing str.
187 : : */
188 : :
189 : 104377 : extern "C" DynamicPath_PathList DynamicPath_Cons (DynamicPath_PathList pl, DynamicStrings_String str)
190 : : {
191 : 104377 : if (pl == NULL)
192 : : {
193 : 0 : pl = DynamicPath_InitPathList (str);
194 : : }
195 : : else
196 : : {
197 : 104377 : pl = DynamicPath_ConsList (pl, DynamicPath_InitPathList (str));
198 : : }
199 : 104377 : return pl;
200 : : /* static analysis guarentees a RETURN statement will be used before here. */
201 : : __builtin_unreachable ();
202 : : }
203 : :
204 : :
205 : : /*
206 : : ConsList - concatenates path list left and right together.
207 : : */
208 : :
209 : 104377 : extern "C" DynamicPath_PathList DynamicPath_ConsList (DynamicPath_PathList left, DynamicPath_PathList right)
210 : : {
211 : 104377 : if (right != NULL)
212 : : {
213 : 104377 : static_cast<DynamicPath_PathList__opaque> (left)->tail->next = static_cast<DynamicPath_PathList__opaque> (right);
214 : 104377 : static_cast<DynamicPath_PathList__opaque> (left)->tail = static_cast<DynamicPath_PathList__opaque> (right)->tail;
215 : : }
216 : 104377 : return left;
217 : : /* static analysis guarentees a RETURN statement will be used before here. */
218 : : __builtin_unreachable ();
219 : : }
220 : :
221 : :
222 : : /*
223 : : Stash - returns pl before setting pl to NIL.
224 : : */
225 : :
226 : 0 : extern "C" DynamicPath_PathList DynamicPath_Stash (DynamicPath_PathList *pl)
227 : : {
228 : 0 : DynamicPath_PathList__opaque old;
229 : :
230 : 0 : old = static_cast<DynamicPath_PathList__opaque> ((*pl));
231 : 0 : (*pl) = static_cast<DynamicPath_PathList> (NULL);
232 : 0 : return static_cast<DynamicPath_PathList> (old);
233 : : /* static analysis guarentees a RETURN statement will be used before here. */
234 : : __builtin_unreachable ();
235 : : }
236 : :
237 : :
238 : : /*
239 : : FindFileName - returns NIL if a file cannot be found otherwise
240 : : it returns the path including the filename.
241 : : */
242 : :
243 : 673841 : extern "C" DynamicStrings_String DynamicPath_FindFileName (DynamicStrings_String filename, DynamicPath_PathList pl)
244 : : {
245 : 673841 : DynamicStrings_String s;
246 : :
247 : 1823452 : while (pl != NULL)
248 : : {
249 : 1314481 : s = DynamicStrings_ConCat (AddDir (DynamicStrings_Dup (static_cast<DynamicPath_PathList__opaque> (pl)->entry)), DynamicStrings_Dup (filename));
250 : 1314481 : if (Debugging)
251 : : {
252 : : M2Printf_fprintf1 (FIO_StdErr, (const char *) "testing for %s: ", 16, (const unsigned char *) &s, (sizeof (s)-1));
253 : : }
254 : 1314481 : if (SFIO_Exists (s))
255 : : {
256 : : if (Debugging)
257 : : {
258 : : M2Printf_fprintf0 (FIO_StdErr, (const char *) "yes\\n", 5);
259 : : }
260 : : return s;
261 : : }
262 : 1149611 : if (Debugging)
263 : : {
264 : : M2Printf_fprintf0 (FIO_StdErr, (const char *) "no\\n", 4);
265 : : }
266 : 1149611 : s = DynamicStrings_KillString (s);
267 : 1149611 : pl = static_cast<DynamicPath_PathList> (static_cast<DynamicPath_PathList__opaque> (pl)->next);
268 : : }
269 : : if (Debugging)
270 : : {
271 : : M2Printf_fprintf1 (FIO_StdErr, (const char *) "FindFileName did not find: %s in path\\n", 39, (const unsigned char *) &filename, (sizeof (filename)-1));
272 : : }
273 : : return static_cast<DynamicStrings_String> (NULL);
274 : : /* static analysis guarentees a RETURN statement will be used before here. */
275 : : __builtin_unreachable ();
276 : : }
277 : :
278 : :
279 : : /*
280 : : DumpPath - debugging dump of the pathlist.
281 : : */
282 : :
283 : 0 : extern "C" void DynamicPath_DumpPath (DynamicStrings_String name, DynamicPath_PathList pl)
284 : : {
285 : 0 : M2Printf_fprintf1 (FIO_StdErr, (const char *) "%s:", 3, (const unsigned char *) &name, (sizeof (name)-1));
286 : 0 : while (pl != NULL)
287 : : {
288 : 0 : M2Printf_fprintf0 (FIO_StdErr, (const char *) " {", 2);
289 : 0 : M2Printf_fprintf1 (FIO_StdErr, (const char *) "%s", 2, (const unsigned char *) &static_cast<DynamicPath_PathList__opaque> (pl)->entry, (sizeof (static_cast<DynamicPath_PathList__opaque> (pl)->entry)-1));
290 : 0 : M2Printf_fprintf0 (FIO_StdErr, (const char *) "}", 1);
291 : 0 : pl = static_cast<DynamicPath_PathList> (static_cast<DynamicPath_PathList__opaque> (pl)->next);
292 : : }
293 : 0 : M2Printf_fprintf0 (FIO_StdErr, (const char *) "\\n", 2);
294 : 0 : }
295 : :
296 : 14232 : extern "C" void _M2_DynamicPath_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
297 : : {
298 : 14232 : FreeList = static_cast<DynamicPath_PathList__opaque> (NULL);
299 : 14232 : }
300 : :
301 : 0 : extern "C" void _M2_DynamicPath_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
302 : : {
303 : 0 : }
|