Mercurial > molko
annotate src/libmlk-core/core/sys.c @ 369:1e06f871dc63
core: split action and action_stack
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 24 Oct 2021 17:33:12 +0200 |
parents | 74f9cb70fc5d |
children | 8ac282bd5935 |
rev | line source |
---|---|
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * sys.c -- system routines |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
314 | 4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr> |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
301
f04b4ee04db3
make: switch to GNU make
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
19 #include "config.h" |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
20 |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
21 #include <sys/stat.h> |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
22 #include <assert.h> |
56
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
23 #include <stdio.h> |
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
24 #include <stdlib.h> |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
25 #include <limits.h> |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
26 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
27 #if defined(_WIN32) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
28 # include <shlwapi.h> |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
29 # include <windows.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
30 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
31 # include <errno.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
32 # include <string.h> |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
33 #endif |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
34 |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include <SDL.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include <SDL_image.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 #include <SDL_mixer.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 #include <SDL_ttf.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
315
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
40 #include <port/port.h> |
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
41 |
39
9d1421c09dfb
core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents:
36
diff
changeset
|
42 #include "error.h" |
204
c9fbb822d269
core: allocate sound channels at startup
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
43 #include "sound.h" |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 #include "sys.h" |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
46 static struct { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
47 char organization[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
48 char name[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
49 } info = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
50 .organization = "fr.malikania", |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
51 .name = "molko" |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
52 }; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
53 |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
54 static struct { |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
55 char bindir[PATH_MAX]; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
56 char datadir[PATH_MAX]; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
57 char localedir[PATH_MAX]; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
58 } paths; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
59 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
60 static inline char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
61 normalize(char *str) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
62 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
63 for (char *p = str; *p; ++p) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
64 if (*p == '\\') |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
65 *p = '/'; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
66 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
67 return str; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
68 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
69 |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
70 static inline int |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
71 absolute(const char *path) |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
72 { |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
73 #if defined(_WIN32) |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
74 return !PathIsRelativeA(path); |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
75 #else |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
76 /* Assuming UNIX like. */ |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
77 if (path[0] == '/') |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
78 return 1; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
79 |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
80 return 0; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
81 #endif |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
82 } |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
83 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
84 static const char * |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
85 system_directory(const char *whichdir) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
86 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
87 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
88 static char ret[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
89 char *base, *binsect; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
90 |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
91 /* |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
92 * Some system does not provide support (shame on you OpenBSD) |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
93 * to the executable path. In that case we use PREFIX+<dir> |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
94 * instead unless <dir> is already absolute. |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
95 */ |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
96 |
367
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
97 /* |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
98 * If requested directory is absolute return immediately. |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
99 * |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
100 * e.g. whichdir == /usr/share -> return immediately |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
101 * whichdir == bin -> will be computed |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
102 */ |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
103 if (absolute(whichdir)) |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
104 return whichdir; |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
105 |
367
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
106 /* |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
107 * If MLK_BINDIR is absolute then we're unable to compute whichdir which |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
108 * now is mandatory relative. In that case return its whole path to the |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
109 * prefix. |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
110 */ |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
111 if (absolute(MLK_BINDIR) || !(base = SDL_GetBasePath())) |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
112 snprintf(ret, sizeof (ret), "%s/%s", MLK_PREFIX, whichdir); |
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
113 else { |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
114 /* |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
115 * Decompose the path to the given special directory by |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
116 * computing relative directory to it from where the |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
117 * binary is located. |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
118 * |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
119 * Example: |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
120 * |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
121 * PREFIX/bin/<executable> |
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
122 * PREFIX/share/mysupergame |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
123 * |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
124 * The path to the data is ../share/mysupergame starting from |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
125 * the binary. |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
126 * |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
127 * Put the base path into the path and remove the value |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
128 * of MLK_BINDIR. |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
129 * |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
130 * Example: |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
131 * from: /usr/local/bin |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
132 * to: /usr/local |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
133 */ |
367
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
134 printf("base=%s\n", base); |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
135 port_strlcpy(path, base, sizeof (path)); |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
136 SDL_free(base); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
137 |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
138 /* TODO: remove using negative offset. */ |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
139 if ((binsect = strstr(path, MLK_BINDIR))) |
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
140 *binsect = '\0'; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
141 |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
142 snprintf(ret, sizeof (ret), "%s%s", path, whichdir); |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
143 } |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
144 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
145 return normalize(ret); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
146 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
147 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
148 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
149 user_directory(enum sys_dir kind) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
150 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
151 /* Kept for future use. */ |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
152 (void)kind; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
153 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
154 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
155 char *pref; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
156 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
157 if ((pref = SDL_GetPrefPath(info.organization, info.name))) { |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
158 port_strlcpy(path, pref, sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
159 SDL_free(pref); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
160 } else |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
161 port_strlcpy(path, "./", sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
162 |
279
5217c195c5b9
core: forgot to return the path
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
163 return path; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
164 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
165 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
166 static inline int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
167 mkpath(const char *path) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
168 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
169 #ifdef _WIN32 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
170 /* TODO: add error using the convenient FormatMessage function. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
171 if (!CreateDirectoryA(path, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
172 return errorf("unable to create directory: %s", path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
173 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
174 if (mkdir(path, 0755) < 0 && errno != EEXIST) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
175 return errorf("%s", strerror(errno)); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
176 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
177 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
178 return 0; |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
179 } |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
180 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
181 int |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
182 sys_init(const char *organization, const char *name) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
183 { |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
184 #if defined(__MINGW64__) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
185 /* On MinGW buffering leads to painful debugging. */ |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
186 setbuf(stderr, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
187 setbuf(stdout, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
188 #endif |
367
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
189 port_strlcpy(paths.bindir, system_directory(MLK_BINDIR), sizeof (paths.bindir)); |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
190 port_strlcpy(paths.datadir, system_directory(MLK_DATADIR), sizeof (paths.datadir)); |
74f9cb70fc5d
core: no longer care about in-source data
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
191 port_strlcpy(paths.localedir, system_directory(MLK_LOCALEDIR), sizeof (paths.localedir)); |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
192 |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
193 port_strlcpy(info.organization, organization, sizeof (info.organization)); |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
194 port_strlcpy(info.name, name, sizeof (info.name)); |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
195 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
196 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
197 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
198 if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
199 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
200 if (TTF_Init() < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
201 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
202 if (Mix_Init(MIX_INIT_OGG) != MIX_INIT_OGG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
203 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
204 if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
205 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
206 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
207 Mix_AllocateChannels(SOUND_CHANNELS_MAX); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
208 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
209 return 0; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
210 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
211 |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
212 const char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
213 sys_dir(enum sys_dir kind) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
214 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
215 switch (kind) { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
216 case SYS_DIR_BIN: |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
217 return paths.bindir; |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
218 case SYS_DIR_DATA: |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
219 return paths.datadir; |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
220 case SYS_DIR_LOCALE: |
320
8f9937403749
misc: improve loading of data
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
221 return paths.localedir; |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
222 default: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
223 return user_directory(kind); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
224 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
225 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
226 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
227 int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
228 sys_mkdir(const char *directory) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
229 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
230 char path[PATH_MAX], *p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
231 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
232 /* Copy the directory to normalize and iterate over '/'. */ |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
233 port_strlcpy(path, directory, sizeof (path)); |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
234 normalize(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
235 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
236 #if defined(_WIN32) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
237 /* Remove drive letter that we don't need. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
238 if ((p = strchr(path, ':'))) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
239 ++p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
240 else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
241 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
242 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
243 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
244 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
245 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
246 for (p = p + 1; *p; ++p) { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
247 if (*p == '/') { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
248 *p = 0; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
249 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
250 if (mkpath(path) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
251 return -1; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
252 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
253 *p = '/'; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
254 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
255 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
256 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
257 return mkpath(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
258 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
259 |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 void |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
87
diff
changeset
|
261 sys_finish(void) |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 { |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 Mix_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 TTF_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 IMG_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 SDL_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 } |