Mercurial > molko
annotate libmlk-core/core/sys.c @ 307:363024b76da7
make: create install-data rather than fakeroot
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 29 Jun 2021 09:49:48 +0200 |
parents | f04b4ee04db3 |
children | 0858e33a762d |
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 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
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 |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
21 #include <assert.h> |
56
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
22 #include <stdio.h> |
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
23 #include <stdlib.h> |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
24 #include <limits.h> |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
25 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
26 #if defined(_WIN32) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
27 # include <shlwapi.h> |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
28 # include <windows.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
29 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
30 # include <sys/stat.h> |
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 |
39
9d1421c09dfb
core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents:
36
diff
changeset
|
40 #include "error.h" |
204
c9fbb822d269
core: allocate sound channels at startup
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
41 #include "sound.h" |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 #include "sys.h" |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
44 static struct { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
45 char organization[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
46 char name[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
47 } info = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
48 .organization = "fr.malikania", |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
49 .name = "molko" |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
50 }; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
51 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
52 static const char *paths[] = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
53 [SYS_DIR_BIN] = MOLKO_BINDIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
54 [SYS_DIR_DATA] = MOLKO_DATADIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
55 [SYS_DIR_LOCALE] = MOLKO_LOCALEDIR |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
56 }; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
57 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
58 static inline char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
59 normalize(char *str) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
60 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
61 for (char *p = str; *p; ++p) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
62 if (*p == '\\') |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
63 *p = '/'; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
64 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
65 return str; |
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 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
68 static inline const char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
69 absolute(const char *which) |
31 | 70 { |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
71 static char path[PATH_MAX]; |
31 | 72 |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
73 strlcpy(path, which, sizeof (path)); |
31 | 74 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
75 return normalize(path); |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
76 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
77 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
78 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
79 system_directory(enum sys_dir kind) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
80 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
81 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
82 static char ret[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
83 char *base, *binsect; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
84 |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
85 if ((base = getenv("MLK_ROOT"))) { |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
86 snprintf(ret, sizeof (ret), "%s/%s/%s", base, MOLKO_PREFIX, paths[kind]); |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
87 } else { |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
88 /* |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
89 * Some system does not provide support (shame on you OpenBSD) |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
90 * to the executable path. In that case we use PREFIX+<dir> |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
91 * instead. |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
92 */ |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
93 if (!(base = SDL_GetBasePath())) |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
94 snprintf(ret, sizeof (ret), "%s/%s", MOLKO_PREFIX, paths[kind]); |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
95 else { |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
96 /* |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
97 * Decompose the path to the given special directory by |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
98 * computing relative directory to it from where the |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
99 * binary is located. |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
100 * |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
101 * Example: |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
102 * |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
103 * PREFIX/bin/mlk |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
104 * PREFIX/share/mlk-adventure |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
105 * |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
106 * The path to the data is ../share/molko starting from |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
107 * the binary. |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
108 * |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
109 * Put the base path into the path and remove the value |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
110 * of MOLKO_BINDIR. |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
111 * |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
112 * Example: |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
113 * from: /usr/local/bin |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
114 * to: /usr/local |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
115 */ |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
116 strlcpy(path, base, sizeof (path)); |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
117 SDL_free(base); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
118 |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
119 if ((binsect = strstr(path, paths[SYS_DIR_BIN]))) |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
120 *binsect = '\0'; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
121 |
307
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
122 snprintf(ret, sizeof (ret), "%s%s", path, paths[kind]); |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
123 } |
363024b76da7
make: create install-data rather than fakeroot
David Demelier <markand@malikania.fr>
parents:
301
diff
changeset
|
124 } |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
125 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
126 return normalize(ret); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
127 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
128 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
129 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
130 user_directory(enum sys_dir kind) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
131 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
132 /* Kept for future use. */ |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
133 (void)kind; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
134 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
135 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
136 char *pref; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
137 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
138 if ((pref = SDL_GetPrefPath(info.organization, info.name))) { |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
139 strlcpy(path, pref, sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
140 SDL_free(pref); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
141 } else |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
142 strlcpy(path, "./", sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
143 |
279
5217c195c5b9
core: forgot to return the path
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
144 return path; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
145 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
146 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
147 static inline int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
148 mkpath(const char *path) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
149 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
150 #ifdef _WIN32 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
151 /* TODO: add error using the convenient FormatMessage function. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
152 if (!CreateDirectoryA(path, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
153 return errorf("unable to create directory: %s", path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
154 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
155 if (mkdir(path, 0755) < 0 && errno != EEXIST) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
156 return errorf("%s", strerror(errno)); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
157 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
158 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
159 return 0; |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
160 } |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
161 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
162 int |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
163 sys_init(const char *organization, const char *name) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
164 { |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
165 #if defined(__MINGW64__) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
166 /* On MinGW buffering leads to painful debugging. */ |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
167 setbuf(stderr, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
168 setbuf(stdout, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
169 #endif |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
170 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
171 strlcpy(info.organization, organization, sizeof (info.organization)); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
172 strlcpy(info.name, name, sizeof (info.name)); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
173 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
174 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
|
175 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
176 if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
177 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
178 if (TTF_Init() < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
179 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
180 if (Mix_Init(MIX_INIT_OGG) != MIX_INIT_OGG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
181 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
182 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
|
183 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
184 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
185 Mix_AllocateChannels(SOUND_CHANNELS_MAX); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
186 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
187 return 0; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
188 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
189 |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
190 const char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
191 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
|
192 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
193 switch (kind) { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
194 case SYS_DIR_BIN: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
195 case SYS_DIR_DATA: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
196 case SYS_DIR_LOCALE: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
197 return system_directory(kind); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
198 default: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
199 return user_directory(kind); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
200 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
201 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
202 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
203 int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
204 sys_mkdir(const char *directory) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
205 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
206 char path[PATH_MAX], *p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
207 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
208 /* Copy the directory to normalize and iterate over '/'. */ |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
209 strlcpy(path, directory, sizeof (path)); |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
210 normalize(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
211 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
212 #if defined(_WIN32) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
213 /* Remove drive letter that we don't need. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
214 if ((p = strchr(path, ':'))) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
215 ++p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
216 else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
217 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
218 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
219 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
220 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
221 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
222 for (p = p + 1; *p; ++p) { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
223 if (*p == '/') { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
224 *p = 0; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
225 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
226 if (mkpath(path) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
227 return -1; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
228 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
229 *p = '/'; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
230 } |
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 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
233 return mkpath(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
234 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
235 |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 void |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
87
diff
changeset
|
237 sys_finish(void) |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 { |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 Mix_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 TTF_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 IMG_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 SDL_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 } |